一、java集合继承关系图
List是有序的集合,Set是无序的集合。Map是无序的键值对。
常用集合的分类
Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全,但效率低
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap
集合和数组的区别
- 数组可以存储基本类型和引用类型的数据,集合只能存储引用数据类型的数据,如果是基本数据类型,jdk1.5之后,会自动装箱,再进行储蓄。
- 数组长度是固定不可变,集合长度是可变的,可伸缩。
- 数组中仅有object继承过来的方法,操作元素只能通过数组名下标方式进行操作,集合中有很多方法都能用来操作元素。
二、List和Set集合类的使用场景
三、类的对比
ArrayList和LinkedList对比
- 两者在内存上存储方式不同,ArrayList是连续内存存放,LinkedList是链式存放,逻辑上是连续的,实际内存是分开的。
- 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinekdList比较占优势,因为ArrayList要移动数据。
- 两者都不是线程安全的,可以使用线程安全的vector解决,但Vector效率不高。也可以使用Collections.synchronizedList(new LinkedList())解决。
HashMap和HashTable对比
- HashTable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比HashTable的性能高一些;但是如果有多个线程访问同一个Map对象时候,应该使用HashTable。
- HashTable不允许使用null作为key和value,如果视图把null值放入HashTable中会引发NullPointerException异常,但是HashMap可以使用null作为key或value。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
HashSet和TreeSet对比
HashSet比TreeSet的性能要好,因为TreeSet需要额外的红黑树算法来维护集合的次序。所以只有当需要保持排序的Set时候,才会使用TreeSet,否则都应该使用HashSet。
四、Iterator
用Iterator迭代器方式遍历集合元素时,如果需要删除或者修改集合中元素,必须要使用迭代器的方法,不能使用集合自身(如ArrayList、LinkedLis)的方法。
Iterator只提供了删除元素的方法remove,如果我们想要在遍历的时候添加元素怎么办?ListIterator接口继承了Iterator接口提供了add()
参考链接
https://www.cnblogs.com/jing99/p/7057245.html
https://blog.csdn.net/feiyanaffection/article/details/81394745
https://www.cnblogs.com/jxxblogs/p/11636166.html