Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 最新资讯 >

2019年Java开发实用的面试题及参考答案

发布日期:2019-10-26 16:37:40点击次数:

分享到:
  Java开发实用的面试题及参考答案分享,Java程序员面试过程中少不了专业上的考试,那么面试过程中面试官会问些什么问题呢?接下来小编带你一起来进入面试环节:
2019年Java开发实用的面试题及参考答案

  1、进程,线程,协程之间的区别是什么?

  简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。

  2、你了解守护线程吗?它和非守护线程有什么区别

  程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程。守护线程最典型的例子就是GC线程。

  3、什么是多线程上下文切换

  多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

  4、创建两种线程的方式?他们有什么区别?

  通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。相比扩展Thread,实现Runnable接口可能更优.原因有二:

  Java不支持多继承。因此扩展Thread类就代表这个子类不能扩展其他类。而实现Runnable接口的类还可能扩展另一个类。

  类可能只要求可执行即可,因此继承整个Thread类的开销过大。

  5、Thread类中的start()和run()方法有什么区别?

  start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

  6、怎么检测一个线程是否持有对象监视器?

  Thread类提供了一个holdsLock(Objectobj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true,注意这是一个static方法,这意味着”某条线程”指的是当前线程。

  7、Runnable和Callable的区别是什么?

  Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

  这其实是很有用的一个特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以方便获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务。

  8、你知道哪些垃圾回收算法?

  垃圾回收从理论上非常容易理解,具体的方法有以下几种:

  1.标记-清除

  2.标记-复制

  3.标记-整理

  4.分代回收

  9、如何判断一个对象是否应该被回收

  这就是所谓的对象存活性判断,常用的方法有两种:1.引用计数法;2.对象可达性分析。由于引用计数法存在互相引用导致无法进行GC的问题,所以目前JVM虚拟机多使用对象可达性分析算法。

  10、简单的解释一下垃圾回收

  Java垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。

  11、调用System.gc()会发生什么?

  通知GC开始工作,但是GC真正开始的时间不确定。

  12、64位的JVM当中,int的长度是多少?

  Java中,int类型变量的长度是一个固定值,与平台无关,都是32位。意思就是说,在32位和64位的Java虚拟机中,int类型的长度是相同的。

  13、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拼接做一定的优化:

  Strings=“Thisisonly”+”simple”+”test”会被虚拟机直接优化成Strings=“Thisisonlysimpletest”,此时就不存在拼接过程。

  17、StringBuffer和StringBuilder

  StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是jdk1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。

  18、什么是编译器常量?使用它有什么风险?

  公共静态不可变(publicstaticfinal)变量也就是我们所说的编译期常量,这里的public可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖JAR文件时,确保重新编译你的程序。

  19、java当中使用什么类型表示价格比较好?

  如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的double类型。

  20、如何将byte转为String

  可以使用String接收byte[]参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。