Java面试题--自用

本文介绍了Java对象在内存中的存储布局,包括对象头的组成和对象创建的过程。讨论了ArrayList与LinkedList的区别,JDK1.8的新特性,以及Java接口与抽象类的异同。此外,还涉及了Java异常处理、重写与重载、String与StringBuilder的对比,以及线程池中execute()和submit()的区别。通过对这些面试常见问题的解答,帮助读者深入理解Java编程和JVM的工作原理。
摘要由CSDN通过智能技术生成

每天进步一点点

一个字节 = 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的,抽象类中可以定义成员变量,由抽象方法的嘞必须被声明为抽象类,而抽象类未必要有抽象方法,抽象类中可以包含静态方法,一个类只能继承一个抽象类。接口中不能定义构造器,方法全部都是抽象方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值