面试题记录之--java集合

目录

数组和链表有什么区别?

ArrayList和Vector的区别?

HashMap、 TreeMap、 HashTable 的区别?

HashMap 的工作原理是什么?

List、 Set、 Map 的区别?

谈谈 ArrayList 的扩容机制?

HashMap 和 HashSet 的区别?

ConcurrentHashMap 和 Hashtable 的区别

ConcurrentHashMap 线程安全的底层实现

HashMap 有哪几种场景的遍历方式?

HashSet 如何检查重复?

HashMap 的长度为什么是 2 的幂次方?

Comparable 和 Comparator 的区别

ArrayList 和 LinkedList 的区别

Collection 和 Collections 有什么区别?

如何决定使用 HashMap 还是 TreeMap?

如何实现数组和 List 之间的转换?

在 Queue 中 poll()和 remove()有什么区别?

哪些集合类是线程安全的?

迭代器 Iterator 是什么?

Iterator的特点?

Iterator 和 ListIterator 有什么区别?

怎么确保一个集合不能被修改?


数组和链表有什么区别?

比较项

数组

链表

逻辑结构

数组在内存中是连续的,长度是固定的;增加元素可能会造成数组越界,减少元素可能会造成内存浪费,删除元素需要移动其它元素

链表在内存中是不连续的;支持动态增加或删除元素、长度不固定

访问效率

查找元素的效率高,直接通过下标访问元素

查找元素的效率低,需要通过遍历查找元素

增删效率

增删效率低,操作时往往需要移动其它元素

增删效率高,不需要移动其它元素

总结:

应用场景查找和遍历偏多时使用数组,增删操作较多时使用链表

ArrayList和Vector的区别?

比较项

ArrayList

Vector

线程安全问题

采用异步处理,线程不安全

采用同步处理,线程安全

性能问题

性能较高

性能较低

扩容

动态扩容时增加0.5倍

动态扩容时增加1倍

HashMap、 TreeMap、 HashTable 的区别?

比较项

HashMap

HashTable

TreeMap

线程安全问题

线程不安全

线程安全

线程不安全

key和value能否为null

可以为null,但是key中的null只能有一个

不允许为null

不允许为null

底层数据结构

哈希表(jdk1.8之后数组+链表+红黑树)

哈希表(jdk1.8之后数组+链表+红黑树)

红黑二叉树

是否有序

无序

无序

key有序排列

HashMap 的工作原理是什么?

版本1

HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

版本2

在调用HashMap的无参构造器时,指定散列因子为0.75。当调用put方法添加数据时,先判断数组是否为空或长度为0,第一次判断时会调用resize方法进行扩容,数组扩容后的初始容量就是16。接着会根据key的hashCode方法计算出hash值,用此hash值对数组长度求余获取桶的下标。多个数据的hash值相同时即产生hash冲突,HashMap使用链表+红黑树来存储相同hash值的value。
根据计算出桶的位置,先判断桶中是否有元素,如果没有,则直接放在桶的第一个位置上。如果桶中有元素,先判断两者的hash和key是否同时相同,相同则覆盖该位置的元素。否则判断是否为红黑树节点,是的话就按照红黑树的算法进行存储。如果不是红黑树,则必然是链表,遍历链表判断是否存在相同的节点,存在则覆盖;否则插入到链表的最末端,并判断链表长度是否>=7,满足条件就将链表变为红黑树

List、 Set、 Map 的区别?

比较项

List

Set

Map

单值或双值存储

单值存储

单值存储

双值存储

能否使用Iterator

不能

元素是否有序

有序

除了TreeSet有序,其他无序

除了TreeMap的key有序,其他无序

是否允许元素重复

允许

不允许

key不允许,value允许

或者

谈谈 ArrayList 的扩容机制?

第一次调用无参构造器时,创建的是一个空数组,并没有初始化容量。在第一次调用add方法时,在后面的扩容算法中会赋予数组初

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值