关于Java相关

Java集合

List、Set、Map三者区别

简单来说,就是
List是有序列表,允许重复的元素
Set是无序的集合,不允许重复的元素
Map是使用键值对来进行存储的,以key-value的形式进行存储,key是无序的,不可重复的,value是无序的,可重复的,每个key最多映射到一个value

ArrayList和LinkedList的区别

相同点:在线程安全上,两者都是不同步 的,所以都不保证线程安全。
在底层数据结构上,ArrayList使用的是Objetc数组进行存储,但是LinkedList使用的双向链表进行存储
下面是两者的一些效率差距:
ArrayList采用数组存储,所以插入和删除元素的复杂度受到元素位置的影响。
LinkedList采用的链表存储,所以在插入和删除时候时间复杂度不受元素位置的影响。
但是LinkedList不支持高效的随机元素访问,ArrayList支持。
在内存空间的占用方面,ArrayList的空间浪费主要体现在List列表的结尾需要预留一定的容量空间,而LinkedList的空间花费体现在每一个蒜素都需要消耗比ArrayList更多的空间,因为需要存放它的前驱和后继节点以及数据。
Guide个在这里补充了双向链表的知识,也就是一个链表包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。
双向循环链表:最后一个节点的next指向head,而head的prev指向最后一个节点,构成一个环。

ArrayList和Vector区别,为什么要用ArrayList取代Vector?

ArrayList是List的主要实现类,底层使用Object存储,使用于频繁的查找工作,但是线程不安全;
Vetor是List的古老实现类,底层使用Object存储,线程安全

ArrayList扩容技术

1.ArrayList每次扩容是原来的1.5倍。
2.数组进行扩容时,会将老数据中得元素重新拷贝一份道新的数组中,每次数组容量得增长大于时原用量得1.5倍。
3.代价是很高得,因此再实际使用时,我们因该避免数组容量得扩张。尽可能避免数据容量得扩张。尽可能,就至指定容量,避免数组扩容的发生。
4.创建方式不同,容量不同。

HashMap和HashTable的区别

线程安全来说:
HashMap是非线程安全的,但是HashTable是线程安全的,因为HashTable内部的方法是经过synchronized也就是说同步修饰的。
效率上来说,因为HashTable要兼顾线程安全,所以HashMap要比HashTable效率高一些,HashTable已经基本被淘汰了,不在代码中使用。
HashMap支持null作为键和值,但是作为键只能有一个,作为值可以有多个,HashTable不允许有null键和值。
初始容量大小和扩充容量大小不同
HashMap初始容量是16,HashTable初始容量是11
HashTable扩容为原来的2n,保证了HashMap的容量为2的幂次方,HashTable每次扩容容量变为原来的2n+1
底层数据结构不同,JDK1.8之后,HashMap在解决哈希冲突时有了较大的变化,当链表长度大于阈值(将链表转换为红黑树钱会判断,如果当前数组的长度小于64,会选择先进性数组扩容,而不是转化为红黑树)时,将链表转换为红黑树,以减少搜索时间。

HashMap和HashSet的区别

HashSet的底层是基于HashMap实现的。

HashSet如何检查重复

当把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值进行比较,如果没有相符的hashcode,HashSet会假设对象,没有重复出现,但是如果发现相同的hashcode值对象,这时候会调用equals方法来检查两者是否真的相同,如果相同HashSet就不会让加入操作成功。
hashCode()与 equals() 的相关规定:
如果两个对象相等,则 hashcode 一定也是相同的
两个对象相等,对两个 equals() 方法返回 true
两个对象有相同的 hashcode 值,它们也不一定是相等的
综上,如果一个类的 equals() 方法被覆盖过,则 hashCode() 方法也必须被覆盖。
hashcode默认行为是对堆上的对象产生独特值,如果没有重写hashcode,集市通过equals判断为相同的两个对象,在加入hashset时也不会被hashset认为是重复对象

HashMap的底层实现

首先是hashmap的hash方法:

简单来讲就是取key的HashCode(记为h)和h>>>16无符号右移16位取异或

然后简单讲讲拉链法

拉链法就是将链表与指针相结合,创建一个链表数组
在这里插入图片描述
在这之后,就可以讲JDK1.8之后,如何解决哈希冲突了
在这里插入图片描述
这里扩展讲一下红黑树
红黑树的五条定义:
1.红黑树的节点颜色有红色和黑色
2.根节点必定为黑色
3.所有叶节点都是黑色的(实际伤是空节点,也就是NIL节点)
4.对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点
第四点解释一下,红黑树其实是实现了2-3树,实现过程中,2节点为黑色,3节点为左倾的黑色和红节点,例如
在这里插入图片描述
所以在2-3树转化为红黑树的过程中,每个节点要么转换为黑节点,要么转换为左倾黑节点和红节点,显然只有黑色节点贡献实际的高度,那么在红黑树中,要达到平衡,每个节点到达叶子节点经过的黑色节点数目相同的含义是,转化为2-3树,每个节点到叶子节点的层高是相同的
5.不会有连续的红节点,也就是说每个红色节点的子节点是黑色的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值