【秋招冲刺】应届生JAVA岗-每日5道高频面试题【Day7】- 集合篇(1)

简介: 【秋招冲刺】应届生JAVA岗-每日5道高频面试题【Day7】- 集合篇(1)

image.png

文章大纲

一:List、Set、Map有什么特点,适用的场景

二: HashMap和Hashtable的区别

三: 为什么HashMap的默认大小是16

四: 数组、链表、哈希表的区别

五: 解决Hash冲突的方法

每日小结

image.png

大家好,这里是IT学习日记,一个非双一流大学毕业的深漂族,年少曾憧憬大厂,面试过许多家公司,也曾踩过无数坑,深知面试技巧和知识广度与深度对一个应届生乃至工作多年的开发者的重要性。

故特意收集了各个公司、大厂的面试高频题,通过每天打卡的方式,和大家一起记录和学习,希望能够帮助到应届生和开发者们少走弯路,一起冲向大厂!!!

image.png

一:List、Set、Map有什么特点,适用的场景

(一) 结构和特点

image.png

一:List


 有序的、可以重复,根据不同的实现,底层可以是数组(ArrayList、Vector)或者链表(LinkedList)。


 结构是数组的可以通过下标进行访问,适用于查找,增删满(因为要维护下标),结构是链表的,增删快(可以直接修改指针指向即可),查询慢(需要遍历链表获取)。



 二:Set


 无序的、不能重复,根据不同的实现,底层可以是哈希表和链表(如:LinkedHashSet)和红黑树(如:TreeSet)。


 LinkedHashSet由哈希表和链表组成,链表保证存放的元素有序性,哈希表保证存放的数据唯一性。


 TreeSet由红黑树构成,通过对比元素返回值是否为0判断元素的唯一性,同时提供了自然排序(比较类实现Comparable接口)和自定义排序(传入Comparator比较器类实现比较细节)



 三:Map


 存储的格式是键值对的方式,键需要唯一,值可以重复,根据不同的实现,底层可以是由哈希表(HashMap)或者哈希表+链表(LinkedHashMap)或者红黑树(TreeMap)组成。


 HashMap判断重复的逻辑: 先比较元素的hashCode方法判断是否相同,如果相同再比较equals方法,如果是true则表示key已存在,不进行保存,如果equals返回false,则添加键值对到哈希表中。

image.png

(二) 总结

image.png

二: HashMap和Hashtable的区别


 1、作者不一样,HashMap的作者有Doug Lea,而Hashtable的作者有Arthur van Hoff


 2、产生的时间不一样,HashMap是jdl1.2才有的,Hashtable是jdk1.0就有了


 3、继承的父类不一样,HashMap的父类是AbstractMap,Hashtable的父类是Dictionary


 4、判断key存在的api不一样,Hashtable可以使用contains或者containsKey,而HashMap只能通过containsKey


 5、Hashtable不支持key和value为null、HashMap支持key和value为null


 6、Hashtable是线程安全的,在方法中添加了synchronized,HashMap不是线程安全的(要线程安全则使用concurrentHashMap)


 7、初始化容量大小和扩容大小不同。HashMap的默认大小是16,扩容的大小为原来的2倍,Hashtable的初始化大小是11,扩容的大小为原来的2n+1



三: 为什么HashMap的默认大小是16


 1、首先理解碰撞的意思: 两个不同元素,但是Hash函数的值相同,则表示碰撞


 2、HashMap底层是数组 + 链表(1.8后当集合元素大于等于64个且链表长度大于8时会转为红黑树),key的index计算方式 = key.hash & (数组长度 - 1),由此看出key的index取值主要取决于hashcode的后n位(因为hashmap的长度是2的倍数,长度-1则后n位转为2进制数时都为1,与key的hash过后的值进行与运算,则如果此时key的hashcode足够均匀,则不会产生碰撞,所以,默认值肯定是2的倍数,16的取值是创建者经过大量测试后得到一个比较合理的值,这个值并不需要纠结,回答的时候只要答出这个逻辑即可)。



四: 数组、链表、哈希表的区别


 1、数组: 连续的一篇存储区间,占用内存严重,故空间复杂度高,二分查找事件复杂度为O(1),寻址容易,插入和删除困难(因为剩下的需要移动坐标)


 2、链表: 存储区间松散,占用内存宽松,通过指针关联前后元素位置,所以空间复杂度小,时间复杂度大,达到了O(n),寻址困难,插入和删除容易


 3、哈希表: 即链表的数组,结合了两者的特点


   (1)、元素存储到数组的位置: index = key.hash() & (len - 1)


   (2)、HashMap是一个线性数组,内部由Entry对象组成,每一个Entry对象包括key、value、hashCode、next(下一个元素)组成,key为Null的元素放在数组下标为0的链表中。



五: 解决Hash冲突的方法


 1、开放定址法


 开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。


 2、再Hash(哈希)法


 再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数

计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。


 3、链地址池法


 每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来。(HashMap就是使用该种方式解决Hash冲突问题)


 4、建立公共溢出区


 将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表



每日小结


  不积跬步,无以至千里;不积小流,无以成江海。今天播种努力的种子,总会有一天发芽!


  欢迎大家关注,如果觉得文章对你有帮助,不要忘记一键三连哦,你的支持是我创作更加优质文章的动力,希望大家都能够早日拿到心仪的Offer,有任何面试问题可以私信我,欢迎大家投稿面试题目哦!


相关文章
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
12天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
18天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
11天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
21 2
|
11天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
15天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
14天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
15天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
15天前
|
Java 开发者
下一篇
无影云桌面