Yige

Yige

Build

Java集合汇总

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

参考链接#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。