Java集合框架

Java集合框架


1、List、Set、Map的区别
  • List: List接口是有序可重复的,常用实现类有ArrayList、LinkedList等
  • Set: Set接口是无序不重复的, 常用的实现类有hashSet、TreeSet、LinkedHashSet等
  • Map: 使用键值对的存储形式,key不能重复,一般使用String为key,也可以是任何对象类型
2、ArrayList和LinkedList的区别
ArrayListLinkedList
是否线程安全
底层数据接口Object数组双向链表(1.6之前是循环链表)
插入和删除元素是否受位置的影响是,数组是线性结构,ArrayList在添加操作时,默认时添加到末尾否,链表不受影响
是否支持快速随机访问是,可以通过下标索引快速访问

双向链表和循环链表

  • 双向链表:包含两个指针,一个指针prev指向前一个结点,一个指针next指向后一个节点在这里插入图片描述
  • 双向循环链表:最后一个节点的next指向头节点的next,头节点的prev指向尾节点的prev构成一个环
    在这里插入图片描述
3、ArrayList的扩容机制
  • 默认初始大小为10,当初始化ArrayList指定了初始容量时则初始容量为指定的

  • 当添加的元素数量大于初始容量时,则容量扩充为原来的1.5倍

    | 在这里插入图片描述
    |
    | ------------------------------------------------------------ |

4、HashMap Hashtable 的区别

线程是否安全: HashMap 是⾮线程安全的,HashTable 是线程安全的;HashTable 内部的⽅法

基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使⽤ ConcurrentHashMap吧)

效率: 因为线程安全的问题,HashMap 要⽐ HashTable 效率⾼⼀点。另外,HashTable 基本被

淘汰,不要在代码中使⽤它;

对Null key和Null value的⽀持: HashMap 中,null 可以作为键,这样的键只有⼀个,可以有⼀个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有⼀个 null,直接抛出 NullPointerException。

初始容量⼤⼩和每次扩充容量⼤⼩的不同 : ①创建时如果不指定容量初始值,Hashtable 默认

的初始⼤⼩为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化⼤⼩为16。之后

每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使⽤

你给定的⼤⼩,⽽ HashMap 会将其扩充为2的幂次⽅⼤⼩(HashMap 中的 tableSizeFor() ⽅

法保证,下⾯给出了源代码)。也就是说 HashMap 总是使⽤2的幂作为哈希表的⼤⼩,后⾯会介

绍到为什么是2的幂次⽅。

底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了᫾⼤的变化,当链表⻓度⼤于

阈值(默认为8)时,将链表转化为红⿊树,以减少搜索时间。Hashtable 没有这样的机制。

5、HashSet如何检查重复

当你把对象加⼊ HashSet 时,HashSet会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会

与其他加⼊的对象的hashcode值作⽐᫾,如果没有相符的hashcode,HashSet会假设对象没有重复出

现。但是如果发现有相同hashcode值的对象,这时会调⽤ equals() ⽅法来检查hashcode相等的对

象是否真的相同。如果两者相同,HashSet就不会让加⼊操作成功。

6、HashMap**的原理图

| 在这里插入图片描述
|
| ------------------------------------------------------------ |

476.png)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值