本文是自己对java集合概念的整理、方便自己记忆学习。主要参考了以下内容
API:https://docs.oracle.com/javase/8/docs/api/
教程:https://www.runoob.com/java/java-collections.html
博客:https://blog.csdn.net/feiyanaffection/article/details/81394745
1、Collection、Collections区别
java.util.Collection 是一个 集合框架的父接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现:list、set
java.util.Collections 是一个包装类。它包含有各种有关集合操作的 静态多态方法。此类 不能实例化,就像一 个工具类,服务于Java的Collection框架。他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。比如Collections.sort(list);
2、线程安全、线程不安全、同步、不同步
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。
线程安全一般都涉及到synchronized 就是一段代码同时只能有一个线程来操作 不然中间过程可能会产生不可预制的结果
线程不安全是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
3、链表、哈希表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。线性表的链式存储表示,有一个缺点就是要找一个数,必须要从头开始找起,操作麻烦。
哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表
4、java集合架构(参考https://www.runoob.com/java/java-collections.html)
集合架构层次图:
集合分类示意图(参考https://blog.csdn.net/feiyanaffection/article/details/81394745)
5、集合、数组的区别
①长度:集合的长度可变;数组的长度固定
②数据类型:数组可以是基本类型、也可以是引用类型;集合只能是引用类型
③存储元素类型:数组只能存储同一种类型;集合可以存储不同类型。
6、List、set区别
共同点:List,Set都是继承自Collection接口,都可以存储null数据。
①重复对象:list可以允许重复的对象,而set不允许重复对象
②容器是否有序:list是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序
*list有序并不代表排序。
③性能:Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变
7、ArrayList、LinkedList 、Vector的区别
共同点:都实现list接口
区别:(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
(2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
(3)Vector: 底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
8、HashSet、LinkedHashSet、TreeSet的区别
相同点:不容许包含相同的元素、判断两个对象是否相同不是使用==运算符,而是根据equals方法。
都是非线程安全
区别:LinkedHashSet,插入、删除比HashSet要略微慢一点,遍历LinkedHashSet会更快。
TreeSet是SortedSet接口的唯一实现。
TreeSet可以确保集合元素处于排序状态
TreeSet支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序(升序)。
对于set、list的使用、可以参考下图(图片来源https://blog.csdn.net/feiyanaffection/article/details/81394745)
9、map
Map没有继承Collection接口,Map提供key到value的映射、一个Map中不能包含相同的key,每个key只能映射一个value
HashMap、HashTable、TreeMap的区别
①Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;
HashMap不支持线程的同步
②Hashtable与 HashMap类似,它继承自Dictionary类,它不允许记录的键或者值为空; 它支持线程的同步
③LinkedHashMap是有序的,保存了记录的插入顺序:就是说你插入的是什么顺序,读出来的就是什么顺序,但是也有访问顺序,就是说你访问了一个key,这个key就跑到了最后面
④TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器