Java 容器

1. Java 容器分为 Collection Map 两大类,其下又有很多子类,如下所示:

          

 

2.List、Set、Map 之间的区别?

     ListSetMap 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

  •  List:有序,元素可重复。
  •  Set: 无序,元素不能重复。
  •   Map:key , value 形式存储数据,key 不能重复, value 可以重复。       
  •  

2.1 list集合下有:ArrayList, LinkedList, Vector, Stack

  •    ArrayList:数组结构,特点:查询快,增删慢,线程不同步。
  •    LinkedList:双向链表结构,特点:查询慢,增删快。
  •    Vector:什么都慢,线程同步。
  •    Stack:栈,数组结构,它继承了Vector,特点:先进后出。

 

2.2 Set集合下有:HashSet, LinkedHashSet , TreeSet

  • HashSet:哈希表结构,特点:无序集合,元素不能重复,最多只有一个为 null 的元素。
  • LinkedHashSet:哈希表+链表结构,特点:有序集合,元素不能重复。
  • TreeSet:二叉树结构,是Set集合的一种变体,根据某种(规则)对里面的元素进行排序。

 

2.3 Map集合下有:HashMap, LinkedHashMap , TreeMap, Hashtable, ConcurrentHashMap

  • HashMap: 1. jdk1.8之前数据结构是: 数组 + 链表,jdk1.8之后数据结构是:数组 + 链表 + 红黑树。

                           2. 无序性 : 存入和取出元素顺序不一致。

                           3. 唯一性 : key 是唯一的。

                           4. 最多允许一个 key 为NULL,多个 value 为NULL。

                           5.查询快,线程不同步。

  • Hashtable: 和HashMap 类似,但不允许key 和 value 为null, 线程同步。
  • TreeMap:红黑树数据结构, 有序集合,key 自带排序能力,默认升序。
  • LinkedHashMap:哈希表 + 单向链表结构 ,有序集合。
  • ConcurrentHashMap:数组 + 链表 + 红黑树数据结构,线程安全。

 

3.HashMap Hashtable 有什么区别?

  • 存储:HashMap  key value null,而 Hashtable 不允许。
  • 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
  • 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

 

4.如何决定使用 HashMap 还是 TreeMap

  •  对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。

 

5.ArrayList LinkedList 的区别是什么?

  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
  • 随机访问效率:ArrayList LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

    综合来说,需要频繁读取集合中的元素时,推荐使用 ArrayList,而在插入和删除操作较多时,推荐使用 LinkedList

 

6.HashMap 的扩容机制?

  • 在不断的添加数据的过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。
  • HashMap的初始化容量为16, 加载因子为0.75,临界值为12(16*0.75),当HashMap在执行put()方法时,最后会判断节点数是否大于临界值,如果大于则扩容,容量是之前的两倍。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值