Java刷题笔记----->集合类

1.ArrayList与Vector的区别?

一般提到某某集合区别,感觉必有线程安全
Arrylist线程不安全,Vector反之

2.HashMap和HashTable的区别?

几个方面:线程是否安全,效率问题,对Null Key和Null value的支持,初始容量大小和每次扩容量大小的不同,底层数据结构的不同(这又涉及到链表和红黑树了,而面试很喜欢考红黑树。。。)

3.HashMap和HashSet的区别?

HashMapHashSet
实现了Map接口实现Set接口

4.HashMap多线程操作导致死循环问题

原因在于并发下的Rehash会造成元素之间形成一个循环列表。不过JDK1.8后解决了这个问题,但是不建议在多线程下使用HahsMap,因为多线程下HashMap还是会存在其他问题比如数据丢失。并发环境下推荐使用ConcurrentHashMap。

5.集合框架底层数据结构总结

1. List

  • Arraylist : Object[] 数组
  • Vector : Object[] 数组
  • LinkedList : 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
    2. Set
  • HashSet (无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
  • LinkedHashSet : LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样, 不过还是有一点点区别的
  • TreeSet (有序,唯一): 红黑树(自平衡的排序二叉树)
    3. Map
  • HashMap : JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链 表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突 时有了较大的变化,当链表⻓度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如 果当前数组的⻓度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链 表转化为红黑树,以减少搜索时间
  • LinkedHashMap : LinkedHashMap 继承自 HashMap ,所以它的底层仍然是基于拉链式散 列结构即由数组和链表或红黑树组成。另外, LinkedHashMap 在上面结构的基础上,增加 了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的 操作,实现了访问顺序相关逻辑。
  • Hashtable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
  • TreeMap : 红黑树(自平衡的排序二叉树)

6.如何选用集合?

主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用 Map 接口下的集 合,需要排序时选择 TreeMap ,不需要排序时就选择 HashMap ,需要保证线程安全就选用
ConcurrentHashMap 。
当我们只需要存放元素值时,就选择实现 Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet ,不需要就选择实现 List 接口的比如 ArrayList 或 LinkedList ,然后再根据实现这些接口的集合的特点来选用。

稍微看了下:红黑树工作原理

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值