面试知识点总结之JAVA

1. volatile关键字的作用

(1)保证内存可见性
每次访问变量都会进行一次刷新,因此每次访问都是主内存中最新版本,保证了变量修改的实时可见性。
(2)避免指令重排
指令重排指JVM为了优化指令,提高运行效率,在不影响单线程程序执行结果的前提下,尽可能提高并行度。
volatile可以禁止指令排序,避免多线程中指令重排带来的一些问题。

参考:https://www.jianshu.com/p/cf57726e77f2

2. Synchronized关键字作用,作用域间的区别

作用域有两种:
(1)某个对象实例内,用于修饰方法,可防止多个线程同时访问(若一个对象有多个synchronized方法,访问任一个都会使其他线程不能访问所有的synchronized方法),不同市里的synchronized方法不相干扰
(2)某个类的范围,修饰static方法,对类的所有对象起作用
还可作用于方法块,只对此区块资源进行互斥访问,另一个线程仍可访问非同步代码块。

3. java中的锁相关

  • synchronized(内置锁,可重入)
  • ReentrantLock(可重入锁,比synchronized更灵活)

参考:https://www.cnblogs.com/dolphin0520/p/3923167.html

4. HashMap、HashTable、ConcurrentHashMap的区别

  • HashMap与HashTable对比:
    (1)HashMap非线程安全,HashTable线程安全,内部方法经过synchronized修饰
    (2)性能上HashMap更佳,HashTable已淘汰
    (3)HashMap允许null值存在,HashTable中put只要有一个null就抛出NullPointerException
  • HashMap与ConcurrentHashMap对比:
    (1)ConcurrentHashMap是线程安全的HashMap实现,采用分割(Segment)分段,在每个分段上都用lock锁保护,相比HashTable的syn关键字锁粒度更精细,并发性能更好
    (2)HashMap允许null值,ConcurrentHashMap不允许

5. 多线程编程、线程池相关

  • 三种常见线程池:FixedThreadPool(n,n), CachedThreadPool(0,Integer.MAX_VALUE), SingleThreadExecutor(1,1)
  • 定期/延迟线程池:ScheduledThreadPool, SingleThreadScheduledExecutor
    执行方法:schedule(runnable, delay, unit)
    scheduleAtFixedRate(runnable, 初始延迟, 周期长度, 单位)
    scheduleWithFixedDelay(runnable, 初始延迟, 周期延迟, 单位)

6. Java垃圾回收

回收堆中的空间。
引用计数:从根出发,可到达对象
分代回收:“停止-复制”与“标记-清扫”方式结合。

  • 年轻世代:分为三块Eden、From、To,使用copy and sweep方式,称为minor GC
  • 成熟时代、永久世代:使用mark and sweep方式,称为major GC
  • 全部清理称为full GC

7. JAVA类加载机制

  • 加载:加载字节流,运行时数据结构,生成class对象
  • 连接:
  • 验证:符合JVM要求
  • 准备:类变量分配内存,设置初始值
  • 解析:常量池内符号引用替换为直接引用
  • 初始化:初始化类变量和静态语句块
  • 使用
  • 卸载

8. 面向对象编程的特点,多态如何体现,Java虚拟机中的多态执行机制

(1)OOP
  • 抽象:过程抽象和数据抽象
  • 封装:将数据和其上的操作组织在一起,成为有独立意义的构件
  • 继承:子类自动继承父类中的属性和方法,并可添加新的属性/方法或对部分属性/方法进行重写,增加了代码的可重用性
  • 多态:允许不同类的对象对同一消息做出相应,即同一消息可根据发送的对象不同而采用多种不同的行为方式(继承+重写+父类引用指向子对象)
(2)多态体现

方法的重载和覆盖、对象的向上转型和向下转型

(3)多态执行机制

背景知识:
JVM中类型信息被存放于方法区中,有一个指针指向方法表,表中每一项都是指向相应方法的指针。
调用静态方法指令invokestatic,私有/构造方法invokespecial,非私有实例方法incokevirtual,声明为接口的方法incokeinterface

invokevirtual的步骤:
① 找到操作数栈顶的第一个元素所指向对象的实际类型,即为c
② 若c中找到常量中描述符和简单名称都相符的方法,则进行访问权限校验,通过则返回此方法的直接引用,查找结束;不通过返回 java.lang.IllegalAccessError
③ 否则按继承关系从下往上依次对各个父类进行第二步的搜索和验证过程
④ 未找到合适方法,抛出java.lang.AbstractMethodError异常

以上步骤解释了为何多态需要三个条件:继承、子类重写父类方法、父类引用指向子类对象

  • 由于父类引用指向子类对象,JVM会首先去查找子类对象
  • 由于继承存在,子类方法不可能比父类少,保证了该应用变量可调用的方法在子类中一定存在,因此第二步中一定能查找到调用的方法
  • 找到后即可执行,产生不同的效果(多态)取决于子类重写了这个方法

9. 反射及应用场景

反射:
动态获取信息、动态调用对象方法——对于一个类,能够知道这个类的所有属性和方法;对于一个对象,能够调用它的任意一个方法
应用:
(1)构建基础框架:在xml文件/properties中写好配置,在java类中解析其中的内容得到字符串,利用反射机制获取Class实例,即可动态配置一些东西;
(2)插件:通过反射动态加载程序集,读出类,检查标记后再实例化对象;
(3)扩展未知应用:很多工厂模式就使用的反射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值