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)方法用来排序

参考链接