java面试题目总结

HashMap原理

https://blog.csdn.net/vking_wang/article/details/14166593

HashMap和HashTable的区别 https://www.cnblogs.com/lchzls/p/6714335.htm

解决Hash冲突的几种方法 https://blog.csdn.net/u012104435/article/details/47951357

Synchronized 实现并发同步

synchronized 关键字,它包括两种用法:synchronized 方法synchronized 块
https://www.cnblogs.com/jiansen/p/7351872.html
https://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html

Volatile保证变量可见性

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
在这里插入图片描述
https://www.cnblogs.com/dolphin0520/p/3920373.html

Lock接口实现锁

Lock 和 Synchronized 的区别

  1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
  2. synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
  3. Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4. 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
  5. Lock可以提高多个线程进行读操作的效率。

ReentrantLock
ReentrantLock是唯一实现了Lock接口的类,并且ReentrantLock提供了更多的方法。

公平锁和非公平锁

  1. 公平锁即尽量以请求锁的顺序来获取锁。比如同是有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该所,这种就是公平锁。

  2. 非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。

  3. 在Java中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。而对于ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。
    https://www.cnblogs.com/dolphin0520/p/3923167.html

数据库索引为什么这么快

首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
添加索引的话,首先去索引列表中查询,而我们的索引列表是B类树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。

进程和线程的区别?

进程时操作系统分配资源的最小单位,线程是处理器任务调度和执行的最小单位。线程是进程的一部分,一个进程可以有多个线程。同一进程中的线程共享地址空间和资源,而不同进程之间的地址空间和计算资源是相互独立的。

进程切换、上下文切换、任务切换

  1. 正在运行的用户态进程X
  2. 发生中断
  3. SAVE_ALL // 保护现场
  4. 中断处理过程中或中断返回前调用了schedule()函数,其中的switch_to做了关键的进程上下文切换
  5. 标号1之后开始运行用户态进程Y(这里的Y是通过以上步骤被切换出去过因此可以从标号1继续执行)
  6. 恢复现场
  7. iret - pop cs:eip/ss:esp/eflags from kernel stack
  8. 继续运行用户态进程Y

为什么TCP建立连接需要三次握手而断开连接需要四次挥手,为什么TCP关闭连接时需要TIME_WAIT状态,为什么要等2MSL

java面试题目总结_第1张图片
java面试题目总结_第2张图片

一次完整的HTTP请求过程是怎样的

当我们在浏览器中输入 www.baidu.com ,然后回车,到底发生了什么
过程

  1. 对www.baidu.com这个域名进行DNS域名解析,得到对应的IP地址,
  2. 向该IP地址发出三次握手建立TCP连接
  3. 建立TCP连接后,浏览器向服务端发送http请求
  4. 服务器响应http请求,浏览器得到请求的html文件
  5. 浏览器解析html文件,并请求html中的资源(js、css、图片等)
  6. 浏览器对页面进行渲染呈现给用户

HTTP和HTTP2有什么区别

HTTP1.0,发送一次请求需要等待服务器响应了才可以继续发送请求
HTTP1.1,持久连接;提出Pipeline理论,不用等待服务器响应就可以发送请求,但是回送数据给客户端的时候,客户端还是要按照响应的顺序一一接受
HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞问题——多路复用

在你的项目中你使用过哪些设计模式?主要用来解决什么问题

Object中的equals和hashcode的作用分别是什么

1. 相等(相同)的对象必须有相等的Hash
2. 如果两个对象的HashCode相同,它们并不一定相同

Java集合中比较两个对象是否相同是首先比较两个值的HashCode是否相等,如果不等则两个对象不等;如果相等则用equals进行比较。

final、finally、finalize的区别和作用场景

  1. final 是Java的修饰符,可以用来修饰类、变量、方法
    修饰类:表示该类不能作为父类被其他类继承
    修饰变量:表示常量,只能被赋值一次之后不能进行修改
    修饰方法:final 方法不能被重写
  2. finally 是异常处理的一部分,只能和try/catch配合使用,表示finally下的语句不管有没有异常都会执行
  3. finalize 是java.lang.Object 的一个方法,说明每一个对象都有该方法,这个方法在GC启动,该对象被回收的时候被调用。

简单介绍一下Java的异常机制

Java中的异常指的是在程序运行时发生的错误,Java中通过API中的Throwable类中的众多子类来描述异常。
Java异常机制:

  1. 抛出异常:当一个方法发生错误,该方法回创建异常对象交付给系统,异常对象中包含了异常的类型和异常出现时的程序状态等异常信息。
  2. 捕获异常:抛出异常后,系统寻找合适的异常处理器进行处理,如果未找到合适的异常处理器,则程序终止。
    try/catch 或 try/catch/finally

简单描述一下JVM的内存模型

方法区:存放加载类的信息,常量,静态变量
堆:存放几乎所有的Java对象
虚拟机栈:每个方法执行时都会创建一个栈帧,用于存在局部变量、方法出口信息、操作栈等
本地方法栈:与虚拟机栈相似,为本地native方法所用
程序计数器:当前线程所执行的字节码的行号指示器。

什么情况会触发Full GC

  1. 老年代空间不足
  2. Perm Gen空间满了
  3. System.gc()方法的调用
  4. 通过Minor GC 后进入老年代的大小大于老年代的可用内存

Java的类加载器有几种,关系是怎样的

java面试题目总结_第3张图片

双亲委派机制的加载流程是怎样的,有什么好处

双亲委派机制的工作过程:
如果一个类加载器收到类加载的请求时,它首先不会自己取尝试加载这个类,而是把这个请求委派给父类加载器完成,每一个层次的加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈给自己无法完成加载请求的时候,子加载器才会尝试自己完成加载。
使用双亲委派机制来组织类加载器之间的关系,一个显而易见的好处就是Java中的类随着它的类加载器一起具备了一种带有优先级的层次关系。

1.8为什么用Metaspace替换掉PermGen?Metaspace保存在哪里

编译期会对指令做哪些优化?(简单介绍编译器的指令重排)

简单描述一下Volatile可以解决什么问题?如何做到

Volatile是一个轻量级的同步机制,它的主要特性:
1. 保证共享变量的对所有线程的可见性
2.禁止指令重排序优化

简单介绍一下GC的分代回收

新生代(Eden)、老年代
Minor GC 、 Major GC 、Full GC
https://blog.csdn.net/a724888/article/details/81114916

G1垃圾回收算法和CMS的区别有哪些

java面试题目总结_第4张图片
java面试题目总结_第5张图片

对象引用有哪几种方式,有什么特点

强引用:
软引用:
弱引用:
虚引用:

使用过哪些JVM调试工具,主要分析哪些内容

锁的四种状态与升级

锁的四种状态:

  1. 无锁
  2. 偏向锁
  3. 轻量级锁
  4. 重量级锁

锁的状态只会升级,不会降级。
java面试题目总结_第6张图片

描述对象创建的过程

类加载检查–>分配内存–>初始化零值–>设置对象头–>执行init方法

  1. 类加载检查
  2. 分配内存
    指针碰撞: 假设Java堆中的内存是规整的,用过的内存在一边,空闲的在另一边,中间有一个指针作为分界点的指示器,所分配的内存就把那个指针向空闲那边挪动一段与对象大小相等的距离。
    空闲列表:如果Java堆中的内存不是规整的,虚拟机必须维护一个列表,记录哪些内存块可用的,分配时从列表中找到一块足够大的空间划分给对象,并更新列表的记录。
  3. 初始化零值
  4. 设置对象头 : 主要设置类的元数据信息、对象的哈希码、对象的GC分代年龄等信息
  5. 执行init方法

Object obj = new Object()在内存中占了多少字节

24

对象在内存中的内存布局

java面试题目总结_第7张图片

Synchronized 和 ReenTrantlock的异同

Synchronized 是Java 关键字,由Java编译器实现锁的功能;而ReentrantLock是java.util.concurrent包下的一套互斥锁,需要lock()、unlock()配合try/catch/finally使用。
ReentrantLock 相比于Synchronized提供了一些高级功能:
1 . 等待可中断:持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,从而可以避免死锁的出现。
2. 公平锁:ReentrantLock 是公平锁,即 多个线程等待同一个锁的时候,必须按照申请时间顺序获得锁,可通过参数调节是否为公平锁;而Synchronized 是非公平锁。
3. 锁绑定多个条件:ReentrantLock可以同时绑定多个对象,用来实现分组唤醒需要唤醒的线程,Synchronized 要么随机唤醒一个线程,要么唤醒全部线程。

你可能感兴趣的:(面试问题合集)