Java集合常见知识点汇总

  1. ArrayList和Vector的区别
  2. List,Set,Map三者的区别
  3. Set里的元素是不能重复的,用什么方法来区分重复与否
  4. ArrayList,LinkedList区别
  5. Collection和Collections的区别
  6. Enumeration和Iterator接口的区别
  7. ListIterator有什么特点
  8. Java集合的fail-fast快速失败机制
  9. comparable和Comparator的区别

一、ArrayList和Vector的区别

  • ArrayList是非同步的, Vector是同步的
  • 扩容大小不同:Vector增长原来的一倍,ArrayList增长原来的0.5倍

二、List,Set,Map三者的区别

  • List:List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
  • Set: 不允许重复的集合。不会有多个元素引用相同的对象。
  • Map: 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象

三、Set里的元素是不能重复的,用什么方法来区分重复与否

判断key是否存在,==和equals()方法都有使用。如果添加的元素相同时,是没有插入的,而是直接修改了value值

==与equals的区别

  • == 是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
  • == 是指对内存地址进行比较 equals()是对字符串的内容进行比较
  • == 指引用是否相同 equals()指的是值是否相同

HashSet是如何保证数据不可重复的?

当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断,如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同

四、ArrayList,LinkedList区别

  • Arraylist 底层使用的是 Object 数组; LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环)
  • LinkedList 不支持高效的随机元素访问,而 ArrayList 支持, 快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index) 方法)
  • 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)

五、Collection和Collections的区别

  • Collection是集合的上级接口,继承它的有Set和List接口
  • Collections是集合的工具类,提供了一系列的静态方法对集合的搜索、查找、同步等操作

六、Enumeration和Iterator接口的区别

Iterator替代了Enumeration,Enumeration是一个旧的迭代器了

  • Iterator有fail-fast机制,比Enumeration更安全
  • Iterator能够删除元素,Enumeration并不能删除元素

七、ListIterator有什么特点

  • ListIterator继承了Iterator接口,它用于遍历List集合的元素。
  • ListIterator可以实现双向遍历,添加元素,设置元素

八、Java集合的 fail-fast 快速失败机制

fail-fast 机制是java容器(Collection和Map都存在fail-fast机制)中的一种错误机制。在遍历一个容器对象时,当容器结构被修改,很有可能会抛出ConcurrentModificationException,产生fail-fast

什么情况会出现 fail-fast

  • 单线程环境: 遍历一个集合过程中,集合结构被修改。注意,listIterator.remove()方法修改集合结构不会抛出这个异常。
  • 多线程环境: 当一个线程遍历集合过程中,而另一个线程对集合结构进行了修改

实现原理

集合内部维护了一个 modCount 变量, 当遍历集合节点的时候会判断modCountexpectedModCount 是否相等,如果不相等就表示已经有线程修改了集合结构

九、comparable 和 Comparator的区别

  • comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序
  • comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

十、集合对 null 值的支持

集合类型 是否允许 null 值
ArrayList 允许多个 null
LinkedList 允许多个 null
CopyOnWriteArrayList 不允许 null
HashSet 允许一个 null
LinkedHashSet 允许一个 null
TreeSet 不允许 null
HashMap 允许一个键为 null,多个值为 null
LinkedHashMap 允许一个键为 null,多个值为 null
TreeMap 键不允许为 null,值允许 null
Hashtable 键和值均不允许 null
PriorityQueue 不允许 null
ArrayDeque 不允许 null

参考链接