每天进步一点点
一个字节 = 8位二位数
1.对象在内存中的存储布局是什么样子?
答:如果类中生成了String对象,padding仍然要补4个字节,因为生成的String对象的字符串并不存在内存里,存在内存里的是指针。
对象在内存中划分为四部分,markword、classpointer、instance data、padding;
在64位的虚拟机中markword都占8个字节,class pointer默认压缩占4个字节,不压缩占8个字节,此处没有实例数据,因此instance data为0字节,加起来是12字节,12不可被8整除,因此padding补上4个字节,总共为16个字节。
2.Object o = new Object();在内存中占用多少字节?
答:总共占用16个字节;
对象在内存中划分为四部分,markword、classpointer、instance data、padding;
在64位的虚拟机中markword都占8个字节,class pointer默认压缩占4个字节,不压缩占8个字节,此处没有实例数据,因此instance data为0字节,加起来是12字节,12不可被8整除,因此padding补上4个字节,总共为16个字节。
3.对象头具体包括什么?
答:对象头包括markwork与class pointer。
markword主要包括三大信息:锁信息,hashcode,GC(垃圾回收)信息(颜色)。
GC垃圾回收为三色标记法,对象的颜色就保存在markword中。
4.请解释一下对象的创建过程?(半初始化)
第一步,申请空间,设默认值;
第二步,调用构造方法,设初始值;
第三步,建立关联。
5.ArrayList和LinkedList的区别
答:arraylist是基于数组来实现的,linkedlist是基于链表来实现的。linkedlist比arraylist更占内存,因为linkedlist为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
由于arraylist基于数组实现,数据是一整块的放在一起的,当进行插入删除操作时需要将插入或删除位置后面的所有数据进行移动,所以时间复杂度要高一些,为O(n),而linkedlist进行插入删除的时间复杂度为O(1)。
相对于arraylist,linkedlist插入更快,因为linkedlist不像arraylist一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组。
更适用linkedlist的场景:
应用不会随机访问数据,读取数据少,插入删除多。
6.JDK1.8的新特性有哪些?
答: ①接口的默认方法
②Lambda表达式
③函数式接口
7.java接口与抽象类的区别
答:相同:都不能实例化;可以将抽象类和接口类型作为引用类型;一个类如果继承了某个抽象类或者实现了某个接口,都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
不同:抽象类中可以定义构造器,可以有抽象方法和具体方法,接口中的成员全都是public的,抽象类中可以定义成员变量,由抽象方法的嘞必须被声明为抽象类,而抽象类未必要有抽象方法,抽象类中可以包含静态方法,一个类只能继承一个抽象类。接口中不能定义构造器,方法全部都是抽象方