java集合类主要由Collection和Map两个接口派生而出,Collection是List、Set、Queue接口的父接口,Map是HashMap和TreeMap的父接口 集合类和数组不一样,数组即可以放基本类型的值,也可以是对象,而集合里只能放对象。
底层数据结构:ArrayList的底层数据结构是以动态数组的形式实现的
ArrayList集合的常见操作
//产生一个ArrayList集合 public static void a(){ //创建ArrayList集合 //产生一个空集合 List list1=new ArrayList(); //定义一个初始长度为5的集合 List list2=new ArrayList(5); //以list1为副本创建集合 List list3=new ArrayList(list1); //产生一个存放特定类型的集合,泛型 List<String> list4=new ArrayList<String>(); List<Integer>list5=new ArrayList<Integer>(); } //ArrayList集合的常见操作 public static void b(){ List<Integer>list=new ArrayList<Integer>(); //向集合中添加元素 list.add(1); list.add(3); list.add(6); list.add(4); //删除集合中的元素 //删除第二个元素 list.remove(1); //得到集合中的元素 int a= list.get(2); //修改集合中元素的值 list.set(2,44); //获取到集合的长度 int size= list.size(); //查询集合中是否有要查询的元素 boolean b1= list.contains(2); //查询所要查询元素的下标 int a2= list.indexOf(1); } //排序 public static void c(){ List<Integer>list=new ArrayList<>(); list.add(34); list.add(56); list.add(53); list.add(21); list.add(17); list.add(35); list.add(27); System.out.println(list); Collections.sort(list);//升序排列 System.out.println(list); } //探讨ArrayList集合的存放方式,按引用传值 public static void d(){ List<String>list=new ArrayList<String>(); String Str1="a"; list.add(Str1); list.add("b"); list.add("c"); System.out.println(list); Str1="n"; System.out.println(list); }底层数据结构:双向链表结构 1、集合只记录第一个和最后一个 2、每一个元素只记录上一个或下一个 3、元素并不知道自身的具体位置,需要通过遍历来找出 4、插入和删除时只影响上一个和下一个 5、尽量不要使用LinkedList进行遍历和查询,速度比较慢 LinkedList集合的使用
public static void a(){ LinkedList<Integer> list1=new LinkedList<>(); LinkedList<Integer> list2=new LinkedList<>(list1);//复制一个新集合 } public static void b(){ LinkedList<Integer> list=new LinkedList<>(); list.add(33);//添加到最后一个 list.add(45); list.add(31); list.add(1,54);//插入到指定位置 list.addFirst(87);//添加到第一个 list.addLast(51);//添加到最后一个 //删除 list.removeFirst(); list.removeLast(); list.remove(3); list.remove(new Integer((45))); //查询 int v1=list.get(3);//根据索引 int v2=list.getFirst(); int v3=list.getLast(); //修改 list.set(1,24); list.size(); } //ArrayList 查询快 //LinkedList插入删除快 public static void c(){ LinkedList<PersonInfo>list=new LinkedList<>(); PersonInfo pi1=new PersonInfo(1,"张三",23); PersonInfo pi2=new PersonInfo(2,"李四",22); PersonInfo pi3=new PersonInfo(3,"王五",22); PersonInfo pi4=pi3; PersonInfo pi5=new PersonInfo(3,"王五",22); list.add(pi1); list.add(pi2); list.add(pi3); boolean b1=list.contains(pi4); boolean b2=list.contains(pi5); int index1=list.indexOf(pi4); int index2=list.indexOf(pi5); int index3=list.lastIndexOf(pi4); int index4=list.lastIndexOf(pi5); System.out.println(b1); System.out.println(b2); System.out.println(index1+"\t"+index2); System.out.println(index3+"\t"+index4); System.out.println("--------------------------------"); System.out.println(list); Collections.sort(list); System.out.println(list); }vector和ArrayList结构一致,它是线程安全的结果
Set:无序,不重复的集合
1、向HashSet中添加元素时,首先判断是否存在(contains),依据为hashcode和equals,如果不存在添加,否则忽略 2、HashSet中可以插入null值,但是只能插入一个 3、HashSet中的元素是散列形式的,也就是说,并不知道他们的位置,无法获取元素 4、HashSet不能直接排序,需要借助List来排序
//如何产生一个HashSet对象 public static void a(){ Set<String> set1=new HashSet<>(); Set<String>set2=new HashSet<>(set1); } public static void b(){ Set<String>set=new HashSet<>(); set.add("aa"); set.remove("aa"); int size= set.size(); set.clear(); //没有get,remove,set不能通过下标找 boolean b=set.isEmpty();//是否是空集合 for(String s:set){ System.out.println(s+"\t"); } } public static void c(){ Set<PersonInfo>set=new HashSet<>(); PersonInfo pi1=new PersonInfo(1,"张三",23); PersonInfo pi2=new PersonInfo(2,"李四",22); PersonInfo pi3=new PersonInfo(3,"王五",22); PersonInfo pi4=pi3; PersonInfo pi5=new PersonInfo(3,"王五",22); set.add(pi1); set.add(pi2); set.add(pi3); set.add(pi4); set.add(pi5); PersonInfo pi6=new PersonInfo(3,"王五",22); System.out.println(set.size()); boolean b1=set.contains(pi6); System.out.println(b1); List<PersonInfo>list=new ArrayList<PersonInfo>(set); Collections.sort(list); System.out.println(list); } public static void d(){ Set<PersonInfo>set=new HashSet<>(); PersonInfo pi1=new PersonInfo(1,"张三",23); PersonInfo pi2=new PersonInfo(2,"李四",22); set.add(pi1); set.add(pi2); } public static void e(){ Set<PersonInfo>set=new HashSet<>(); try{ PersonInfo pi1=new PersonInfo(null,"张三",23); PersonInfo pi2=new PersonInfo(null,"李四",22); set.add(pi1); set.add(pi2); set.add(null); set.add(null); System.out.println(set.size()); }catch(Exception e){ }1、TreeSet里边存放的内容必须排序(强制排序) 2、TreeSet就是红黑树,小的放左结点大的放右结点 3、TreeSet在存放时就已经进行了判断,如果compareTo方法返回的是0就存在
public static void a(){ TreeSet<String>set1=new TreeSet<>(); TreeSet<String>set2=new TreeSet<>(set1); } public static void b(){ TreeSet<String>set=new TreeSet<>(); set.add("aa"); set.add("bb"); set.add("cc"); // set.remove("aa"); int size=set.size(); //set.clear(); String first=set.first(); System.out.println(first); String last=set.last(); boolean b=set.contains("aa");//判断在集合中是否存在 for(String s:set){ System.out.println(s); } }HashMap:键值对存放方式,将值存放到容器中,每个值都有一个键所对应 值集可以重复,因为值集是一个List 键值不能重复,因为键值是一个Set 如果键集重复,后边的值会将前面的值覆盖掉 进行排序,查找等操作,需将Map转换成Set或者List hashMap可以存放null值,key只能放一个
public static void b(){ Map<String,Object>map=new HashMap<>(); map.put("A",99); map.put("A",56);//覆盖掉旧值 map.put("B",99); map.put(null,89); map.put("C",null); map.put(null,34);//只能放一个null System.out.println(map.values()); System.out.println(map.keySet()); } public static void a(){ Map<String,Object> map=new HashMap<>(); //如何存放东西 map.put("B",89); map.put("A",90); map.put("A",89); //如何获取内容 Object valuel=map.get("A"); //将那个键所对应的值删掉 //map.remove("A"); //获取集合的长度 int size=map.size(); //判断集合是否为空 boolean b=map.isEmpty(); //得到所有的键的集合 Set<String> keys=map.keySet(); //得到所有值的集合 Collection<Object> values=map.values(); //键集不可以重复,值集可以重复 boolean b1=map.containsKey("A");//查看键是否存在 boolean b2=map.containsValue(89);//查看值是否存在 System.out.println(map); }