1、重载、重写的区别
重载:发生在同一个类中,方法名相同,参数列表、返回值不同;
重写:发生在继承、实现关系中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类;
2、String、StringBuffer、StringBuilder区别,String为什么是不可变的
首先String被final修饰,所以是不可变的
StringBuffer、StringBuilder都继承AbstractStringBuilder类,StringBuffer对方法加了同步锁,所以是线程安全的
StringBuider是非线程安全的
3、==与equals
==:判断两个对象地址是否相等,引用类型判断内存地址
equals:如果覆盖了equals方法,引用类型判断存储的值
String的equals方法是被重写过的
4、Java中的异常
Error、Exception两种类型,都继承Throwable
Error:程序无法处理的错,比如程序终止,宕机等等
Exception:程序本身可以处理的异常
try-catch-finally:捕获异常,catch匹配异常,finally一定执行
finally不执行的情况:finally代码中异常,执行finally之前退出程序,程序所在线程死亡,CPU关闭
throw:抛出异常
5、接口、抽象类的区别
1、抽象类可以有非抽象的方法
2、一个类可以实现多个接口,只能继承一个类
3、实现接口需要实现所有方法,抽象类不一定
6、JVM调优、内存泄露
VisualVM:JDK自带工具
调优关注点:
查看堆空间分配大小
提供即时垃圾回收功能
垃圾监控
查看堆内类、对象信息(数量、类型)
内存泄露:如果使用的堆大小越来越大,则堆空间可能会被无法回收的垃圾对象占满
对比垃圾回收前后,对象引用情况分析,基本上可以找到泄露点
7、JVM内存管理
PC寄存器:
记录线程运行位置,每个线程独有,线程阻塞恢复挂起等操作都需要用到
虚拟机栈:
创建线程时创建,用于存储栈帧,存储方法运行时临时数据、中间结果
堆
用于存储对象
方法区
存储静态变量,运行时常量池
运行时常量池
本地方法栈
支持natvie方法
分带算法:
新生代:活不了多久,例如局部变量
老年代:生命周期长的对象
永久代:class这些,无法回收,存储在方法区
8、集合部分
8.1、ArrayList、LinkedList异同
1、数据结构不同,ArrayList数组结构,LinkedList是双向链表结构
2、ArrayList查询效率高,LinkedList插入、删除效率高
8.2、线程安全的集合
Vector、CurrentHashMap、Hashtable
8.3、HashMap
数据结构:数组、链表、红黑树,链表长度大于8,转为红黑树结构
链表结构为了解决哈希冲突
concurrentHashMap实现线程安全:使用synchronized和cas实现
9、Java多线程
9.1、synchronized、volatile
synchronized为了解决多线程之间访问资源同步性,用它修饰方法、代码块能保证在任意时间只能由一个线程执行此代码
volatile只能用于变量,主要解决变量在多个线程中可见性,不保证数据的原子性,synchronized主要是解决多线程访问资源的同步性
9.2、线程池
优点:降低资源消耗、提高响应速度、提高线程的管理性;
如何创建?
ThreadPoolExecutor:
核心线程、最大线程数、工作队列、非核心线程存活时间、拒绝策略
执行流程:出现新的线程任务,分配一个空闲线程执行,如果没空闲线程,如果当前线程数 < 核心线程,创建一个新线程处理任务,达到核心线程数,工作队列未满,放入工作队列等待,工作队列满了,存货线程不大于最大线程,创建新线程,达到最大线程数,使用拒绝策略