Java面试题整理!面试20多家公司后呕心沥血总结(Java面试无论去哪个公司面试都逃不过这些面试题)

本文总结了20多家公司Java面试中常见的面试题,涵盖了Java容器、集合类的区别、线程安全、HashMap与HashSet实现原理、多线程、数据库操作、JVM内存模型、垃圾回收算法、SpringBoot集成Redis等方面的知识。通过这些知识点,可以了解面试中可能遇到的问题,帮助提升面试成功率。

Java面试题整理!面试20多家公司后呕心沥血总结在很多面试中,都会遇到这些问题(Java面试无论去哪个公司面试都逃不过这些面试题)如今随着互联网不断发展在互联网时代,系统架构如何迎接高并发流量的挑战。而作为技术开发者,如何去应对技术变革带来的技能危机。基于传统架构到分布式架构演变过程所带来的技术变革进行全面深入讲解。

分享一个,有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需:点击这里领取!!! 暗号:CSDN在这里插入图片描述

Java 容器都有哪些

Collection 的子类 List、Set
List 的子类 ArrayList、LinkedList等
Set 的子类 HashSet、TreeSet等
Map 的子类 HashMap、TreeMao等

Collecion 和 Collections 有什么区别

java.util,Collection 是一个集合的顶级接口,它提供了对集合对象进行基本操作的通用接口方法,Collection 接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口的有 List 和 Set
java.util.Collections 是一个包装类(工具类),它包含了各种有关集合操作的静态多态方法。此类不能被实例化,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于 Java 的 Collection 框架

List、Set、Map 之间的区别

List、Set 都继承 Collection 接口,而 Map 则不是
List 是一个有序集合,元素可重复,可有多个NULL值。可以使用各种循环遍历集合,因为它是有序的
Set 是一个无序集合,元素不可重复,重复元素会被覆盖掉(注意:元素虽然无放入顺序,但元素在 Set 中的位置是由该元素的 HashCode 决定的,其位置是固定的,加入 Set 的 Object 必须定义 equals()方法),Set 只能用迭代,因为它是无序的
Map 是由一系列键值对组成的集合,提供了 key 和 value 的映射。在 Map 中保证 key 与 value 一一对应的关系。一个 key 对应一个 value ,不能存在相同的 key,但 value 可以相同
Set 与 List 相比较
Set 检索元素效率较低,删除和插入效率高,因为删除和插入不会引起元素的位置变化
List 可动态增长,查找元素效率高,但是删除和插入效率低,因为删除或插入一条元素,会引起其他元素位置变化
Map 适合存储键值对的数据

HashMap 和 HashTable 的区别

继承的父类不同,但二者都实现了 Map接口
HashTable 继承自 Dictionary 类
HashMap 继承自 AbstractMap 类
线程安全不同
HashMap 在缺省的情况下是非Synchronize的
HashTable 的方法是Synchronize的
在多线程下直接使用 HashTable 不需要自己为它的方法实现同步。但使用 HashMap 时需要手动增加同步处理Map m = Collections.synchronizeMap(hashMap);
是否提供 contains() 方法
HashMap 把 HashTable 的 contains() 方法去掉了,改成了 containsValue() 和 containsKey(),因为 contains 容易让人误解
HashTable 则保留了 contains()、containsValue()、containsKey() 三个方法,其中 contains() 与 containsValue() 功能相同
key 和 value 是否可以为 null 值
HashTable 中,key 和 value 都不能为 null 值
HashMap 中,null 作为键,但这样的键只有一个。可以有多个 value 为 null 值的键。当 get() 方式返回 null 有可能是 HashMap 中没有该键,也有可能返回的 value 为 null。所以 HashMap 用containsKey()方法判断是否存在键
遍历方式不同
HashTable 与 HashMap 都是使用 Iterator 迭代器遍历,而由于历史的原因,HashTable 还使用了 Enumeration 的方式
hash 值不同
哈希值的使用不同,HashTable直接使用对象的HashCode,而 HashMap 重新计算哈希值
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
HashTable 使用的取模运算
HashMap 使用的与运算,先用 hash & 0x7FFFFFFF 后,再对 length 取模,&0x7FFFFFFF 的目的是为了将负的 hash 值转化为正值,因为 hash 值有可能为负数,而 &0x7FFFFFFF 后,只有符号外改变,而后面的位都不变
内部实现使用的数组初始化和扩容方式不同
HashTable 在不指定容量的情况下默认是11,而 HashMap 为16,HashTable 不要求底层数组的容量一定要是2的整数次幂,而 HashMap 底层数组则一定为2的整数次幂
HashTable 扩容时,将容量变成原来的2倍+1 (old * 2 + 1),而 HashMap 则直接改为原来的2倍 (old * 2)

如何决定使用 HashMap 还是 TreeMap

如果需要得到一个有序的 Map 集合就应该使用 TreeMap (因为 HashMap 的排序顺序不是固定的)除此之外,由于 HashMap 有比 TreeMap 更好的性能,在不需要使用排序的情况下使用 HashMap 会更好

HashMap 的实现原理

利用key的hashCode重新hash计算出当前对象的元素在数组中的下标 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

HashSet 的实现原理

HashSet 实际上是一个 HashMap 实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用 null 元素。HashSet 中不允许有重复元素,这是因为 HashSet 是基于 HashMap 实现的,HashSet 中的元素都存放在 HashMap 的 key 上面,而 value 中的值都是统一的一个固定对象 private static final Object PRESENT = new Object();
HashSet 中 add() 方法调用的是底层 HashMap 中的 put() 方法,而如果是在 HashMap 中调用 put() ,首先会判断 key 是否存在,如果 key 存在则修改 value 值,如果 key 不存在这插入这个 key-value。而在 set 中,因为 value 值没有用,也就不存在修改 value 值的说法,因此往 HashSet 中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样 HashSet 中就不存在重复值。所以判断 key 是否存在就要重写元素的类的 equals() 和 hashCode() 方法,当向 Set 中添加对象时,首先调用此对象所在类的 hashCode() 方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的 equals() 比较两个对象是否相同,相同则不能被添加。

ArrayList 与 LinkList 的区别是什么

AarrayList 是动态数组构成 LinkList 是链表组成
AarrayList 常用于经常查询的集合,因为 LinkList 是线性存储方式,需要移动指针从前往后查找
LinkList 常用于新增和删除的集合,因为 ArrayList 是数组构成,删除某个值会对下标影响,需要进行数据的移动
AarrayList 自由度较低,需要手动设置固定的大小,但是它的操作比较方便的,①直接创建②添加对象③根据下标进行使用
LinkList 自由度较高,能够动态的随数组的数据量而变化
ArrayList 主要开销在List需要预留一定空间
LinkList 主要开销在需要存储结点信息以及结点指针信息

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

List to Array : 可以使用 List 的 toArray() 方法,传入一个数组的类型例如 Stirng[] strs = strList.toArray(new String[strList.size()]);
Array to List : 可以使用 java.util.Arrays 的 asList()方法 例如 List strList = Arrays.asList(strs);

ArrayList 与 Vector 的区别是什么

ArrayList 是非线程安全的,而 Vector 使用了 Synchronized 来实现线程同步的
ArrayList 在性能方面要优于 Vector
ArrayList 和 Vector 都会根据实际情况来动态扩容的,不同的是 ArrayList 扩容到原大小的1.5倍,而 Vector 扩容到原大小的2倍

Array 与 ArrayList 有什么区别

Array 是数组,当定义数组时,必须指定数据类型及数组长度
ArrayList 是动态数组,长度可以动态改变,会自动扩容,不使用泛型的时候,可以添加不同类型元素

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

poll() 和 remove() 都是从队列头删除一个元素,如果队列元素为空,remove() 方法会抛出NoSuchElementException异常,而 poll() 方法只会返回 null

哪些集合类是线程安全的

Vector :比 ArrayList 多了同步化机制(线程安全)
HashTable :比 HashMap 多了线程安全
ConcurrentHashMap :是一种高效但是线程安全的集合
Stack :栈,继承于 Vector 也是线程安全

迭代器 Iterator 是什么

Iterator 是集合专用的遍历方式
Iterator iterator() : 返回此集合中元素的迭代器,通过集合的iterator()方法得到,所以Iterator是依赖于集合而存在的

Iterator 怎么使用 ? 有什么特点
Iterator 的使用方法

java.lang

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值