面试综合
- 面试综合
-
- JAVA多态的实现原理
- JAVA 中堆和栈的区别,说下java 的内存机制
- wait()和sleep()的区别
- 抽象类和接口的区别
- Override和Overload的含义以及区别
- Hashcode的作用,与 equal 有什么区别?
- Java的四种引用,强弱软虚,以及用到的场景
- Object有哪些公用方法?
- Switch能否用string做参数?
- 进程和线程的区别:
- 数据库事务
- 死锁的必要条件
- CopyOnWriteArrayList
- 线程池
- Vector和ArrayList的区别
- HashMap,ConcurrentHashMap与LinkedHashMap的区别
- Servlet和Filter的区别:
- Mybatis
- Spring事务配置方法:
- 分布式Session框架
- Session与Cookie
- SpringMVC运行原理
- SpringAOP/IOC
- 类加载器工作机制:
- 线程池
- CAS
- Volatile和Synchronized
- String StringBuider StringBuffer
- Synchronized 与Lock
- GC
- 内存模型
- 线程变量
-
原文参考 https://www.cnblogs.com/java1024/p/7685400.html
JAVA多态的实现原理
静态多态:
动态多态:
JAVA 中堆和栈的区别,说下java 的内存机制
栈:存储局部变量/动态链接/出口,线程私有
堆:主要存储对象,线程共享
内存机制:
java运行时内存区域:
数据:堆,虚拟机栈
指令: 程序计数器,本地方法栈
java内存模型:
逻辑内存模型:主内存-->线程内存之间的数据交换方式,线程内存读取主内存数据 然后操作,操作完后写入主内存,和硬件的数据存储模型类似
物理内存模型: 即堆栈,栈 随线程生随线程死,堆线程数据共享,所以重点研究,年轻代/老年代/方法区 eden/s0/s1
wait()和sleep()的区别
wait() Object的方法 释放锁/CPU时间片 等待唤醒
sleep() Thread的方法 阻塞 不会释放锁/CPU时间片just等一会
抽象类和接口的区别
java单继承多实现机制,使用接口更加便于拓展
但抽象类有一个好处,就是适合模板方法
Override和Overload的含义以及区别
Override重写:
重新编写,即实现或者覆盖接口或者抽象类的方法,动态多态,运行时会解析栈区的动态链接,确认调用具体
实现类的方法
Overload重载:
重新载入,即同一个方法名不同的参数(不包括返回值,因为方法签名不包含返回值), 可以理解为静态多态,
类装载时会对字面量解析成具体的方法
Hashcode的作用,与 equal 有什么区别?
hashcode:hash算法需要这个作为依据,比如hashMap,hashSet
equal:一般要求equal相同的情况下 hashcode也需要相同
Java的四种引用,强弱软虚,以及用到的场景
强引用:最常见的引用,比如Object o = new Object();
软引用:WeakhashMap,便于内存回收,当key为null时 自动回收内存
Object有哪些公用方法?
equals/toString/clone/getClass 每个对象的基础方法
wait/notify/notifyall 监视器方法
Switch能否用string做参数?
1.7以后可以,语法糖,编译后仍旧使用的string的hashcode值
进程和线程的区别:
进程:一个tomcat启动就是一个进程
线程:进程更细一步的划分 CPU调度的最小单位
数据库事务
数据库事务的四大特性ACID
A原子性 不会是数据库操作的中间态
C一致性 业务上的 比如转账后的两个账户的总额是一致的
I隔离性
读未提交 脏读
读已提交 不可重复读 可能同一事务两次读取读到的数据不一样
可重复读 幻读 INNOdb 可能是通过缓存 让两次查询数据一样 但如果本事务中做更新操作 却会更新到其他事务已提交的数据
串行 效率慢
不同隔离级别都会有一定的问题,数据严重程度 脏读>不可重复度>幻读
有脏读的问题就有不可重复度 幻读的问题
D持久性 提交了就会持久的保存在数据库中
死锁的必要条件
竞争资源
循环 持续的相互等待
解决死锁:a.顺序加锁解锁解决相互等待 b.设置超时 解决持续等待
CopyOnWriteArrayList
即采用一种乐观锁的思想,认为绝大多数操作都是读数据,所以
对读不采用任何的同步操作,保证读操作的效率,
而针对写操作,直接完全不干涉读操作,复制原有的数组,并操作原有数据,最后再将新数组赋值给旧数组,通过lock加锁保证写操作的线程安全性
存在的问题就是数据的一致性,可能有延迟(即读的可能不是最新的数据) 但能保证数据的最终一致性
适用于读远大于写的操作,比如缓存
线程池
ExcutorServcie pool = new ExcutorService(coreSize,maxSize,bolckQuene,拒收策略)
Vector和ArrayList的区别
一代新人胜旧人,verctor老版本的同步arrayList,
现在线程安全一般都使用Collections.synchronizedList,CopyOnWriteArrayList
HashMap,ConcurrentHashMap与LinkedHashMap的区别
hashMap:线程不安全,数组+链表+红黑树
ConcurrentHashmap:线程安全
LinkedhashMap:线程不安全 hashmap子类,
Servlet和Filter的区别:
功能上的区别:
Filter:主要目的是用于拦截是否处理
Servlet:主要处理业务,
个人觉得Filter和Servlet的关系有点类似Aop和业务的关系,抽取共同的功能进行统一处理 比如字符 鉴权
生命周期的区别:
Servlet:容器启动加载配置的Servlet,调用init,使用中调用doService(),容器销毁destory
Filter:容器启动时加载配置的filter,使用中doFilter()
Mybatis
ORM框架,关注重点在于xml,其作用是便于与数据库交互,主要通过xml的方式,
是对jdbc的封装
其整个原理比较简单,SqlSessionBulider->SqlSessionFactory-->SqlSesion-->(getMapper)-->commit
Sqlsession是核心,包含了执行器,配置文件,事务等
Spring事务配置方法:
切面
编程式TranctionTempleta
声明式@transactional
分布式Session框架
要实现分布式session,两个方式:
1.同一用户或id访问的一直都是同一台服务器
可以利用cookie
session粘连负载均衡算法(可能得手写),
比如通过zuul的过滤器,分布式的每台服务器一个serviceId,计算出一个值,放入cookie中
2.session的数据公共
比如redis
单点登陆是利用coolie记录tooken 而tooken通过一个公共的服务可以查到数据
Session与Cookie
如果没有session,交互时数据全在cookied上,太多不安全,于是cookied通过一个key(jsessionid)指定一个session,然后将这部分数据存在服务器
所以session是cookied的拓展,
Session数据在服务器 设置超时默认是半小时
Cookie数据在浏览器,浏览器 需要加密
SpringMVC运行原理
SpringAOP/IOC
类加载器工作机制:
线程池
CAS
Volatile和Synchronized
String StringBuider StringBuffer
Synchronized 与Lock
GC
内存模型
线程变量
//有一个内部类ThreadLocalMap 参照hashmap实现
//但其中的entry采用的是WeakReference
class ThreadLocal<T>{
public void set(T value){
//以当前线程为key
Thread key = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if(map != null){
map.set(key,value);
}
}
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
}