集合面试汇总

集合框架体系图
这里写图片描述

LinkedList 是单向链表还是双向链表?
Java 中的 LinkedList 是单向链表还是双向链表? - CSDN博客 https://blog.csdn.net/qq_32575047/article/details/78885066
LinkedList:双向链表,由于没有索引,只能循环遍历。每次循环的时候。都会先判断一下当前这个节点是在链表的前半部分还是后半部分。 每次循环都只遍历链表的一半,而不是全部遍历。
HashMap与Hashtable的区别
https://blog.csdn.net/fujiakai/article/details/51585767
HashMap与Hashtable的底层数据结构相同
数据结构为哈希表,采用数组加链表的方式。通过增加单链表的方式来解决哈希冲突。
当多个key映射到同一位置上,这时可以在该节点处增加一个单链表
HashMap
线程不安全,在多线程中会存在安全问题,比如put操作时会出现死循环问题。多线程环境下可以采用concurrentHashMap.
HashMap允许null值bull键,而Hashtable不允许Null值null键。
HashMap与Hashtable哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap需要重新计算hash值。
Hashtable的默认容量为11,而HashMap的默认容量为16.
扩容方式:Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
Set集合为什么具有唯一性?
TreeSet具有唯一性是因为TreeSet依靠TreeMap进行实例化,TreeMap底层数据结构为红黑树。
可以根据键值的大小进行排序,若键相同则值覆盖。要求进行比较的元素必须实现自然排序或者比较器排序。

默认是按键值的升序排列,Integer和String默认重写了compareTo方法,实现了自然排序。
如果要将自定义对象进行排序,可以通过实现自然排序或者比较器排序 。
自然排序
必须要让该让集合元素本身实现comparable接口,重写其中的compareTo方法
例如商品价格升序排列:
@Override
public int compareTo(Object o) {
if(this.price<(((Product)o).price)){
return -1;
}
if(this.price>(((Product)o).price)){
return 1;
}
return 0;
}
比较器排序
通过构造方法,匿名内部类的方式让这个集合对象实现Comparator接口,重写其中的int compare(T o1, T o2)方法,来比较两个对象的值,根据具体排序要求来自定义排序实现。

HashMap多线程并发访问可能出现什么安全问题?
HashMap多线程并发问题分析 - Andrew.Zhou - 博客园
https://www.cnblogs.com/andy-zhou/p/5402984.html
多线程并发访问
put引发的安全问题
对于多线程访问的时候,由于其内部实现机制(在多线程环境且未作同步的情况下,对同一个HashMap做put操作可能导致两个或以上线程同时做rehash动作,就可能导致循环键表出现,一旦出现线程将无法终止,持续占用CPU,导致CPU使用率居高不下),就可能出现安全问题了
get导致的死循环问题
当另外一个线程get 这个Entry List 死循环的key的时候,这个get 也会一直执行。最后结果是越来越多的线程死循环,最后导致服务器dang掉。
注意:不合理使用HashMap导致出现的是死循环而不是死锁。

ps:知识记住了就是自己的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值