- 集合的基本接口之一是Collection接口。
- Collection接口的 contains() 调用对象的equals()进行比较,因此加入集合的对象所在类应重写equals()。
- Iterator接口是一个迭代器,用于遍历集合中的元素,通过循环调用hasNext()和next()依次访问集合中的元素。
- 每次调用集合对象的iterator()都会得到一个全新的迭代器,指向集合第一个元素的前一个位置。
- foreach循环可以遍历任何实现了Iterable接口的对象,等价于迭代器。
- 一般情况下,考虑Collection接口的两个重要子接口:List接口、Set接口。
- List接口用于存储有序的、可重复的数据。
- Set接口用于存储无序的、不可重复的数据。无序性不等于随机性,即存储数据时是根据其哈希值进行排序的,而不是根据添加的顺序进行排序的。不可重复性是指先根据hashCode()计算元素应该存放在数组的哪个位置,若该位置上已经有其他元素,则再根据hashCode()判断两个元素的哈希值是否相同,若不同则直接添加,若相同则再根据equals()判断是否为重复元素,若不是重复元素则以链表形式链接在该位置上的元素后面。
- 一般情况下,考虑List接口的三个重要实现类:Vector类、ArrayList类、LinkedList类。
- Vector类底层使用 Object[] 存储数据,是线程安全的,但是效率低。
- ArrayList类底层使用 Object[] 存储数据,是线程不安全的,但是效率高。
- LinkedList类底层使用Node内部类存储数据,是一个双向链表,尾进头出。
- 一般情况下,考虑Set接口的三个重要实现类:HashSet类、TreeSet类、LinkedHashSet类。
- HashSet类底层使用数组+链表存储数据,适合快速查找元素。
- TreeSet类底层使用红黑树存储数据,添加的数据必须是同一个类的对象,且必须实现了Camparable接口,被campareTo()判断为相等的对象只能添加一个,可以指定添加对象的属性进行比较,数据会自动排序。
- LinkedHashSet类底层使用数组+链表存储数据,是HashSet类的子类,添加数据的同时维护了两个引用,分别记录前一个数据和后一个数据,适合频繁遍历。
- Set接口的实现类存储的对象必须重写equals()与hashCode()。
- 利用接口指向实现类时,虽然具备了多态的优点,但是不能调用实现类的特有方法,因此需要权衡使用。
import java.util.*;
public class CollectionTest {
public static void main(String[] args) {
System.out.println("---Collection---");
Collection<Integer> collection = new ArrayList<>();
collection.add(1);
collection.add(2);
collection.add(3);
System.out.println(collection.contains(1));
System.out.println("---迭代器---");
Iterator<Integer> iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("---foreach循环---");
for (Integer integer : collection) {
System.out.println(integer);
}
System.out.println("---Vector---");
List<Double> list1 = new Vector<>();
list1.add(1.0);
list1.add(2.0);
list1.add(3.0);
System.out.println(list1.size());
System.out.println("---ArrayList---");
List<Double> list2 = new ArrayList<>();
list2.add(1.0);
list2.add(2.0);
list2.add(3.0);
System.out.println(list2.get(2));
System.out.println("---LinkedList---");
LinkedList<Double> list3 = new LinkedList<>();
list3.addFirst(1.0);
list3.addFirst(2.0);
list3.addFirst(3.0);
System.out.println(list3.pop());
System.out.println("---HashSet---");
Set<String> set1 = new HashSet<>();
set1.add("Java");
System.out.println(set1.add("Java"));
System.out.println("---TreeSet---");
Set<String> set2 = new TreeSet<>();
set2.add("a");
set2.add("c");
set2.add("b");
System.out.println(set2);
System.out.println("---LinkedHashSet---");
LinkedHashSet<String> set3 = new LinkedHashSet<>();
set3.add("123");
System.out.println(set3.add("123"));
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/2822d430bb744a0590a08d58b5803e16.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)