admin 管理员组

文章数量: 887021


2024年1月13日发(作者:oracle11g使用教程视频)

Java高级面试题及答案,

又有大批人要换工作了,这里整理了很全的java面试笔试题,希望对大家有所帮助!也可以直接在这里查看:

其实,博主还整理了,更多大厂面试题,直接下载吧

Class 文件是一组以 8 位字节为基础单位的二进制流。各个数据项严格按顺序排列。

Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据。这样的伪结构仅仅有两种数据类型:无符号数和表。

无符号数:是基本数据类型。以 u1、u2、u4、u8 分别代表 1

个字节、2 个字节、4 个字节、8 个字节的无符号数,能够用来描写叙述数字、索引引用、数量值或者依照 UTF-8 编码构成的字符串值。

表:由多个无符号数或者其它表作为数据项构成的复合数据类型。全部表都习惯性地以 _info 结尾。

原子性:

一个原子,也就是不能再分的粒子。原子性是指一个或多个操作要么全部成功,要么全部失败。

可见性:

一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)

有序性:

程序执行的顺序遵循代码执行的顺序。(处理器可能会重新排序指令)

Bootstrap ClassLoader(启动类加载器) Extention

ClassLoader(扩展类加载器) App ClassLoader(应用类加载器)

线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行:

1、 线程体中调用了yield方法让出了对cpu的占用权利

2、 线程体中调用了sleep方法使线程进入睡眠状态

3、 线程由于IO操作受到阻塞

4、 另外一个更高优先级线程出现

5)在支持时间片的系统中,该线程的时间片用完

冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:

import ator;

/

* 排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换)

* @author骆昊

*

*/

public interface Sorter {

/

* 排序

* @param list 待排序的数组

*/

public > void sort(T[]

list);

/

* 排序

* @param list 待排序的数组

* @param p 比较两个对象的比较器

*/

public void sort(T[] list, Comparator p);

}

import ator;

/

* 冒泡排序

*

* @author骆昊

*

*/

public class BubbleSorter implements Sorter {

@Override

public > void sort(T[]

list) {

boolean s = true;

for (int i = 1, len = ; i < len &&

s; ++i) {

s = false;

for (int j = 0; j < len - i; ++j) {

if (list[j]pareTo(list[j + 1]) > 0) {

T temp = list[j];

list[j] = list[j + 1];

list[j + 1] = temp;

s = true;

}

}

}

}

@Override

public void sort(T[] list, Comparator p) {

boolean s = true;

for (int i = 1, len = ; i < len &&

s; ++i) {

s = false;

for (int j = 0; j < len - i; ++j) {

if (ppare(list[j], list[j + 1]) > 0) {

T temp = list[j];

list[j] = list[j + 1];

list[j + 1] = temp;

s = true;

}

}

}

}

}

对象头区域此处存储的信息包括两部分:1、对象自身的运行时数据( MarkWord ),占8字节 存储 hashCode、GC 分代年龄、锁类型标记、偏向锁线程 ID 、 CAS 锁指向线程

LockRecord 的指针等, synconized 锁的机制与这个部分( markwork )密切相关,用 markword 中最低的三位代表锁的状态,其中一位是偏向锁位,另外两位是普通锁位。2、对象类型指针( Class Pointer ),占4字节 对象指向它的类元数据的指针、 JVM 就是通过它来确定是哪个 Class 的实例。

实例数据区域 此处存储的是对象真正有效的信息,比如对象中所有字段的内容

对齐填充区域 JVM 的实现 HostSpot 规定对象的起始地址必须是 8 字节的整数倍,换句话来说,现在 64 位的 OS 往外读取数据的时候一次性读取 64bit 整数倍的数据,也就是 8

个字节,所以 HotSpot 为了高效读取对象,就做了"对齐",如果一个对象实际占的内存大小不是 8byte 的整数倍时,就"补位"到 8byte 的整数倍。所以对齐填充区域的大小不是固定的。

Tomcat Valve——Tomcat 4引入的新技术,它允许您将Java类的实例链接到一个特定的Catalina容器。

同步块是更好的选择,因为它不会锁定整个对象(当然你也可以让它锁定整个对象)。同步方法将锁定整个对象,即使该类中有多个不相关的同步块,这通常会导致它们停止执行,并需要等待对该对象的锁定。

同步块要符合开放调用的原则,只锁定需要锁定的代码块中对应的对象,这样可以从侧面避免死锁。

运行时常量池是方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容在类加载后存放到运行时常量池。一般除了保存 Class 文件中描述的符号引用外,还会把符号引用翻译的直接引用也存储在运行时常量池。

运行时常量池相对于 Class 文件常量池的一个重要特征是动态性,Java 不要求常量只有编译期才能产生,运行期间也可以将新的常量放入池中,这种特性利用较多的是 String 的

intern 方法。

运行时常量池是方法区的一部分,受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError。

有俩种可能:

1、 如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务

2、 如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是

AbortPolicy

11、Session与cookie的区别?

12、如何实现数组和 List 之间的转换?

13、动态改变构造

14、说一下 HashSet 的实现原理?

15、单例优缺点

16、标记清除算法( Mark-Sweep)

17.连接池在数据库编程中的作用是什么?

18、创建线程的四种方式

19、多线程场景下如何使用 ArrayList?

20、线程的调度策略

21.乐观锁和悲观锁的理解以及如何实现。有哪些实现方式?

22、栈溢出的原因?

23、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的

24、&和&&的区别?

25、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

26.什么是强引用、软引用、弱引用和虚引用?有什么区别?

27、String 是最基本的数据类型吗?

28、使用sql写出一个分页程序?

29、说一下 JVM 调优的工具?

30、react-redux是如何工作的?

31、Java中有几种数据类型

32、Java线程数过多会造成什么异常?

33、分代回收

34、调优命令有哪些?

35、Object类常用方法有那些?

36、Java 中,Serializable 与 Externalizable 的区别?

37、Executors类是什么?

38、请解释一下什么时候可以使用“.”,什么时候可以使用“[]”?

39.哪个运算符用于创建对象?对象实体和对象引用有什么区别?

40、列出 5 个应该遵循的 JDBC 最佳实践


本文标签: 对象 线程 引用 常量 使用