编程语言
首页 > 编程语言> > 每天一道面试题04:Java集合类相关面试题

每天一道面试题04:Java集合类相关面试题

作者:互联网

常见Java的集合类

 

ArrayList

 

LinkedList

 

Vector

 

Set

 

HashSet

 

TreeSet

 

Map

HashMap

put()方法原理

  1. 将key,value封装到Node中

  2. 调用key的hashCode()获得hash值

  3. 使用hash值进行哈希函数计算得到下标

    • 如果该下标没有元素,将该结点放入

    • 如果有元素,将Node的key与该链表上的每个结点的key进行equals对比

      • 如果都返回false,将该节点放入到该链表末尾

      • 如果有一个返回了true,那么链表中对应这个结点的value会被Node的value覆盖(保证了不可重复)

注:

get()方法原理

  1. 先调用key的hashCode()函数计算hash值

  2. 通过哈希算法,将hash值转化为数组的下标

  3. 通过下标定位数组的某个位置:

    • 如果这个位置什么都没有,返回null

    • 如果这个位置有一个链表,将链表所有结点的key与当前key进行equals比对

      • 如果都返回false,那么get方法返回null

      • 如果有一个equals返回了true,那么返回这个结点的value

注:放在HashMap中的key的元素需要同时重写hashCode和equals方法

 

Hash冲突及其解决

hash冲突:键(key)通过hash函数得到的结果作为地址去存放键值对(key-value)(这就是hashmap的存值方式),当时计算发现这个地址已经存放了键值对,就会产生冲突,这就是hash冲突

解决方法:

1、开放定址法:当冲突发生时,通过某种探测技术在散列表上形成一个探测序列,沿着此序列逐个查找,直到找出一个开放的地址。常见的探测技术有:线性探测、再平方探测、伪随机探测

2、再哈希法:对冲突的哈希值再次进行哈希处理,直到没有哈希冲突。

3、链地址法:将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针放在哈希表的第i个单元中。链地址法适用于经常进行插入和删除的情况。

4、建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,都放入溢出表。

 

ArrayList和LinkLsit的区别

ArrayList基于数组,对随机index的访问比较快,空间浪费体现在列表结尾的预留空间

LinkList基于链表,增加和删除元素比较快,空间浪费体现在每个元素都需要消耗一定的空间

 

ArrayList和Vector的区别

Vector是线程安全的类,而ArrayList是非线程安全的

 

HashMap在jdk1.7和jdk1.8的区别

 

String和StringBuffer和StringBuilder的区别

  1. String变量不可修改,StringBuffer和StringBuilder可以修改

  2. StringBuffer是线程安全的,StringBuilder不是线程安全的

  3. StringBuffer使用了缓存区,StringBuilder没有使用缓存区,所以没有修改数据的情况下,多次调用StringBuffer的toString方法获取的字符串是共享底层的字符数组的。而StringBuilder不是共享底层数组的,每次都生成了新的字符数组。

  4. 因为方法被上锁,所以StringBuffer的性能一般会比StringBuilder差,单线程中建议使用StringBuilder

  5. String对象的相加底层调用的是StringBuilder对象,分别调用了append方法和toString方法,所以在大量字符串相加时,使用String对象相加效率低于使用StringBuffer和StringBuilder,因为还有有StringBuilder对象的创建过程和toString方法中字符数组的拷贝过程。

标签:key,面试题,单链,Java,哈希,04,value,链表,数组
来源: https://www.cnblogs.com/lifecoding/p/16327845.html