JAVA基础02-集合-Collection
Collection接口
- 数组有缺点:要求数据类型是单一类型 + 数组一旦创建长度不能变 + 遍历方式单一 + 不适合插入、删除
- 集合里有很多种工具类,都有很严格的继承结构.
1 List接口
有序 + 有整数索引 + 元素可重复 + 可以存储多个null
1.1 ArrayList实现类
1.1.1 ArrayList底层实现
- ArrayList 底层维护了一个Object[ ]
- 在jdk1.6里 , 一旦创建ArrayList,底层立刻分配10个数组的长度
- jdk1.8里为了优化内存,会延迟数组的初始化,并不会第一时间来分配10个空间,而是当你第一次向ArrayList中添加元素时,才开始分配空间.默认容量是10的数组
1.1.2 ArrayList扩容机制
- 最小需求容量大于实际容量时,会触发扩容机制
- ArrayList 每次扩容之后容量都会变为原来的 1.5 倍左右(oldCapacity为偶数就是1.5倍,否则是1.5倍左右)
- 然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量
- 如果新容量大于 MAX_ARRAY_SIZE,比较 minCapacity 和 MAX_ARRAY_SIZE,如果minCapacity大于最大容量,则新容量则为
Integer.MAX_VALUE
,否则,新容量大小则为 MAX_ARRAY_SIZE 即为Integer.MAX_VALUE - 8
1.1.3 ArrayList特点
查询快,增删慢,轻量级;(线程不安全)
1.2 LinkedList实现类
1.2.1 LinkedList底层实现
- 底层维护了一个双向链表结构.空间不连续
- 链表上有两个高效节点:首元素和尾元素
1.2.2 LinkedList特有方法
- void addFirst(E e)
- void addLast(E e)
- E getFirst()
- E getLast()
- E removeFirst()
- E removeLast()
- 。。。
1.2.3 LinkedList特点
增删快,查询慢 (线程不安全)
1.3 List遍历的三种方式
1.3.1 for循环遍历
for (int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
1.3.2 foreach遍历
for (String str:list){
System.out.println(str);
}
1.3.3 用iterator迭代器进行遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next);
}
2 Set接口
元素无序 + 不能重复 + 没有下标 + 只能存一个null
2.1 HashSet实现类
2.1.1 HashSet底层实现
基于HashMap实现的,HashSet底层使用HashMap来保存所有元素
2.1.2 HashSet使用
- set集合给 自定义对象去重
需要同时提供 ,重写的hashCode()和 equals() !!
- 重写hashCode()–因为需要按照对象的属性值来计算hash值,而不是new一次算一个
- 重写equals() --因为需要比较两个对象间的属性值,而不是比较地址值
2.2 LinkedHashSet实现类
2.1.1 LinkedHashSet与HashSet的区别
LinkedHashSet维护着一个运行于所有条目的双重链接列表。存储的数据是有序的
3 Collections工具类
专门用来给Collection提供丰富的功能.类似数组里的工具类Arrays.
- Collections.addAll(Collection c, T… elements) 将所有指定元素添加到指定 collection 中。
- Collections.copy(List<? super T> dest, List src) 将所有元素从一个列表复制到另一个列表。
- Collections.max(Collection<? extends T> coll)
- Collections.min(Collection<? extends T> coll)
- Collections.reverse(List<?> list) 反转指定列表中元素的顺序。
- Collections.swap(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。
- Collections.sort(List list) 排序