JAVA面试——常见问题
- Java关键字
- transient
- Java的serialization持久化对象实例时,用来表示一个域不是对象串行化的一部分
- native
- volatile
- 表示能够被多个线程异步修改的成员变量
- 确保全部线程看到的指定变量值相同
- 禁止指令重排序
- 实现机制:
- lock前缀指令,造成内存屏障,以前操做必须所有完成
- 对缓存的修改当即写入主存
- 写操做后,其余CPU中的缓存无效
- Java多线程
- Lock与synchronized区别:
- Lock是一个接口,synchronized是java关键字
- synchronized发生异常时会自动释放线程占有的锁,Lock须要手动释放
- Lock能够响应中断
- 提升读操做的效率
- 序列化与反序列化:
- 序列化:对象转换为字节序列
- 序列化用途:对象持久化,保存在磁盘;网络传输对象
- Java NIO:
- Channel(通道)
- IO中的Steam是单向的,Channel双向,可进行读写
- Buffer(缓冲区)
- Selector(选择器)
- 轮询每一个注册的通道,有注册事件发生,进行处理
- 同步非阻塞IO,对IO的读写是同步阻塞的,经过线程复用,将IO准备事件分离
- 单线程管理多个通道,没必要建立并维护多个线程,减小线程上下文切换致使的开销
- SelectorKey表示一个到达的事件

- 同步&非同步、阻塞&非阻塞
- 同步:对象是多个进程或多个线程,可否并发执行,能则两个线程是同步的
- 阻塞:单进程或线程,等待(阻塞)仍是返回标志信息(非阻塞)
- 同步IO&异步IO:
- 同步IO:IO操做完成以前,线程阻塞
- 异步IO:IO操做不会致使请求线程阻塞,IO操做两个阶段都是由内核完成,不会阻塞用户线程
- IO:1)查看是否就绪 2)数据拷贝
- 区别:数据拷贝是由用户仍是内核完成
- 阻塞IO是反映在IO操做的第一个阶段(查看是否就绪)
- JAVA设计模式:
- 代理模式:
- 为其余对象提供代理,控制对此对象的访问(Thread实现Runnable接口)
- 策略模式:
- 单例模式:
- 系统中只有一个实例,用在资源共享
- 数据库链接池、线程池
- 构造函数设置为private,定义static变量储存实例
- 装饰模式:
- 在不改变原类和使用继承的状况下,动态扩展一个对象的功能。
- 经过建立一个包装对象,包裹真实对象
- 工厂模式:
- 原型模式
- 模板方法模式
- 内存泄露:
- 无用对象持续占有内存空间而得不到释放
- 缘由:长生命周期对象持有短生命周期对象
- Servlet、Tomcat、Spring MVC关系
- Servlet:小型JAV程序,运行在Web服务器中处理用户请求
- Tomcat:做为Web应用服务器,是一个Servlet容器,对Servlet进行管理
- 一个基本的流程:
- tomcat接收请求,找到合适的Servlet来处理请求,若是该Servlet没加载,就顺便编译加载到JVM,若是加载了,就调init方法初始化,调Service方法处理request并返回responser,观测Servlet状态变化,在结束时调用destory方法
- Spring MVC:Spring 提供的一个MVC框架,把保存数据Map的Model、页面显示的View、控制器Controller三者分析,简化web项目开发难度
- Spring Boot 将Tomcat设为默认容器,Spring MVC的入口是一个Servlet(前置控制器DispatcherServlet),前置控制器拦截请求,分发给Controller处理
- String StringBuffer StringBuilder
- String用final修饰, 不可变
- 都用字符数组保存字符串char[] value
- StringBuffer加同步锁,线程安全;StringBuilder没加
- 接口与抽象类区别
- 一个类能够实现多个接口,可是只能实现一个抽象类
- 接口中的实例变量是final类型的
- 一个类须要实现接口中的全部方法,抽象类不必定
- 接口中的方法不能实现,抽象类能够有非抽象的方法
- 接口不能经过new实例化,但能够声明
- Servlet
- 负责接收用户HttpServletRequest,并将HttpServletResponse反馈给用户
- 不是线程安全的
欢迎关注本站公众号,获取更多信息