帝国网站网站手机版怎么做,重庆网站建设求职简历,做彩票网站制作,手机如何做车载mp3下载网站摘自javaguide的集合总体框架图#xff1a; List, Set, Queue, Map 的区别 List#xff1a;底层基于object[]数组#xff0c;存储的元素有序、可重复。 Set#xff1a;底层基于HashMap实现#xff0c;存储的元素无序#xff0c;不可重复。 Queue#xff1a;单… 摘自javaguide的集合总体框架图 List, Set, Queue, Map 的区别 List底层基于object[]数组存储的元素有序、可重复。 Set底层基于HashMap实现存储的元素无序不可重复。 Queue单端队列存储的元素有序、可重复。 Map使用键值对key-value存储key 是无序的、不可重复的。
HashSet、LinkedHashSet 和 TreeSet 的异同
三者都是Set 接口的实现类都能保证元素唯一并且都不是线程安全的。三者主要区别在于底层实现的数据结构不同 HashSet底层基于哈希表元素具有唯一性。LinkedHashSet底层基于链表和哈希表元素具有唯一性和有序性(元素顺序满足FIFO)TreeSet底层基于红黑树支持对元素自定义排序规则。
ArrayList 和 Array数组的区别
Array的大小固定ArrayList可以动态扩容。ArrayList允许使用泛型确保类型安全Array不行。ArrayList具备基本的增删改查操作Array只能下标进行查询没有动态增删改元素的能力。Array既可以存储基本数据类型也可以存储对象ArrayList只能存储对象对于基本数据类型需要将其转化为对应的包装类。
ArrayList 与 LinkedList 区别?
底层数据结构ArrayList底层使用object[]数组LinkedList底层使用双向链表。是否支持快速随机访问ArrayList支持LinkedList不支持。插入和删除是否受元素位置的影响 ArrayList添加元素时默认添加至列表尾部此时时间复杂度为O(1)但如果在指定位置添加和删除元素时时间复杂度为O(n)。LinkedList在头尾插入和删除时时间复杂度为O(1)但如果在指定位置插入删除元素时间复杂度为O(n)。
ArrayList扩容机制
ArrayList三个构造函数 ArrayList() 默认创建长度为0的数组。 ArrayList(int initialCapacity) 创建指定容量的数组。 ArrayList(Collection? extends E c) 使用集合c的大小作为数组容量。 首次向集合中 add 单个元素时集合扩容为10再次扩容为上次的1.5倍。(扩容使用的是位运算奇数*1.5向下取整)。 首次向集合a中 addAll 集合b的元素时集合a扩容为max(10,集合b的元素个数) 接着再向集合a中 addAll 集合c的元素时集合a扩容为max(集合a容量的1.5倍集合c的元素个数)。 位运算的速度远远快于整除运算整句运算式的结果就是将新容量更新为旧容量的1.5倍 int newCapacity oldCapacity (oldCapacity 1); ArrayList扩容机制描述 ArrayList是一个数组结构的存储容器默认数组长度是10也可以在初始构建的时候指定长度。随着不断地向容器中添加元素当达到上限时ArrayList会自动进行扩容扩容流程如下首先会创建一个新的数组长度为原始数组的1.5倍(使用位运算)然后使用Arrays.copy方法将老数组的元素copy到新数组中再将需要添加的新元素添加到新数组中。
Comparable 和 Comparator 的区别 Comparable和Comparator都是接口都可以用来进行比较、排序可以将Comparable理解为“内部比较器”Comparator理解为“外部比较器”。
实现方式 Comparable可以直接在需要进行排序的实体类中实现重写compateTo方法即可。Comparator需要另外创建一个实现Comparator接口的实现类来作为“比较器”并在排序时将比较器作为参数传入。各自的优缺点 Comparable 实现比较简单但是需要修改源代码。Comparator需要新建比较器类较为复杂但是不需要修改源代码并且新建的比较器类可以供多个对象排序使用。
具体参考这篇文章 Comparable和Comparator区别
HashMap和Hashtable的区别
线程安全与效率 HashMap线程不安全但效率相对较高。Hashtable线程安全效率相对较低。对 Null 的支持 HashMap可以存储null值键只能存一个(对应的key为0)值可以存多个。Hashtable不可以存储null键和null值。初始容量大小和每次扩容大小 不指定容量 HashMap默认初始化大小为 16之后每次扩充容量变为原来的 2 倍。Hashtable默认的初始大小为 11之后每次扩充容量变为原来的 2n1。指定容量 HashMap会将指定容量扩充为 2 的幂次方大小即HashMap总是使用 2 的幂作为哈希表的大小。Hashtable直接使用指定的容量。扩容方式不同当容量不足时要进行resize方法而resize有两个步骤 ①扩容两者扩容大小不一样。②rehash两者都会重新计算hash值而两者计算hash的值的方式也不同。(如下代码)
//hashMap计算hash值
static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16);}
//而hashtable直接使用hashcode值作为最终的hash值底层数据结构 JDK1.8 以后的 HashMap在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为 8时 将链表转化为红黑树以减少搜索时间。Hashtable只使用链表解决哈希冲突。
HashSet 如何检查重复 当我们将对象加入HashSet时HashSet会计算该对象的hashcode值并与HashSet中其他对象作比较若没有hashcode相同的对象则该对象不重复允许加入若有hashcode相同的对象还需要使用equals()方法检查两对象是否真的相同如果相同则不允许加入该对象。
ps
hashcode是某个对象的哈希值相同对象的hashcode值一定相同不同对象的hashcode值也有可能相同(即哈希冲突)。