一:Collection
1- Collection接口,单列数据,定义了存取一组对象的方法的集合。
//collection 公有方法
List<Object> list = new ArrayList<Object>();
List<Integer> list2 = new ArrayList<>();
Collections.addAll(list, "张三",123,12,123);
Collections.addAll(list2, 10,20,3,43,34,12,11);
list.add(211); //添加一个元素
list.remove("张三"); //删除指定元素
list.add(list2);//添加一个集合
System.out.println(list.isEmpty()); //判断是否为空
System.out.println(list.size()); //集合长度
System.out.println(list.contains("张三")); //判断是否存在指定元素
System.out.println(list.containsAll(list2)); //是否包含指定集合所有元素
System.out.println(list2.retainAll(list)); //交集,只保留两个集合中同时存在的
System.out.println(list.equals(list2)); //判断两个集合是否相同
System.out.println(list.hashCode()); //返回哈希值
Object[] a = list2.toArray(); //集合转数组
System.out.println(Arrays.toString(a)); //字符串形式输出数组
list.clear(); //清空集合
2- List:
有序、可重复的
ArrayList:
是数组实现,通过下标查找,遍历速度较快,增加删除速度较慢,线程安全性低。
//ArrayList 独有方法
List<Integer> l = new ArrayList<>();
List<Integer> v = new ArrayList<>();
Collections.addAll(v, 11,22,33,44,55);
Collections.addAll(l, 1,2,3,4,5,6,7,8,9);
l.add(3, 666); //将指定元素添加到指定位置
System.out.println(l);
l.addAll(5, v); //将指定集合添加到指定位置
System.out.println(l.get(5)); //获取指定下标位置的元素
System.out.println(l.indexOf(5)); //查看元素在集合中第一次出现的位置
System.out.println(l.lastIndexOf(3)); //查看元素在集合中最后一次出现的位置
l.remove(3); //根据索引删除集合中元素
l.set(1, 777); //将指定位置的元素设置为指定元素
System.out.println(l.subList(2, l.size())); //指定位置到指定位置的子集合
LinkedList:
是双向链表,增删速度较快,遍历较慢。
//LinkedList 独有方法
LinkedList<Integer> ls = new LinkedList<Integer>();
Collections.addAll(ls, 1,2,3,4,5,6,7,8,9);
ls.addFirst(0);//向集合前面添加一个元素
ls.addLast(0);//向集合的后面添加一个元素
System.out.println(ls);
ls.removeFirst();//删除集合第一个元素
ls.removeLast();//删除集合最后一个元素
System.out.println(ls);
System.out.println(ls.getFirst());//查看第一个元素
System.out.println(ls.getLast());//查看最后一个元素
Vector:
是数组实现,与ArrayList几乎相同,区别为安全性高,效率低
3- Set:
无序、不可重复的
HashSet: ⬇子类
LinkeHashSet:
可以解决无序问题,使其打印顺序与插入顺序相同.
4- 遍历方法:
普通for循环~~~
加强for循环:
要遍历的元素类型 自定义变量名 :要遍历的集合
3.迭代器:
二:Map
1.是双列数据,存储key value对的数据,key不能重复,值可以覆盖.
2.HashMap:
Map的主要实现类,效率高、线程不安全,可以存储null的key和value
方法:
Map 集合名 = new HashMap( ); 创建HashMap
集合名.put(key , value); 通过put注入key值与value值
集合名.putAll(Map n); 将n中的所有Key与value值赋予该HashMap
集合名.get(key); 通过get来获取这个 HashMap 中key对应的value值
集合名.size( ); size 获取 HashMap 长度
集合名.containsKey(key); 判断 HashMap 中是否存在此key
集合名.remove(key); 删除指定key
集合名.KeySet/values( ); 获取 HashMap 中所有key/value
集合名.clear( ); 清空该 HashMap
3.子类:
LinkedHashMap
1.底层与HashMap相同
2.可以解决无序问题,使其打印顺序与插入顺序相同
3.遍厉效率高,添加效率低
4.TreeMap与HashTable:
①. 相对来说不常用
②.TreeMap:底层使用的是红黑树,key不能为空。
③.HashTable:与HashMap基本相同,线程更安全,效率较慢,不可以存储null的key和value。
5:底层原理:
HashMap:
①.JDK7:数组+链表的形式:
底层创建了一个长度为16的数组,当存入超过75%时就会扩容为原来的两倍, 元素存储的位置由key的哈希值决定,存入这个长度为16的数组,如果多个元素存到一起则会以链式的形式存储。
②.JDK8:数组+链式+红黑树的形式:
当向HashMap中添加第一个元素时,才会创建一个长度为16的数组,元素存储的位置由key的哈希值决定,存储超过临界值时就会进行扩容 (存放的位置不能为空,就会扩容为原来数组长度的两倍,并将原数组中的数组拷贝到新数组中),当存储位置已经已经存在数据时就会发生哈希冲撞 (先比较几个数据的key的哈希值是否相等,如果不同则直接添加成功,如果相同就要调用equals进行比较,相同则覆盖,不同则添加成功),形成链表,存储长度大于等于8个时(数组长度要大于等于64)就会形成红黑树。
6:遍厉 Map:
通过 map.keyset ,获取一个 set 集合,这个集合存储的都是 key 值,然后遍历这个 set ,通过 map.get() 遍厉。(遍厉的每一个结果来输出 value)。
Set<String> set = map.keyset();
for(String a : set){
System.out.println("这是key:" + a + "这是value:" + map.get(a));
}
7: