-
JVM虚拟机组成,堆分配内存大小
组成:Java栈,本地方法栈,堆,方法区,程序计数器
一般分配不超过物理内存的1/4
-
JVM初始化类的步骤
编译为class文件通过类加载器加载到JVM中;在JVM中验证该文件是否符合虚拟机要求;为类变量分配内存,设置初始值;将常量池中符号引用转为直接引用;初始化类变量和静态代码块
-
GC回收机制,回收算法
GC只发生在堆和方法区,堆又分为元空间(堆外内存),新生区(伊甸园区和幸存区),养老区
回收算法:复制算法,标记清除法,标记压缩法
-
锁(线程同步)
乐观锁/悲观锁: synchronized关键字和Lock 都是悲观锁,CAS算法实现乐观锁
公平锁/非公平锁: 公平锁指多个线程按照申请锁的顺序来获取锁, 等待队列中除第一个线程以外的所有线程都会阻塞 ; Synchronized和Lock都为非公平锁
独享锁/共享锁: 独享锁( Synchronized, ReentrantLock )一次只能被一个线程所持有 ; Lock的 ReadWriteLock 实现读锁是共享锁,其写锁是独享锁
-
多线程的实现方式
继承Thread类;继承runnable接口,重写run方法,start启动
-
重写和重载
-
hashmap的底层实现(和hashtable的区别):
当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,若hash值相同但v值不同就添加到该数组位置下链表的后面
hashmap线程不安全,允许kv有空值;hashtable安全
-
equals和==
==:如果比较的是基本数据类型比较的是变量值,引用数据类型比较的是地址
equals:若没有重写比较的是两个对象的地址 -
反射机制
反射就是在程序运行期间,动态的获取类或者对象中的属性。
获取对象: 对象.getclass();类名.class; Class.forName(“test、Student”);
-
创建对象的几种方法
new关键字;反射; 实现Serializable接口,将一个对象序列化到磁盘上 ,反序列化可以将磁盘上的对象信息转化到内存中
-
final,static,finally关键字
final:修饰的类不可继承,修饰的方法不能被覆盖,修饰的变量只能进行一次赋值操作,并且在生存期内不可以改变它的值
finally:是处理异常的一部分,一般一定会执行
static:表示静态,和类一起出现/消失,作用范围为单个文件;非静态变量作用域为整个源程序
-
Comparable和Comparator的区别
Comparable接口中的CompareTo方法进行排序,表示一个类是有序的,有内在的前后顺序 ;Comparator用来自定义排序
-
String,StringBuilder,StringBuffer的区别
操作少量数据用String且对象是不可不变的,
单线程大量数据用StringBuilder,多线程大量数据用StringBuffer且对象都是可变的
-
抽象类和接口的区别
抽象类使用abstract修饰 ,不能使用new关键字来实例化对象,要被子类继承, 可以做方法实现, 定义的变量是普通变量
接口要被类实现 ,不能使用new关键字来实例化对象, 定义的变量只能是公共的静态的常量
-
Java的深拷贝和浅拷贝
深拷贝:在堆中新开辟一块区域;浅拷贝:复制对象的一个引用
-
Java中的参数传递机制
值传递,传递的是栈中对象存放在堆中的地址, 值是放在堆内存中的 ,本质还是值传递
-
OOM出现原因
GC 开销超过限制
应用程序无意中保存了对象引用,对象无法被 GC 回收,应用程序过度使用 finalizer
内存不足,无法创建新线程 -
Java的IO和NIO
IO面向字节流
NIO面向缓冲区
-
构造器
构造器和类名相同,没有返回值
无参构造器:使用new关键字,初始化值
有参构造器:一旦定义有参就必须显式定义无参 (alt+insert)
-
多态
向上转型:子类对象直接赋给父类引用,父类的方法被子类重写 ——> Father father = new Son();
向下转型:父类若想调用子类的方法必须强制转换 ——> Son son =(Son)father -
collection和collections的区别
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口
-
sleep() 和 wait() 有什么区别
sleep方法属于Thread类中的静态方法,wait属于Object的成员方法。
sleep方法没有释放锁,而wait方法释放了锁