JAVA的集合框架总结

面试知识点之集合框架

在这里插入图片描述
上图应该是集合框架的一个比较详细的结构图了。
我们从上至下学习

1、Iterator接口

实现该接口的类表示可以使用迭代器,同时也可以使用foreach循环。没有实现该接口无法使用迭代器。
List和Set都实现了Iterator接口,但Map没有,这是区别。
迭代器:专门用于遍历集合的类,为什么不用for循环呢?
(1)set是能使用for循环遍历的,只能使用迭代器。
(2)如果在for,或者foreach中对集合进行删除操作是会报错的,因为删除时会改变集合的长度,导致ConcurrentModificationException错误。而Iterator则解决了这个问题。
(3)无论你用的是什么结构(链表、数组、树、图、hash表), 你可以不关心任何遍历细节,对该数据结构进行遍历操作。他具有通用性,如下:

public static void main(String[] args) {
    
    
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(3);
		list.add(5);
		Set<Integer> set = new HashSet<>();
		set.add(1);
		set.add(3);
		set.add(5);
		//一段相同代码既可以遍历list又可以遍历set
		//应该可以遍历所有实现Iterator接口的类,不过没有实际操作过。
		traversal(list);
		traversal(set);
	}
	public static void traversal(Collection<Integer> collection){
    
    
		Iterator<Integer> iterator = collection.iterator();
		while(iterator.hasNext()){
    
    
			System.out.println(iterator.next());
		}
	}

1.5 ListIterator接口

该接口是专门用于List集合遍历的Iterator接口。实现了List集合的双向操作。

2、Collection接口

Collection接口继承了Iterator接口,表示实现该接口的类都可以使用迭代器。同时,实现Collection接口表示这个类是一个集合容器,他声明了集合的通用方法。
他主要有3个子接口:List,Set,Queue(队列)
注意:Map没有实现这个接口。

3、List接口

List接口的特点(和Set的区别):
(1)有序,list中的元素会按照插入顺序排列。
(2)可重复,list允许插入重复的元素。
我们主要关心他的3个实现类
(1)ArrayList:
ArrayList内部维护了一个数组,因此ArrayList具有数组的特性
顺序访问,内存连续,查找效率高。
线程不安全
(2)LinkedList:
LinkedList内部维护的是一个链表,因此它具有链表的特性
随机访问,插入,删除效率高。
线程不安全
(3)Vector:
出现于JDK1.0,后基本被ArrayList取代。
特点:线程安全。

4、Set接口

Set接口的特点(和List的区别):
(1)无序,Set中插入的元素不会记录插入的顺序。
(2)不可重复,Set不允许插入相同的元素。
主要的实现类:
(1)HashSet:
HashSet采用Hash表算法将元素插入至内部数组中,因此拥有极快的查询效率。
所有使用Hash表算法的集合,都重写equals方法,来尽量避免哈希冲突
Hash表算法简单来说就是将元素的值和存储该元素的数组下标使用一种函数关联起来,这样直接通过计算就可以找到需要的元素,根本不需要遍历。(关于哈希表算法和哈希冲突篇幅较长,烦请大家自行搜索。)
线程不安全。
(2)LinkedHashSet:
LinkedHashSet采用Hash表算法将元素插入内部的链表中,由于链表中元素地址无需连续,只需要保存下一个节点的位置就可以记录插入顺序,所以,LinkedHashSet可以记录元素插入的顺序.
线程不安全。
(3)TreeSet:
TreeSet:采用红黑树算法,特点是擅长范围查找。会为插入的元素进行自然排序,就是按自己的规则从小到大排序。
线程不安全。

5、Map接口

Map接口并没有继承Collection,这不代表他不是一个集合容器。
Map 提供 Key 到 Value 的映射,一个 Map 中不能包含相同的 Key,但可以包含相同的Value。每个 Key 只能映射一个 Value,因此Map更像是List和Set的组合体。
主要的实现类:
(1)HashMap:
HashMap,采用哈希表算法,根据key值快速获得value的地址,拥有高效的查询效率。
底层重写了equals方法,发生哈希冲突时,会在数组同一个位置建立一个链表(即数组每一个下标保存的是一个链表),用于存放hash值相同的元素。当链表过长时非常影响效率,应尽量避免哈希冲突
在jdk1.8版本中,当链表长度大于8时会转换成红黑树,以提高效率。
推荐一篇讲解的十分详细的HashMap博客给大家 Java集合:HashMap详解(JDK 1.8)
线程不安全。
(2)HashTable:
HashTable是HashMap的前身,现在也基本不用。
特点:线程安全。

6、Collections和Arrays

Collections是集合的工具类,Collection是集合的接口类
Arrays是数组的工具类。
显而易见,带s的是工具类。

猜你喜欢

转载自blog.csdn.net/qq_42068856/article/details/86650177