首先
Collection是所有集合的超类。
set接口和list接口继承了Collection接口。
List
list接口表示有序(存入顺序和取出顺序一致)可以存储重复值的集合,并且可以保存null元素。
它的实现类有ArrayList和LinkedList、Vector等。
- ArrayList:底层是数组,查询元素和修改某一个元素快。
- LinkedList: - 底层是双向链表,删除和增加快。
- Vector:和ArrayList的原理一样,但是它线程安全(效率更低)。
set
set接口表示无序(存入顺序和取出顺序不一致),不可以存放重复的值的集合,可以保存null元素。
它的实现类有HashSet和TreeSet、Queue等。
HashSet
底层基于HashMap。HashMap基于HashCode,是一个非线程安全。
HashMap底层是键值对的数组+链表+红黑树(JDK1.8之后)。
判断重复的机制:先判断元素的hashcode,hashcode值相等再判断equals,都相等则是同一个元素。
使用HashSet存储自定义类对象时,可以在自定义类中重写equals和hashCode方法避免“真实”对象被多次存入,主要原因是集合内不允许有重复的数据元素,在集合校验元素的有效性时(数据元素不可重复),需要调用equals和hashCode验证。
LinkedHashSe
LinkedHashSet是HashSet的子类:是一个有序的HashSet,在HashSet的基础上维护了链表。
使用LinkedHashSe的场景:元素不重复,并且存入和取出顺序要求。
TreeSet
基于TreeMap,TreeMap底层基于红黑树(特殊的二叉树,左边叉值小,右边叉值大,有自平衡机制)。
- 自然排序:元素类型必须实现了Comparable接口,且必须重写compareTo()方法。
返回值 正数:升序
返回值 负数:降序
返回值0:相同的元素,就不会添加了 - 定制排序:
在创建TreeSet对象的时候,传入一个Comparator接口的实现类,该实现类必须重写compare方法
返回值 正数:升序
返回值 负数:降序
返回值 0:相同的元素
当自然排序和定制排序同时使用,定制排序优先级更高
一般情况下,默认排序用自然排序,特殊排序用定制排序
遍历集合的方式
1.list集合有四种遍历方式
foreach遍历: 因为ArrayList间接实现了Iterable接口
方式1//foreach遍历集合
for (Object object : list) {
System.out.println(object);
}
方式2//for遍历集合
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));
}
方式3//单向迭代器
Iterator iterator = list.iterator();//创建单向迭代器对象
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
方式4//双向迭代器
ListIterator listIterator = list.listIterator();
//创建双向迭 代器对象:正向迭代
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {//反向迭代
System.out.println(listIterator.previous());
}
2.set集合有两种遍历方式
没有下标不能普通for循环遍历
foreach遍历: 因为hashSet间接实现了Iterable接口
//方式1:迭代器
Iterator iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next()+"didi ");
}
//方式2:foreach
for (Object object : hashSet) {
System.out.println("!!!!" +object);
}