整理一下最近面试遇到过的问题,有一些想不起来了,希望能给大家一点帮助吧,也给自己留个底,嘿嘿,平时还是得多注意知识的积累,以及技术细节
- 1.JAVA基础类型各占几个字节?
bit 字节
int 32bit 4
short 16bit 2
long 64bit 8
byte 8bit 1
char 16bit 2
float 32bit 4
double 64bit 8
boolean 1bit 1或者4
boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。
- 2.如何保证同步
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池 等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中 等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。
同步机制实现方式包括但不限于:
①ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile
- 3.什么是CAS
CAS的全称是Compare And Swap 即比较交换,乐观锁,无锁。其算法核心思想如下
执行函数:CAS(V,E,N)
其包含3个参数
V表示要更新的变量
E表示预期值
N表示新值
CAS操作需要我们提供一个期望值,当期望值与当前线程的变量值相同时,说明还没线程修改该值,当前线程可以进行修改,也就是执行CAS操作,但如果期望值与当前线程不符,则说明该值已被其他线程修改,此时不执行更新操作,但可以选择重新读取该变量再尝试再次修改该变量,也可以放弃操作
- 4.Spring IOC/DI 及其原理
Spring本身就是一个大的容器,来管理各种Bean,通常用来整合其它框架。优秀!
Ioc不是一种具体的技术,而是一种设计思想,Ioc的目的是为了如何指导我们编写出更加松耦合,更加优雅的程序。传统的应用程序使我们在类的内部显式的创建依赖的对象。从而导致类于类之间耦合度过高。而使用了Ioc的设计思想,将对象的创建,查找依赖,以及生命周期的控制权交给了Ioc容器。对象之间耦合较松,更加灵活。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。DI通过反射实现
- 5.AOP是什么,怎么实现的
AOP面向切面编程,是对业务流程中某一类共性功能的横向抽取。比如事务处理,消息通知。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
- 6.单列索引和组合索引
联合索引-使用结论:
1、查询条件中出现联合索引第一列,或者全部, 则能利用联合索引.
2、条件列中只要条件相连在一起, 无论前后, 都会利用上联合索引,
3、查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询。
单一列索引-使用结论:
1、只要条件列中出现索引列,无论在什么位置,都能利用索引查询.
优