1 数组和集合区别
在这里插入图片描述
2. 集合常见的方法
在这里插入图片描述
3. 常用集合分类
3.1 Collection接口下的
-
List接口
- LinkList:链表, 插入删除, 没有同步, 线程不安全
- ArrayList: 数组, 随机访问, 没有同步, 线程不安全
- Vector:数组, 同步, 线程安全
-
Set接口
- HashSet:底层数据结构是哈希表(是一个元素为链表的数组)
- TreeSet:底层数据结构是红黑树(是一个自平衡的二叉树)
- LinkedHashSet:底层数据结构由哈希表和链表组成。
3.2 Map接口下的
- HashTable:同步, 线程安全
- HashMap:没有同步, 线程不安全-
- TreeMap:红黑树对所有的key进行排序
- IdentifyHashMap
4. List和set的区别
- 重复元素:list可以允许重复元素,set不允许
- 有序性:list是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序
- null元素:list可以插入多个null元素,而set只允许插入一个null元素
5. 迭代器(Iterator)
Collection的源码中继承了Iterable,有iterator()这个方法
在这里插入图片描述
Iterable是一个接口,它有iterator()这个方法,返回的是Iterator
Iterator也是一个接口,它只有四个方法:
- hasNext()
- next()
- remove()
- forEachRemaining()
在这里插入图片描述
在ArrayList内部首先是定义一个内部类Itr,该内部类实现Iterator接口,如下:
在这里插入图片描述
而ArrayList的iterator()方法实现
public Iterator<E> iterator() {
return new Itr();
}
Iterator(迭代器)是一个接口,它的作用就是遍历容器的所有元素。
ArrayList<String> arrayList = new ArrayList<>();
Iterator<String> iterator = arrayList.iterator();
Iterator的意义
遍历ArrayList 和Linklist是十分容易的,遍历Tree容器也不难,但是实现机制是完全不同,而遍历Set容器就无从下手了。 所以Java设计了Iterator 这个接口,分别让各种容器自己去重写里面的hasNext()和next()方法。不用关心各种容器的遍历机制,只要使用Iterator,会让人觉得各种容器的遍历方法都是一样的,这就是Java接口的重要意义。
几个遍历的比较
- for一般可以用于简单的顺序集合,并且可以预测集合的大小;
- foreach可以遍历任何集合或者数组,但是使用者需要知道遍历元素的类型。
- iterator是最强大的,它可以随之修改元素内部的元素。可以在遍历的时刻用remove()