【Java面试题】Java开发实用考试题型和参考答案
2021-12-07 09:10:23
Java开发实用面试题和参考答案共享,java程序员面试过程中不可避免地要有一次专业的考试,那么,面试官在面试时会问些什么问题?下面小编将带您进入面试环节:
简单地说,进程是程序运行和资源分配的基本单元,一个程序至少有一个进程,而一个线程至少有一个线程。流程具有独立的存储器,同时,多个线程共享内存资源,减少了切换次数,提高了工作效率。线程化过程是cpu调度和调度的基本单元,是比程序更小的基本单元,能够独立运行。可以在同一个进程中的多个线程同时执行。
2.你知道守护线程吗?与不受保护的线程有什么不同。
该程序运行之后,JVM将等待非守护线程结束,但jvm不会等待守护线程。GC线程是最典型的例子。
3.多线程上下文切换的含义。
在多线程中,上下文切换是指CPU控制从一个已经运行的线程切换到另一个就绪并等待得到CPU执行权的线程的过程。
4.如何创建两个线程?它们的区别是什么?
您可以使用java.lang.Runnable或扩展java.lang.Thread类。实现Runnable接口比扩展Thread更好.原因有二:
Java不支持多重继承。所以,对Thread类的扩展,意味着该子类无法扩展其他类。执行Runnable接口的类也可以扩展另一个类。
一个类可能只需要可以执行,所以在继承整个Thread类上的开销是很大的。
5.Thread类中的start()和run()方法有什么不同?
start()方法用于启动新创建的线程,而start()内部调用了run()方法,这与直接调用run()方法所起的作用不同。在您调用run()方法时,将仅在原始线程中调用,并且不会启动新线程,start()方法将启动新线程。
6、怎么检测一个线程是否持有对象监视器?
Thread类提供了一个holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true,注意这是一个static方法,这意味着”某条线程”指的是当前线程。
7、Runnable和Callable的区别是什么?
Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。
这其实是很有用的一个特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以方便获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务。
8、你知道哪些垃圾回收算法?
垃圾回收从理论上非常容易理解,具体的方法有以下几种:
1. 标记-清除
2. 标记-复制
3. 标记-整理
4. 分代回收
8、如何判断一个对象是否应该被回收
这就是所谓的对象存活性判断,常用的方法有两种:1.引用计数法; 2.对象可达性分析。由于引用计数法存在互相引用导致无法进行GC的问题,所以目前JVM虚拟机多使用对象可达性分析算法。
10、简单的解释一下垃圾回收
Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。
11、调用System.gc()会发生什么?
通知GC开始工作,但是GC真正开始的时间不确定。
12、64位的JVM当中,int的长度是多少?
Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。
12、int和Integer的区别
Integer是int的包装类型,在拆箱和装箱中,二者自动转换。int是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象。
14、int 和Integer谁占用的内存更多?
Integer 对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
15、string, StringBuffer和StringBuilder区别
String是字符串常量,final修饰:StringBuffer字符串变量(线程安全);
StringBuilder 字符串变量(线程不安全)。
16、String和StringBuffer
String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。
StringBuffer是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer。
但是需要注意现在JVM会对String拼接做一定的优化:
String s=“This is only ”+”simple”+”test”会被虚拟机直接优化成String s=“This is only simple test”,此时就不存在拼接过程。
17、StringBuffer和StringBuilder
StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是JDK 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。 18.编译器常量是什么?使用它有什么风险?
公共静态不可变(publicstaticfinal)变量,也就是我们所说的编译期常量,在这里可以选择public。事实上,这些变量在编译过程中会被替换,因为编译器知道这些变量的值,并且知道这些变量在运行过程中无法改变。这种方法的一个问题是,您使用了内部或第三方库中的公共编译频率,但该值后来被其他人改变,但您的客户端仍在使用旧值,甚至您已经部署了一个新的jar。在更新依赖JAR文件时,确保重新编译程序,以避免这种情况。
19.java用什么类型表示价格比较好?
如果不特别关心内存和性能,使用BigDecimal,否则使用预定义精度的double类型。
20.如何将byte转化为String?
Stringtring接收byte[]参数的结构器进行转换。需要注意的是,正确的代码应该使用,否则将使用平台默认代码。该代码可能与原始代码相同或不同。
21.int能强化为byte类型吗?问题是什么?
我们可以做强制转换,但Java中int是32位,byte是8位。因此,如果强制转换int类型的高24位将被丢弃,byte类型的范围将从-128到128。 以上是Java开发实用面试题及参考答案分享的内容,希望对大家有所帮助。