浅谈 Java 集合

Q:谈一谈 java 集合框架

A:我觉得应该从以下三个问题来讲
1. 集合框架是什么?
2. 集合框架是用来做什么的?
3. 集合框架的体系结构是什么?
4. 集合框架中三大类型

首先,它就是一个容器,存放着任意数量且具有相同属性的对象,还对外提供了一系列操作这些对象的方法
其次,它可以整理数据、简单快速的查询元素、有些集合还提供了一系列排列有序的元素,并且可以在集合中快速的插入和删除、有些集合还提供键值对方式存储,可以通过 key 找到对应的唯一对象。
最后,简单的看一下它的体系结构,可以大致分为两条线:

Java集合框架体系结构

List:它是以线性方式存储的,可以存放重复元素,也可以存放 null 值
Set:存储无序元素(存储和获取的顺序不定),值不能重复
Map键值对的方式存储。

Q:谈谈 ArrayList、Vector、LinkedList 的区别?

A:关于区别,个人觉得直接从源码分析最为透彻,但是这里我们还是一步步来推演比较方便。

首先,三者都是 List 名下的产物。参考上一个问题,可知其三者相同点。但是其底层数据结构却有不同:ArratList动态数组结构,而 LinkedList 却是循环双向链表结构。由数组和链表的区别,可知以下区别:
①:前者改查快,后者增删快
②:前者支持高效的随机访问,后者必须按序访问

其次,ArrayList & Vector 的区别
看似相同都是基于数组的底层结构,但是仍存在众多区别:
①:Vector线程安全的,所以增删改查都比 ArrayList 慢。
②:Vector 维护了一个字段,可以通过构造器去设置每次扩容的大小
③:扩容时,ArrayList 底层数组容量增长到原来的 1.5 倍,Vector 增长到原来的容量的 2 倍

Q:谈谈 HashSet、TreeSet?

A:首先三者都继承了 Set 的特性,还是有以下的主要区别:
①、HashSet 是基于 hash 表的数据结构,而 TreeSet 是基于红黑树的数据结构,所以,HashSet 的性能总比 TreeSet 好。
②、TreeSet 一般在元素需要排序的情况下使用。

Q:谈谈 HashMap?

A:从下面几个问题来谈?
1. HashMap 的数据结构?
2. HashMap 的工作原理?
3. HashMap 跟其他 XxxMap 的比较?

首先,HashMap 的数据结构哈希表结构(数组+链表)实现的,但是当链表的长度超过 8 时,链表转换为红黑树
其次,HashMap 的工作原理,可以从存储对象获取对象容量相关遍历这几个方面来谈。

存储对象时,将 K/V 值传给 put() 方法:
①、获取数组下标:index = (数组大小-1) & hash(K);
②、调整数组大小:元素的个数 > 数组大小 * 负载因子,数组大小扩容为原来的 2 倍;
③、如果 hash(K) 值在 HashMap 中不存在,则执行插入,否则发生碰撞;
④、如果发生碰撞,且两者之间 equals 返回 true,则更新键值对,否则返回 false插入链表的尾部或者红黑树中。

获取对象时,将 K 传给 get() 方法:
①、获取该键值所在数组下标
②、顺序遍历链表,equals() 方法查找相同链表中 K 值对应的 V 值。

容量相关
①、默认容量是 16,也可以构造时设置。
②、扩容时,将 table 数组长度变为原来的两倍

遍历:
①、只需要 K 值的时候:for-each map.keySet()
②、需要 V 值的时候:for-each map.entrySet()

最后,看看跟 HashMap 相关的比较
Q:HashMap 和 HashTable 有什么区别?
A:①、HashMap 线程不安全,HashTable 线程安全,所以 HashTable 的效率低;
②、HashMap 允许 null 值的存在,而 HashTable 不允许;
③、HashTable 默认数组大小为 16,扩容时扩大 2 倍HashTable11,扩容时扩大 2倍+1
④、哈希值的使用不同:HashMap 需要重新计算 hash 值,而 HashTable 直接使用对象的 hashCode

Q:HashMap,LinkedHashMap,TreeMap 有什么区别?
A:HashMap 参考以上问题
①、LinkedHashMap 保存了记录的插入顺序 FIFO,遍历比 HashMap 慢;
②、TreeMap 保存的记录根据键排序,默认按键值升序

Q:谈谈 HashMap 哈希运算的细节?为什么这么做?

HashMap 哈希计算过程

A:JDK 1.8 中,是通过 hashCode() 的高 16 位异或低 16 位实现的:(h = k.hashCode()) ^ (h >>> 16)。
为了混合原始哈希码的高位和低位,从而加大低位的随机性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值