java常见面试题汇总

1.常见集合有哪些?

答:Map接口和Collection接口是所有集合框架的父接口:
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

2.HashMap实现原理

答:基于Hash表实现的,数据结构为数组+链表;工作原理是通过put()和get()方法存储和获取对象;

当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。

3.当两个不同的键对象的hashcode相同时会发生什么?

答:会出现Hash碰撞。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

4.HashMap和Hashtable的区别

https://blog.csdn.net/suifeng629/article/details/82179996

5.TCP3次握手,4次挥手

https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

6. MySql 一条查询sql的执行过程

https://www.cnblogs.com/gusluo/p/11250863.html

https://blog.csdn.net/cmm0401/article/details/107287580?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

MySQL 主要分为客户端层、 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 与 undolog 只有 InnoDB 有。

引擎层是插件式的,目前主要包括,MyISAM、InnoDB、Memory 等。

SQL 等执行过程分为两类:

(1)一类对于查询SQL,执行流程如下:权限校验 —》查询缓存 —》分析器 —》优化器 —》权限校验 —》执行器—》引擎—》返回结果,并且写入缓存。

(2)一类对于更新SQL,执行流程如下:分析器 —》权限校验 —》执行器 —》引擎 —》 redo log prepare —》binlog —》redo log commit —》写入磁盘,返回影响结果。

7.HashMap什么时候会进行rehash?

答:当HashMap的容量达到threshold时就需要进行扩容,这个时候就要进行ReHash操作(此操作耗时,应尽量避免);threshold的计算规则,是大于当前初始容量的最小的2次幂。扩容比例是成倍扩容。

8.HashMap的初始容量设置成多少比较合适呢?

答:实际需要容量/加载因子(默认0.75)+1;+1的原因是扩容是在put后进行的。

9.结合源码说说HashMap在高并发场景中为什么会出现死循环

答:多线程会导致HashMap的Entry链表形成环形数据结构,查找时会陷入死循环。HashMap进行存储时,假设size超过当前最大容量*负载因子时候会发生resize,此方法中又调用了transfer()方法,而这种方法实现的机制就是将每一个链表转化到新链表,而且链表中的元素位置发生反转,而这在多线程情况下是非常容易造成链表回路。从而发生get()死循环。

 10.JDK1.8中对HashMap做了哪些性能优化?

答:底层数据结构增加了红黑树,当链表的长度大于8时,转换为红黑树的结构,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。

11.HashMap和HashTable有何不同?

答:1)主要区别是HashMap是非同步的,而Hashtable是同步的。2)HashMap允许空值作为键和值,而哈希表不允许空

12.HashMap 和 ConcurrentHashMap 的区别?

答:最大的区bai别就是ConcurrentHashMap是线程安全du的,hashMap不是线程安全的。ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中。

13.为什么ConcurrentHashMap中的链表转红黑树的阀值是8?

答:理想情况下使用随机的哈希码,容器中节点分布在hash桶中的频率遵循泊松分布,按照泊松分布的计算公式计算出了桶中元素个数和概率的对照表,可以看到链表中元素个数为8时的概率已经非常小,再多的就更少了,所以原作者在选择链表元素个数时选择了8,是根据概率统计而选择的。

14.ConcurrentHashMap和LinkedHashMap有什么区别?

答:LinkedHashMap维护一个双链表,可以将里面的数据按写入的顺序读出;ConcurrentHashMap是使用了锁分段技术技术来保证线程安全的,在每个段中线程安全。ConcurrentHashMap的应用场景是高并发,但是并不能保证线程安全,而同步的HashMap和HashTable的是锁住整个容器,而加锁之后ConcurrentHashMap不需要锁住整个容器,只需要锁住对应的segment就好了,所以可以保证高并发同步访问,提升了效率。

ConcurrentHashMap能够保证每一次调用都是原子操作,但是并不保证多次调用之间也是原子操作。

15.什么时候需要用到ConcurrentHashMap和 linkedHashMap?

答:https://blog.csdn.net/qq_39455116/article/details/82830102

16.Java volatile关键字

答:volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。

https://blog.csdn.net/u012723673/article/details/80682208

17.什么是ConcurrentSkipListMap?他和ConcurrentHashMap有什么区别?

答:ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。
ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表。但是,第一,它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的。第二,ConcurrentSkipListMap是通过跳表实现的,而TreeMap是通过红黑树实现的。

但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点:
1、ConcurrentSkipListMap 的key是有序的。
2、ConcurrentSkipListMap 支持更高的并发。ConcurrentSkipListMap 的存取时间是log(N),和线程数几乎无关。也就是说在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势。

18.Spring IOC 容器源码分析

答:https://javadoop.com/post/spring-ioc

19.什么是死锁?死锁产生的条件?

答:所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 

 产生死锁的必要条件:

互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

解决死锁的基本方法
预防死锁:
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

20.进程和线程的区别?

答:进程是运行中的程序,线程是进程的内部的一个执行序列
进程是资源分配的单元,线程是执行单元
进程间切换代价大,线程间切换代价小
进程拥有资源多,线程拥有资源少

https://blog.csdn.net/qq_40574571/article/details/90765979

21.进程的通信方式?

答:进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

22.CPU执行一条指令的过程

答:其工作bai都可以分为5个阶段:du取指令、指令译码、执zhi行指令、访存取数、结果写回。

23.100亿数据找出最大的1000个数字(top K问题)

答:局部淘汰法。用一个容器保存前10000个数,然后将剩余的所有数字一一与容器内的最小数字相比,如果所有后续的元素都比容器内的10000个数还小,那么容器内这个10000个数就是最大10000个数。如果某一后续元素比容器内最小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完这1亿个数,得到的结果容器中保存的数即为最终结果了。此时的时间复杂度为O(n+m^2),其中m为容器的大小。这个算法优点是性能尚可,空间复杂度低,IO读取比较频繁,对系统压力大。
另一种方法是分治法,即大数据里最常用的MapReduce。对于海量数据处理,思路基本上是:必须分块处理,然后再合并起来。

 

 

 

posted on 2020-07-21 09:51  温故而知新,少年  阅读(140)  评论(0编辑  收藏  举报

导航