一、基础
String的不可变性
String类内部管理的是:final char[]
String ,StringBuffer,StringBuilder
String和StringBuilder、StringBuffer的区别在于:
String声明的是不可变的对象,每次操作都会新增对象,再把指针指向新的对象。
而StringBuilder和StringBuffer可以在原有对象基础上就行修改。
StringBuilder和StringBuffer的区别在于:
StringBuilder是线程安全的(效率低),StringBuffer是线程不安全的(效率高)
基本类型和包装类型的区别,涉及自动装箱和拆箱,怎么做的,原理
二、集合
List和Set区别
从三个方面来看:
1)重复
2)null
3)顺序
4)子类(接口)
Collection
->List
->ArrayList
->LinkedList
->Set
->HashSet
->TreeSet
Map
->HashMap
->TreeMap
List排序如何排序?如何删除某个元素(迭代器+remove)
排序:
自然排序和定制排序
1)通过Collections.sort()==>
传入一个参数:实现Comparable接口对象集合
传入两个参数:传入对象集合和Comparator接口
2)通过Lambda表达式
Stream#sort()
删除:
坑点:使用循环删除某个元素后list大小发生改变,后序元素位置发生改变,可能导致漏掉或者是抛出ConcurrentModificationException
1)通过lambda的filter过滤
2)通过Iterator,在利用Iterator的remove来删除()
ArrayList的实现原理?如何去重?
优势,扩容,什么时候用
利用HashSet
HashMap的实现原理
源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决
第一:底层是:数组+ 链表
第二:当put某个元素的时候
key== > key. hashCode ( ) == > & % hash算法计算在数组下标位置== > 链表(解决hash冲突;7 上8 下)
HashMap的key需要注意什么?HashMap的hashcode作用? HashSet实现原理 Hashtable
同步锁,
这块可能会问你synchronized关键字 1.6之后提升了什么,怎么提升的这些
集合类中哪些是线程安全的
三、多线程与并发
多线程的run和start的区别 start()根据线程状态为0,调用start0()本地方法来创建一个线程 run()
看源码:
1 、Start ( ) == = > Thread类中的start ( ) 和start0 ( ) 方法
public synchronized void start ( ) {
if ( threadStatus != 0 )
throw new IllegalThreadStateException ( ) ;
group. add ( this ) ;
boolean started = false ;
try {
start0 ( ) ;
started = true ;
} finally {
try {
if ( ! started) {
group. threadStartFailed ( this ) ;
}
} catch ( Throwable ignore) {
}
}
}
private native void start0 ( ) ;
2. run ( ) == > Thread类中target属性和run ( ) 方法
private Runnable target;
@Override
public void run ( ) {
if ( target != null) {
target. run ( ) ;
}
}
JMM内存模型和volatile 说一说自己对于 synchronized 关键字的理解 ?
synchronized关键字用来解决多线程之间资源的同步性的,synchronized保证修饰的方法和同步代码块任意时刻只有一个执行
底层是通过monitor实现的,通过monitorEnter获取锁,monitorExit释放锁
讲一下 synchronized 关键字的底层原理 ?
synchronized是通过monitorenter和monitorexit指令实现了,monitor是对象的同步基本单元
java6前,monitor是互斥锁;java6后,提供了三种不同的monitor实现(偏向锁、轻量级锁、重量级锁)
说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优 化吗?
jdk1.6后对于锁引入了大量的优化,偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除和锁粗化来减少锁的开销
偏向锁:在无竞争的情况下完全消除同步块
轻量级锁:使用轻量级锁时,不需要申请互斥量,加锁和解锁都使用了CAS操作(在无竞争的情况下使用CAS代替互斥量)
自旋锁:循环去判断资源是否可用,消耗cpu
适应性自旋:自旋的次数不固定,由上一次同一个锁自旋次数和拥有者状态决定
锁消除:去除不可能存在共享资源竞争的锁
锁粗化:扩大加锁范围,避免反复加锁和解锁(比如对一个循环操作进行加锁解锁)
锁的四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态
http://m.mianshigee.com/question/10025hlk
谈谈 synchronized和ReenTrantLock 的区别?
synchronized是jvm层面的(monitor实现的),ReentrantLock是JUC下的一个类
synchronized不需要主动释放锁,ReentrantLock需要lock-unlock结合try-finally结合主动释放锁
synchronized是非公平锁,ReentrantLock是可以根据传入的boolean值选择
synchronized不可中断,ReentrantLock是可以通过tryLock中断的
说说 synchronized 关键字和 volatile 关键字的区别?
volatile修饰变量,synchronized修饰类、方法、变量
volatile可以保证可见性、不能保证原子性;synchronized两个都可以
volatile不会造成线程阻塞,synchronized会阻塞
为什么要用线程池
降低资源的消耗。通过反复利用创建的线程降低线程创建和销毁造成的销毁消耗
提高响应速度。当任务到达时就可以立刻执行不需要等待线程创建
提高线程的管理性
实现Runnable接口和Callable接口的区别?
Runnable实现的是run方法,Callable实现的是call方法
Callable能抛异常、能有返回值
执行execute()方法和submit()方法的区别是什么呢?
execute:传入Runnable接口
submit:
可传入Runnable,也可以传入Callable接口
可以返回future,可以通过get()获取返回值;
如何创建线程池 ?
可以通过Executors的四个静态类创建
但是阿里巴巴手册上推荐我们自定义:ThreadPoolExecutor
因为可能会导致OOM
Fixed和Single的请求队列定义最大长度为Integer.MAX_VALUE,可能会导致任务大量堆积
Cached和Schedule允许创建线程的最大数量是Integer.MAX_VALUE,可能会创建大量线程
介绍一下Atomic 原子类?
原子类表示的是具有原子特征的类,也就是说多个线程执行的时候,一个操作一旦开始,就不会被其他线程干扰。
原子类java.util.concurrent,原子类分为四类:
基本类型:AtomiInteger/AtomicLong/AtomicBoolean
数组类型:
引用类型:AtomicReference
对象属性修改类型:AtomicStampedReference
JUC 包中的原子类是哪4类?
讲讲 AtomicInteger 的使用?
AtomicInteger
#getAndIncrement
#getAndDecrement
#getAndSet
#getAndAdd
#CompareAndSet
能不能给我简单介绍一下 AtomicInteger 类的原理 ?
主要通过CAS+volatile+native方法保证原子性的
CAS:拿期望值和原有值做一个比较,如果相同则更新
UnSafe.objectFieldOffset是一个本地方法:拿到原来值的内存地址
AtomicInteger的value值是用volatile修饰的
AQS 介绍 ?
AQS全称是AbstractQueuedSynchronizer,这个类在java.util.concurrent.locks包下的
AQS是一个构建锁和同步器的框架
使用AQS能够高效的构建出应用广泛的大量同步器,如ReentrantLock,Semaphone,ReentrantReadWriteLock,FutureTask
也可以使用AQS自定义实现需要的同步器
AQS 原理分析 ?
如果被请求的共享资源空闲
则进行两个操作:1.请求资源的线程设置为有效的工作线程。2.设置资源为锁定状态
如果不空闲
通过CLH队列实现:线程阻塞等待和唤醒时锁分配机制,将获取不到锁的线程加入到队列中
AQS使用一个int的成员变量表示同步状态,通过阻塞队列实现获取资源的排队工作,使用CAS原子操作实现对值的修改
多线程其他
synchronized 关键字:① 说一说自己对于 synchronized 关键字的了解;② 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗;③ 讲一下 synchronized 关键字的底层原理;④ 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗;⑤ 谈谈 synchronized 和 ReentrantLock 的区别。
volatile 关键字: ① 讲一下 Java 内存模型;② 说说 synchronized 关键字和 volatile 关键字的区别。
ThreadLocal:① 简介;② 原理;③ 内存泄露问题。
线程池:① 为什么要用线程池?;② 实现 Runnable 接口和 Callable 接口的区别;③ 执行 execute() 方法和 submit() 方法的区别是什么呢?;④ 如何创建线程池。
Atomic 原子类: ① 介绍一下 Atomic 原子类;② JUC 包中的原子类是哪 4 类?;③ 讲讲 AtomicInteger 的使用;④ 能不能给我简单介绍一下 AtomicInteger 类的原理。
AQS :① 简介;② 原理;③ AQS 常用组件。
简述线程、程序、进程的基本概念。以及他们之间关系是什么?==http://m.mianshigee.com/question/10077uia
线程有哪些基本状态?==http://m.mianshigee.com/question/10078xdc
解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?==http://m.mianshigee.com/question/10120pwo
讲一下volatile涉及的Java内存模型?==http://m.mianshigee.com/question/10144msa
请介绍一下ThreadLocal?==http://m.mianshigee.com/question/10145xcu
请说一下ThreadLocal的原理?==http://m.mianshigee.com/question/10146ygf
ThreadLocal 内存泄露问题?==http://m.mianshigee.com/question/10147exw
请介绍一下 ThreadPoolExecutor 类?==http://m.mianshigee.com/question/10148hgy
ThreadPoolExecutor 构造函数重要参数分析?==http://m.mianshigee.com/question/10149tfa
ThreadPoolExecutor 饱和策略?==http://m.mianshigee.com/question/10150vgo
ThreadPoolExecutor 创建方法最佳实践?==http://m.mianshigee.com/question/10151ccw
说说并发与并行的区别?==http://m.mianshigee.com/question/10155exo
为什么要使用多线程?==http://m.mianshigee.com/question/10156wet
使用多线程可能带来的问题?==http://m.mianshigee.com/question/10157bqv
说说线程的生命周期和状态?==http://m.mianshigee.com/question/10158fah
说说线程优先级?==http://m.mianshigee.com/question/10159tvo
守护线程和用户线程的区别?==http://m.mianshigee.com/question/10160sfm
什么是上下文切换?==http://m.mianshigee.com/question/10161ise
什么是线程死锁?如何避免死锁?==http://m.mianshigee.com/question/10162ant
守护线程是什么?==http://m.mianshigee.com/question/10434qoy
Java 多线程有几种实现方式?==http://m.mianshigee.com/question/10435iih
sleep() 和 wait() 有什么区别?==http://m.mianshigee.com/question/10436nqc
notify()和 notifyAll()有什么区别?==http://m.mianshigee.com/question/10437lcv
线程的 run() 和 start() 有什么区别?==http://m.mianshigee.com/question/10438gcn
创建线程池有哪几种方式?==http://m.mianshigee.com/question/10439vql
线程池都有哪些状态?==http://m.mianshigee.com/question/10440eod
在 Java 程序中怎么保证多线程的运行安全?==http://m.mianshigee.com/question/10441jgu
在 Java 程序中怎么保证多线程的运行安全?==http://m.mianshigee.com/question/10442cel
多线程中 synchronized 锁升级的原理是什么?==http://m.mianshigee.com/question/10443qdm
怎么防止死锁?==http://m.mianshigee.com/question/10444gvq
ThreadLocal 是什么?有哪些使用场景?==http://m.mianshigee.com/question/10445nuy
synchronized 和 Lock 有什么区别?==http://m.mianshigee.com/question/10446nqo
四、Spring
Spring-事务,事务传播 如果存在A依赖B,B依赖A,那么是怎么加到IOC中去的 beanFactory的理解,怎么加载bean FactoryBean的理解 bean的生命周期 spring中的自动装配方式 BeanFactory 和 FactoryBean Spring IOC 的理解,其初始化过程? BeanFactory 和 ApplicationContext? Spring Bean 的生命周期,如何被管理的?Spring Bean 的加载过程是怎样的? Spring 中用到了那些设计模式? Spring 循环注入的原理? Spring 如何保证 Controller 并发的安全? springmvc的运行机制,dispatch -> hanldermapping-—>handler ->handlerAdapter->执行handler->modelandview -> 返回mv -> 视图解析器->返回view -> 渲染响应
五、JVM
JVM内存模型
脑海里要有JVM内存图
1)JVM栈
栈由栈帧组成;
栈帧就相当于方法,栈帧由局部变量表(存放基本数据和引用)、操作数栈(存放等号右边零时变量)、动态链接、方法出口(记录下一个栈帧位置)组成
2)本地方法栈
调用本地方法,也就是native修饰的方法
3)程序计数器
为了调度,程序挂起后,恢复继续执行
4)方法区
存放常量/静态变量/类结构信息
5)堆
分为新生代和老年代==>1:2;新生代分为Eden+S1+S2==>8:1:1
GC可达性分析:GCroot对象不可达的对象可以被垃圾回收;两种垃圾回收==>minor GC和Full GC
可作为GC root的对象:栈中引用的对象;方法区的常量和静态变量;
Java 对象的创建过程?
类加载检查
new指令,检查参数是否能在常量池中定位到这个符号引用
检查这个符号引用代表的类是否被加载、解析和初始化过==>如果没有就执行类加载过程
分配内存
在堆中划分确定的内存分配
分配的方式:指针碰撞和空闲列表(是否规则决定,GC收集器有没有压缩整理功能决定)
初始化0值
保证类中的成员变量不赋初值零值也能够直接用
设置对象头
对象头会设置 锁的状态信息;hashCode;GC分代年龄等
执行init方法
http://m.mianshigee.com/question/10043rbu
对象的访问定位的两种方式
句柄和直接指针
句柄:
句柄池(堆中)存着具体的地址
直接指针:
指针指向具体的数值
如何判断对象是否死亡(两种方法)?
引用计数法
引用计数器,一个引用+1;失效引用-1;为0就被回收
但是不用它,因为有循环引用问题,永远不会被回收
可达性分析
用GC roots对象作为起点,向下遍历的对象都可用,没有遍历到的都失效
GC roots对象:
Java栈中的引用对象
方法区中静态和常量引用的对象
本地方法区中引用的对象
介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)?
http://m.mianshigee.com/question/10046wsa
强引用:死(OOM)也不回收
软引用:空间不足才回收
弱引用:执行垃圾回收机制就回收;ThreadLocalMap中的key值(ThreadLocal)就是弱引用
虚引用:
虚假的,不决定生命周期,任何时候都可能被回收
主要是用来跟踪对象垃圾回收的活动;一般和引用队列一起使用
引用队列:回收之前会放入队列中执行,类似于后置通知
如何判断一个常量是废弃常量 ?
没有对象引用的常量就是废弃常量;回收的话会被清理出常量池
如何判断一个类是无用的类?
满足三个条件就“可以”被回收
1.堆中不存在该类的任何实例
2.该类的ClassLoader已经被回收
3.该类对应的java.lang.Class对象没有被任何地方引用,无法通过反射访问该类的方法
Java垃圾收集有哪些算法,各自的特点?
复制算法:分成两个大小相等的内存区域,当用完一块的时候将活着的对象复制在另
标记清除
标记整理
分代算法
http://m.mianshigee.com/question/10049vbx
HotSpot为什么要分为新生代和老年代?
1.新生代由Eden区和s1、s2组成
每次使用空间不超过90%,主要用来存放新生对象
Minor GC主要发生在新生代,采用复制算法,每次收集后Eden区和survivor区要被清空一块
2.老年代使用Full GC,采用的标记-清除算法
常见的垃圾回收器有那些?
Serial:
单线程
STW
-XX:+UseSerial GC后,会配合Serial old使用。新生代:复制算法,老年代:标记整理算法
ParNew:serial的多线程版本
多线程
STW
-XX:+UserParNewGC后,会配合serial old使用
Parallel
追求的是高吞吐量,并行的新生代收集器
会配合Parallel Old使用
Serial old:
可作为CMS的后备方式
Parallel old
Parallel的老年代收集器
CMS:并发标记清除
追求的是最短停顿时间,没有STW
+UseConcMarkSweepGC,ParNew+CMS+Serial Old使用
G1
如何选择垃圾收集器?
单核cpu或者小内存:+UseSerialGC===单机程序
多核cpu,需要最大吞吐量:+UseParallerGC/UseParalleOldGC==后台计算型应用
多核cpu,追求低停顿时间:+UseConcMarkSweepGC/+ParNewGC==高响应的互联网应用
介绍一下CMS,G1收集器?
CMS:
追求的是最短回收停顿时间,它是第一次实现用户线程和垃圾回收线程时工作的收集器
算法:标记清除算法
步骤:初始标记(GC root)--并发标记(可达性分析)--重新标记(保证用户线程继续运行导致的变化)--并发清除
优缺点:
优点:并发收集、低停顿
缺点:标记清除算法会产生大量碎片;无法清除浮动垃圾;对cpu资源敏感
G1:
思想:将内存化整为零,将堆分成很多小块,整体上用“标记整理算法”,局部用的是复制算法
既满足停顿时间要求,又具备高吞吐量
步骤:初始标记--并发标记--最终标记--筛选回收
优点:低停顿、高吞吐量、不会有碎片
Minor Gc和Full GC 有什么不同呢?
Minor GC:新生代
Full GC:又叫major Gc发生老年代,出现Full GC经常伴随着至少一次Minor GC
六、Mysql
事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别? MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别? MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景? 查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序 索引为什么要用B+树,B+树和B-树的区别是什么 mysql锁,行锁,表锁 ,什么时候发生锁,怎么锁,原理 数据库优化,最左原则啊,水平分表,垂直分表 MySQL B+Tree索引和Hash索引的区别? sql查询语句确定创建哪种类型的索引?如何优化查询? 聚集索引和非聚集索引区别? 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁? 使用explain优化sql和索引? MySQL慢查询怎么解决? 什么是 内连接、外连接、交叉连接、笛卡尔积等? mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决? varchar和char的使用场景?
其他
怎么防止表单重复提交
前端:提交完置为只读(有风险)
后端:缓存判断
HashMap
循环数组
LRUMap
没整理出来分类和答案的
讲一讲集合框架整体框架
ArrayList和HashSet的区别
为什么HashMap要在8的时候树化:泊松分布概率(源代码注释)
HashMap线程安全的方式:Hashtable和ConcurrentHashMap的各自特点,能讲多深就多深
为什么Hashtable被弃用了,jdk7和8的区别
锁的分类:乐观、悲观、自旋、读写、分段锁
Spring IOC底层实现:xml+dom4j+工厂+单例
索引不适用的条件:索引列上有函数、不满足最最前缀、使用了不等号、使用了范围查询
索引分类:B-Tree索引、Hash索引、全文索引、单值索引、唯一索引、复合索引、聚簇、非聚簇
线程池了解多少:executors创建、ThreadPoolExecutor的七个参数
拒绝策略分别使用在什么场景
Spring AOP底层实现:动态代理,newProxyInstance,cglib,ASM
讲一下代理模式:动态代理和静态代理
你都了解什么设计模式,在JDK中怎么体现
千万级别的数据量的list找一个数据(多线程)
讲一下JVM堆内存管理:
栈上分配->TLAB->新生代、老年代->可达性分析->GC算法->所有垃圾回收器及其优缺点
到底多大的对象会直接被扔进老年区
G1有两个region不是连续,而且之间有可达引用,我现在要回收一个,另一个会被怎么处理
听说过CMS的并发预处理和并发可中断预处理
平时怎么学习和职业规划
百万级int数据量的一个Array求和(fork/join)
synchronized和reentrantLock底层实现以及重入的底层原理:
moniter AQS,重入原理:entry,count,state
锁的四种状态和升级过程
CMS和G1的异同
G1什么时候会引发full GC
除了CAS,原子类,syn,lock还有什么是线程安全的方式 (final)
HashMap和Hashtable有什么区别
允许null键的map你知道哪些:HashMap,LinkedHashMap,weakHashMap
null键放在HashMap的哪里:底层数组的0号位置
为什么Hashtable的扩容是2倍+1:从除留余数法,初始容量方面回答
红黑树的插入时间复杂度
解决哈希冲突的方式
现在有1T数据,内存只有1G,该怎么对他们进行排序:多路归并
Tomcat为啥要重写类加载器
TCP握手挥手及其状态转换
mysql的隔离级别
B树和B+树的区别
Java运行时数据区
说一个你最熟悉的垃圾回收算法
吞吐量优先和响应时间优先的回收器是哪些:parallel scavenge和CMS
类加载全过程
线程池7个参数
ConcurrentHashMap底层原理
手写一个LRU:LinkedHashMaP
HashMap为啥不用AVL树,而用红黑树
为什么8就变成树了,为什么6的时候退回成链表
线程池的7个参数怎么配置最好
说一下volatile
volatile的可见性和禁止指令重排怎么实现的:
可见性是缓存一致性协议;
禁止指令重排:JMM里面有8个指令完成数据读写,通过其中load和store指令相互组合成四个内存 屏障实现的
CAS是什么
PriorityQueue底层是什么,初始容量是多少,扩容呢
HashMap为啥容量要设计成2的幂次
你知道跳表吗,什么场景会用到 ?
ConcurrentSkipListMap 在多线程下需要自定义排序顺序时
CopyOnwriteArrayList知道吗,迭代器支持fail-fast吗?
线程安全ArrayList写时复制,迭代器是采用快照风格,不支持fail-fast
innodb底层数据结构
为什么用B+树不用B树
为什么用B+树不用红黑树
线程池的设计体现了什么设计模式
知道责任链设计模式吗
wait/notify体现了什么设计模式
Spring事务传播
IOC底层原理
怎么判断内存泄露
怎么在日志里排除错误,该用哪些Linux命令
MySQL原子性和持久性怎么得到保证的? undolog redolog
怎么解决幻读 MVCC+间隙锁
innodb和myisam区别
对象创建过程
对象在内存中的存储布局:对象头,类元指针,实例数据,对其填充
对象头具体包括什么
对象怎么定位:直接指针,句柄
堆怎么划分
对象怎么分配 : 栈上分配-TLAB-new-old
具体讲一下CMS流程
锁的四种状态
Object obj = new Object()这句话在内存中占用了多少内存 :引用变量48byte,对象头18byte,对齐填 充增量16byte,一共20Byte
Synchronized和ReentrantLock的异同
你怎么看待接口和抽象类
主键索引设计应该采用B-tree索引还是hash索引
设计模式说5,6个
说一下你了解的MQ
你对高并发的理解,会从什么角度设计高并发程序
JUC包里面限流是怎么做到的 : Semaphore和guava ratelimiter
索引不适用的条件
说一下NIO和AIO
AIO里面设计模式:观察者模式
说一下select,poll,epoll
线程池中 CachedThreadPool里面用的是什么阻塞队列:SYnchronousQueue
那你知道LinkedTransferQueue和SynchronousQueue有什么区别吗
你还知道什么阻塞队列,能具体说说他们的特点吗?
线程池的线程数怎么设置比较好
CAS的ABA问题怎么解决
Java内存模型:JMM共享内存模式以及8个原子操作指令
什么叫做阻塞队列的有界和无界
cookie和session:splash
说一下反射,反射会影响性能吗
谈一下AQS:
为什么你说AQS底层是CAS+volatile:
state是volatile修饰的,并且state的方法除了setState,还有CompareAndSetState
JUC包里面同步组件主要实现了AQS的哪些主要方法
tryAcquire
tryRelease
tryAcquireShared
tryReleaseShared
isHeldExclisovely