一、开场白
简单的介绍一下自己的工作经历与职责,在校或者工作中主要的工作内容,主要
负责的内容;(你的信息一清二白的写在简历上,能答出来的最好写在上面,模
棱两可不是很清楚的最好不要写,否则会被问的很尴尬)
介绍下自己最满意的,有技术亮点的项目或平台,重点介绍下自己负责那部分的
技术细节;(主要对自己做过的事情是否有清晰的描述)
二、Java 基础
什么是字符串常量池?JVM 为了提高性能和减少内存开销,在实例化字符
串常量时进行了优化,字符串类维护了一个字符串池,当创建字符串常量时
会首先检查字符串常量池,如果有此字符串值会返回此字符串值得引用,否
则创建实例化一个字符串放入池中。
String 为什么是不可变的?String 类是 final 修饰的,是不变对象,指
向对象的引用可以指向其他对象,但是引用指向的对象状态(属性)不可改变。
与不变变量(指向对象的引用不可改变,引用指向的对象属性可以改变)相对。
String s = new String("xyz");究竟产生了几个对象,从 JVM 角度谈
谈?两个对象,因为是 new 的,会在堆内存中创建一个引用对象以及在常量
池中存放值为”xyz”的常量。
String 拼接字符串效率低,你知道原因吗?因为 string 每做一次”+”
就会创建一个 StringBuilder 对象,append 后就丢弃,创建和销毁对象会浪
费很多时间。
你真的了解 String 的常见 API 吗?
Java 中的 subString()真的会引起内存泄露么?不算内存泄漏,本字符传
及引用的源字符串都可被回收。
浅析 Java 中的 final 关键字?
final 修饰类不能被继承,修饰方法不能被重写,修饰变量,值不能被修改。
浅析 Java 中的 static 关键字?
static 修饰的方法称为静态方法,非静态方法中可以访问静态方法,而静态
方法中不可访问非静态方法,可以通过类名.方法名的方式调用静态方法。静
态变量在内存中只有一份,使用类名.变量名的方式调用静态变量,非静态变
量只能通过对象.属性的方式调用非静态变量。
你对 Java 中的 volatile 关键字了解多少?使用 volatile 修饰的变量,
每次使用时都会去内存中获取最新值。
i++是线程安全的吗?如何解决线程安全性?不是,加同步锁 synchroniz
ed
从字节码角度深度解析 i++ 和 ++i 线程安全性原理?i++是先使用值再
进行加 1,而++i 是先进行加 1 运算后,再使用值。
请谈谈什么是 CAS?CAS 是计算机硬件对并发操作共享数据的支持,cas
算法用来解决并发编程中出现的原子性问题。
从源码角度看看 ArrayList 的实现原理?
手写 LinkedList 的实现,彻底搞清楚什么是链表?
Java 中方法参数的传递规则?值传递和引用传递
Java 中 throw 和 throws 的区别是什么?throw 是语句抛出异常,throws
是方法可能抛出异常的声明。
重载和重写的区别?重载是同一个类中,方法名可以相同,方法的参数列
表(参数个数、参数顺序、参数类型)不同。重写是子类继承父类可以对方法
覆盖。
手写 ArrayList 的实现,在笔试中如何过关斩将?
finally 语句块你踩过哪些坑?
为什么重写 equals 方法需同时重写 hashCode 方法?
hashcode 方法的返回值需要满足两个要求:1、使用 equals 方法判断相等的
两个实例应该返回相同的散列码值。2、在应用程序的单次执行过程中,两次
以上调用对象的该方法应该返回相同值。
重写 equals 方法是一般要重写 hashcode 来保证符合以上两个要求。
equals() 与 == 的区别?equals 比较的是对象的状态,==比较的是对象
的引用是否是同一对象。
StringBuffer 和 StringBuilder 的区别,从源码角度分析?
StringBuffer 是线程安全的可变字符串封装类,而 StringBuilder 是非线程
安全的可变字符串封装类。
你知道 HashMap 的数据结构吗?基于 hash 算法
为何 HashMap 的数组长度一定是 2 的次幂?
HashMap 何时扩容以及它的扩容机制?
HashMap 的 key 一般用字符串,能用其他对象吗?可以,也允许 null 键和
null 值
HashMap 的 key 和 value 都能为 null 么?如果 key 能为 null,那么它是怎
么样查找值的?可以
HashMap 是线程安全的吗?如何实现线程安全?非线程安全,使用 synch
ronized 关键字
从源码角度分析 HashSet 实现原理?
HashTable 与 HashMap 的实现原理有什么不同?
String 方法 intern() 你真的会用吗?
什么是自动拆装箱?基本数据类型转换为包装类成为装箱,反之成为拆
箱。自动例如:往集合中放入基本类型数据,会自动把基本类型数据进行装
箱作为一个对象放入集合中。
String.valueOf 和 Integer.toString 的区别?前者返回将对象转换为 s
tring 类型,后者将制定整数转换为有符号位 String 对象,以 10 进制字符
串形式返回。
三、Java 多线程
线程的生命周期包括哪几个阶段?
新建、就绪、运行、死亡、阻塞
多线程有几种实现方式?
2 种,extends Thread 和 implements Runnable 接口
请谈谈什么是进程,什么是线程?
线程是最小的执行单元,一个进程至少有一个线程。
启动线程是用 start()方法还是 run()方法?start()方法使线程进入就
绪状态,cpu 分配给该线程时间,该线程才会执行,也就是运行 run()方法。
说说线程安全问题,什么实现线程安全,如何实现线程安全?同步(sync
hronized)或加锁(lock),在一个线程执行的时候,共享数据不能被其他线程
修改,保证共享数据的同步性和线程执行的有序性。
sychronized 和 Lock 的区别?
1、synchronized 是 java 内置关键字,Lock 是一个接口。
2、前者不能获取锁的状态,后者可以获取锁的状态(用 tryLock()方法)。
3、前者可以自动释放锁,后置必须用 unlock 手动释放锁。
4、前者容易造成线程阻塞,适合少量同步代码。后者不会造成线程阻塞(调
用 lockInterruptibly()进行中断等待的线程),适合大量同步代码。
5、synchronized 可重入、不可中断、非公平锁,Lock 可中断、接口下 Reen
trantLock 实现类是可重入锁、ReentrantLock 和 ReentrantReadWriteLo
ck 默认非公平,可设置为公平锁。
sleep()和 wait()的区别?
sleep()使线程睡眠不能释放锁,而 wait()可以释放锁.
深入分析 ThreadLocal 的实现原理?线程本地变量 ThreadLocal 在每个线
程中都创建了所使用的变量副本,底层也是封装了 ThreadLocalMap 集合类来
绑定当前线程和变量副本的关系。使用起来都是在线程的本地工作内存中操
作。
你看过 AbstractQueuedSynchronizer 源码阅读吗,请说说实现原理?
谈谈对 synchronized 的偏向锁、轻量级锁、重量级锁的理解?
通过三种方式实现生产者消费者模式?
JVM 层面分析 sychronized 如何保证线程安全的?
JDK 层面分析 sychronized 如何保证线程安全的?
如何写一个线程安全的单例?
通过 AQS 实现一个自定义的 Lock?
ThreadLocal 什么时候会出现 OOM 的情况?为什么?
为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
简单的说 wait、notify、notifyAll 都是锁级别的操作,所以把他们定义在
Object 类中,因为锁属于对象。
你真的理解 CountDownLatch 与 CyclicBarrier 使用场景吗?
出现死锁,如何排查定位问题?
notify 和 notifyAll 的区别?
notify 通知队列等待时间最长的线程;notifyAll 通知所有等待线程。
线程池启动线程 submit 和 execute 有什么不同?submit 有返回值方便异
常处理,而 execute 没有返回值。
SimpleDateFormat 是线程安全的吗?如何解决?不是,可以使用 Thread
Local 解决,一个线程只实例化一个 SimpleDateFormat 对象。
请谈谈 ConcurrentHashmap 底层实现原理?将 ConcurrentHashMap 容器的
数据分段存储,每一段数据分配一个 Segment(锁),当线程占用其中一个 S
egment 时,其他线程可正常访问
使用 synchronized 修饰静态方法和非静态方法有什么区别?
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可
进入此对象的其方法?不可以,只有当前线程释放此对象此方法锁后,其他
线程获取该锁才可以执行此对象的该方法。
线程池的原理,为什么要创建线程池?创建线程池的方式?对象的复用,减少创
建对象和销毁对象的时间,提高系统响应。方式:1、固定数量的线程池
-newFixedThreadPool 2、大小不固定-newCachedThreadPool
3、单线程-newSingleThreadPool 4、定时线程池-newScheduledThreadPool
创建线程池有哪几个核心参数? 如何合理配置线程池的大小?
CorePoolSoze-核心线程池数量、maxinumPoolSize-最大线程池数量、keepA
liveTime-核心池以外的线程存活时间、workQueue-保存待执行任务的阻塞队
列、threadFactory-每个线程创建的地方、handler-饱和策略
synchronized 修饰的静态方法和非静态方法有什么区别?
Synchronized static 是某个类的范围,防止多线程同时访问 synchronized
static 方法,对类的所有对象实例起作用。
Synchronized 是类对类的当前实例进行加锁,防止多线程同时访问该类的该
实例的所有 synchronized 方法。
四、Java Web
什么是 Servlet,Servlet 生命周期方法?
1、servlet 是基于 java 语言的 Web 服务器端变成技术是 sun 公司提供的一
种用于实现动态网页的解决方案。按照 javaEE 规范,servlet 是运行在 Ser
vlet 容器中的 java 类,能处理 Web 客户的 HTTP 请求,返回 HTTP 响应。2、
加载、实例化、初始化(init())、处理请求(service())、销毁(destroy())
什么 Session 和 Cookie,它们之间有什么联系?
Session 技术是指使用 HttpSession 对象实现会话跟踪的技术,是一种在服
务器端保持会话跟踪的解决方案。cookie 技术是一种在客户端保持会话跟踪
的解决方案。
JSP 的八个隐含对象有哪些?
1、与 Input/Output 有关:request、response、out 2、与 Context 有关:s
ession、application、pageContext 3、与 Servlet 有关:page、config
JSP 的四个域对象的作用范围?
1、页面域:生命周期是指页面执行期间。2、请求域:生命周期是指一次请
求过程。3、会话域生命周期是指某个客户端与服务器所连接的时间(包含多
次请求)。4、应用域:生命周期是指服务器开始执行服务到服务器关闭为止。
Post 和 Get 请求的区别?
get 主要用于获取/查询资源信息,请求的参数会在 url 上以明文显示,传输
数据大小有限;post 常用于更新资源信息,传输数据量较大。
转发和重定向有什么区别?
1、请求转发只能转发给同一个 Web 应用中的组件,而重定向可以重定向到当
前应用程序中的其他资源、同一个站点上其他应用程序的资源、其他站点
的资源。
2、请求转发浏览器地址栏不改变(服务器内部处理),重定向浏览器地址栏改
变(重新发起一个新请求)。
3、请求转发调用者与被调用者共享同一个请求对象和响应对象,而重定向调
用者和被调用者使用各自的请求对象和响应对象。
JSP 自定义标签,如何实现循环打印功能?
Http1.0 和 Http1.1 的区别是什么?
1、Http1.1 支持长连接(持久连接)和流水线处理(可以发送多个 http 请求
和响应、多个请求和响应可以重叠,可以同时进行)2、增加了 host 字段,
请求信息和响应信息都应支持 Host 头域。3、加入一个新的状态码 100,客
户端事先只发送一个只带头域的请求,如果服务器因权限拒绝请求,就回送
响应码 401,如果收到请求就回送响应码 100。
拦截器与过滤器的区别?
1、拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。
3、拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起
作用。
4、拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。
5、在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器
初始化时被调用一次。
五、JVM 面试题
JVM 内存区域如何划分?分配给 jvm 的内存区域称为运行时数据区,包含
方法区、堆、栈、寄存器、常量池
JVM 堆中对象是如何创建的?通过 new 关键字来创建对象。
JVM 对象的结构?1、对象头(运行时数据(哈希值、GC 分代年龄、锁状态
标志等)、类型指针(存储对象的类元数据的指针))2、实例数据(存储对象
的有效信息)3、对齐填充
JVM 垃圾回收-如何判断对象是否是垃圾对象?两种算法(1、引用计数算
法(不常用)--对象中添加一个引用计数器,有引用此对象就加一,反之减一
2、可达性分析算法--定义一个名为"GC Roots"的对象作为起始点,这个"GC
Roots"可以有多个,从这些节点开始向下搜索,搜索所走过的路径称为引用
链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则
证明此对象是不可用的,即可以进行垃圾回收)
JVM 垃圾回收算法有哪些?1、引用计数算法 2、可达性分析算法
JVM 垃圾收集器有哪些?1、Serial 收集器(单线程、收集垃圾时停止所有
线程、运行在 Client 模式下的虚拟机默认新生代收集器)2、Serial Old 收
集器(单线程、标记整理算法)3、ParNew 收集器(多线程、运行在 Server 模
式下的虚拟机首选的新生代收集器)4、Parallel Scacenge 收集器(新生代收
集器、采用复制算法、并行多线程)5、Parallel Old 收集器(标记整理算法、
多线程)6、Concurrent Mark Sweep 收集器(标记清除算法、获得最短回收停
顿时间为目标)7、G1 收集器(基于标记整理算法、不产生空间碎片、精确控
制停顿)
JVM 内存是如何分配的?运行时数据区(方法区、堆、栈、寄存器、常量
池)
从一道面试题分析类的加载过程?
JVM 双亲委派机制?ClassLoader 实例都会有一个父 ClassLoader,当被
要求寻找一个类或资源时,ClassLoader 实例就会委托给他的父 ClassLoade
r,并层层向上委托。
JVM 可以作为 GC Root 的对象有哪些?1、虚拟机栈(栈帧中本地变量表)
中引用的对象 2、方法区中类静态属性引用的对象 3、方法区中常量引用的对
象 3、本地方法栈中引用的对象。
请写出几段可以导致内存溢出、内存泄漏、栈溢出的代码?
哪些情况会导致 Full GC?1、System.gc()的调用。2、老年代空间不足
(只有在新生代对象转入及创建大对象、大数组时才会出现不足的现象)。3、
永生区空间不足 4、堆中分配很大的对象(需要大量连续内存空间的 java 对
象成为大对象)。5、HandlePromotionFailure(Minor GC 之前,虚拟机先检
查老年代最大连续空间是否大于新生代所有对象总空间,大于就进行 Minor
GC,小于就查看 HandlePromotionFailure 是否设置为 true,false 就进行 Fu
ll GC)
频繁 GC 问题或内存溢出问题,如何定位?
六、SQL 性能优化
数据库三范式是什么?1、第一范式:当关系模式 R 的所有属性都不能在分
解为更基本的数据单位时(1、每一列属性都是不可再分的属性值 2、两列的属
性相近相似或一样,尽量合并属性一样的列)。2、第二范式:如果关系模式 R