Collection集合
一、List子类
List 有序,可重复;新增了一些根据索引操作的方法
遍历方式:
for-each循环遍历
普通for循环遍历
迭代器遍历
1.常用方法
创建集合
泛型: 增强程序的稳定性与可读性;强制检测数据的类型
使用: 在类型的后面添加<类型>
//规定当前集合对象中存储的所有数据的类型为String
List<String> list = new ArrayList<>();
添加数据
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
在指定索引位置添加数据
add(int index,E e);
list.add(2,"田七");
用指定的元素替换此列表中指定位置的元素(可选操作)
E set(int index, E element)
System.out.println(list.set(2,"田七星"));
返回此列表中指定位置的元素
E get(int index)
list.get(0);
2.循环遍历
定义一个集合,存储你喜欢的漫威英雄人物,如果存在灭霸,添加一个惊奇队长
创建一个集合,并添加数据
List<String> list = new ArrayList<>();
list.add("美国队长");
list.add("钢铁侠");
list.add("浩克");
list.add("灭霸");
list.add("蜘蛛侠");
1)使用普通for循环遍历
if(list.contains("灭霸")){
list.add("惊奇队长");
}
System.out.println(list);
2)迭代器
ListIterator<E> listIterator()
//1)获取列表迭代器对象
ListIterator<String> it2 = list.listIterator();
//2)判断是否存在下一个或者上一个元素
while(it2.hasNext()){
if("灭霸".equals(it2.next())){
it2.add("惊奇队长");
}
}
//System.out.println(list);
3)for-each
List<String> list02 = new ArrayList<>();
for (String str: list01) {
if ("灭霸".equals(str)) {
list02.add("惊奇队长");
}
}
二、ArrayList
ArrayList 是List接口的实现类
特点: 有序 可重复
ArrayList :
底层结构: 可变数组
优点: 根据索引查询效率高,访问速度快
缺点: 增删涉及到数组的拷贝问题等效率较低
应用场景: 大量做查询,少量做增删的情况下适合使用ArrayList存储数据
扩容: 初始容量为10,扩容机制->int newCapacity = oldCapacity + (oldCapacity >> 1); 每次扩容原容量的1.5倍,利用Arrays.copyOf实现扩容
新增方法: void forEach(Consumer<? super E> action) 对 Iterable每个元素执行给定操作,直到处理 Iterable所有元素或操作引发异常
遍历:
//foreach
list.forEach(System.out::println);
三、LinkedList
LinkedList是List接口的实现类
特点: 有序 可重复
底层结构: 双向链表
优点 : 做查询效率较低
缺点 : 做增删效率较高
应用场景 : 大量做增删少量做查询推荐使用LinkedList
新增功能 : 新增了一些可以操作链表头尾的方法
在集合首尾添加数据
list.addFirst("111");
list.addLast("555");
四、Set
Collection另一个子类接口
特点:无序 不可重复|去重
无序:存放的顺序与内部真实存储的顺序不一致(内部与自己存储的规则)
去重|不可重复:两个数据调用equals方法返回值true,相同需要去重,false不同可以添加
遍历方式:
- for - each
- 迭代器 iterator
五、HashSet
HashSet是Set接口的实现类
底层结构: 哈希表 (数组+链表+红黑树) ->是由HashMap维护
优点 : 查询,增删效率较高
缺点 : 无序
应用场景: 实现不存储相同数据,查询,增删效率较高的时候建议使用HashSet
新增功能: 无新增功能
去重: 需要在存储数据的类型中重写hashcode与equals方法实现数据的去重