Java教程

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

本文主要是介绍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 ,然后再根据实现这些接口的集合的特点来选用。

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

文章质量好差,基本上没有自己思考的过程,一个劲的照抄,这可能是我最后一篇了害。果然还是太菜了…

这篇关于Java刷题笔记----->集合类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!