1. wait() 和 sleep() 的区别:
sleep没有释放锁, wait() 方法释放锁 。
wait() , notify(), notifyAll()三个方法只能在同步方法或者同步控制块中使用, sleep 可以在任何地方使用。
wait() 方法基于 Object, sleep()方法基于 Thread类。
sleep()方法必须捕获异常,其他线程调用 interrupt(), 会抛出 interruptedException 异常,而 wait() 不需要。
2. HashMap, HashTable, ConcurrentHashMap的区别:
HashTable: 底层数组+链表实现,无论 key 还是 value都不能为 null, 线程安全,实现线程安全的方式是在修改数据时锁住整个 HashTable, 效率低, ConcurrentHashMap做了优化。
HashMap: 底层数组+链表实现,可以存储 null 键和 null 值,线程不安全,扩容整个 map,每次扩容的时候,原来数组的元素依次重新计算存放位置,并重新插入。
COncurrentHashMap: 底层采用分段的数组+链表实现,线程安全,把整个 map 分成 n个Segment, 默认16个桶。提供相同的线程安全,效率提升,读操作不加锁 (HashEntry的 value变量是 volatile 的,可以保证原子性)。扩容是段内扩容,不对整张表进行扩容。
3. spring原理:
通过反射解析类以及类的各种信息,包括构造器,方法以及参数,属性。然后将其封装成 bean 定义信息类,构造器信息类,方法信息类,属性信息类,最终放在一个 map 中。
IOC:动态注入,让一个对象的创建不用手动 new了,可以自动生产,利用的是 java 中的反射,反射就是在运行时去动态的创建调用对象, spring 就是在运行时,跟 spring的配置文件来动态的创建对象,和调用对象中的方法。
AOP: 面向切面编程,在调用某一类对象的具体方法前后调用指定的模块,从而达到对方法扩充的功能。
4. Spring源码:
Spring Bean的创建时典型的工厂模式,最底层的接口BeanFactory, ApplicationContext是 BEanFactory的一个高富帅实现,是 Spring提供的一个高级容器,除了能够提供IOC容器的基本功能外,还为用户提供了其他附加服务,如支持信息源,可以实现国际化,访问资源和支持应用事件。spring中有两种bean,一种是普通的 bean,另一种是工厂 bean.
5.springBean的作用域和生命周期:
(1) 作用域:
singleton: 是否是单例模式,全局只有一个实例
prototype: 每次调用产生一个新的实例
request: 每次请求产生一个 bean,在 webApplicationContext中用
session: 每个用户 session产生一个新的 bean, 不同用户之间的 bean 互相不影响,在 webApplicationContext 中用。
global-session: 作用和 session类似,多个 session 中可以共享,在 webApplicationContext中用。
6. ApplicationCOntext 和 BEanFactory都是 Spring的容器:
BeanFactory 是spring中比较原始比较古老的 Factory, 所以无法支持 Spring插件,如 AOP,Web等功能
ApplicationContext是 BeanFactory的子类,ApplicationContext基本替代了BeanFactory的功能,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并提供了一些其他功能。
ApplicationContext在加载配置文件的时候会创建所有的bean, 好处是预先加载,坏处是浪费内存。
BeanFactory:加载配置文件的时候不会创建所有的 bean,而是等到使用的时候才会创建,好处是节约内存坏处是速度慢。
没有特殊要求的情况下,要使用 ApplicationContext,因为BeanFactory能完成的事情, ApplicationContext都可以完成,并且提供了更多接近现在开发的功能。
7. Object类有哪些方法?
wait(), notify(), notifyAll(), toString(), equals(), finalize() 进行垃圾回收的时候会用到
clone() 克隆出另外一个当前已经存在的对象
hashCode()
8. Spring常用注解:
@Component: 注解声明这是一个 bean 对象
@Autowired 注解声明此处需要一个 bean 类型的对象装配注入
@Service 对于业务逻辑层进行注解
@Controllor 对于控制层进行注解
@Repository 对于 dao层进行注解
@RequestMapping 用于处理请求地址映射,可以作用在类和方法上
@RequestParam 用于获取传入参数的值
@PathViriable 用于获取路径中的参数的值
@RequestBody 作用于方法上,可以将整个返回结果以某种格式返回