Java 集合常见知识点汇总#
- ArrayList 和 Vector 的区别
- List,Set,Map 三者的区别
- Set 里的元素是不能重复的,用什么方法来区分重复与否
- ArrayList,LinkedList 区别
- Collection 和 Collections 的区别
- Enumeration 和 Iterator 接口的区别
- ListIterator 有什么特点
- Java 集合的 fail-fast 快速失败机制
- 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
变量,当遍历集合节点的时候会判断modCount
和expectedModCount
是否相等,如果不相等就表示已经有线程修改了集合结构
九、comparable 和 Comparator 的区别#
- comparable 接口实际上是出自 java.lang 包 它有一个 compareTo (Object obj) 方法用来排序
- comparator 接口实际上是出自 java.util 包它有一个 compare (Object obj1, Object obj2) 方法用来排序