JAVA面试——常见问题

  • Java关键字
    • transient
      • Java的serialization持久化对象实例时,用来表示一个域不是对象串行化的一部分
    • native
      • 应用于方法,表示用Java以外的语言实现
    • volatile
      • 表示可以被多个线程异步修改的成员变量
      • 确保所有线程看到的指定变量值相同
      • 禁止指令重排序
      • 实现机制:
        • lock前缀指令,形成内存屏障,之前操作必须全部完成
        • 对缓存的修改立即写入主存
        • 写操作后,其他CPU中的缓存无效
  • Java多线程
    • 线程状态:创建、就绪、运行、阻塞、终止
  • Lock与synchronized区别:
    • Lock是一个接口,synchronized是java关键字
    • synchronized发生异常时会自动释放线程占有的锁,Lock需要手动释放
    • Lock可以响应中断
    • 提高读操作的效率
  • 序列化与反序列化:
    • 序列化:对象转换为字节序列
    • 序列化用途:对象持久化,保存在磁盘;网络传输对象
  • Java NIO:
    • Channel(通道)
      • IO中的Steam是单向的,Channel双向,可进行读写
    • Buffer(缓冲区)
      • 读写数据是都放到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反馈给用户
    • 不是线程安全的
posted @ 2018-12-15 15:28  李怕怕  阅读(102)  评论(0编辑  收藏  举报