首页 门户 猜你喜欢 最新知识 查看内容

Java面试常见的30道题,你都会吗

2018-3-5 11:14| 发布者: admin| 查看: 591| 评论: 0|原作者: 老男孩|来自: 官网

摘要: Java面试常见的30道题,你都会吗
  1、表达式5.3+(int)(8.5+4.6)/3%4的值是(5.3)。

  2、表示圆周率的常量是(Math.PI)。

  3、使用关键字(boolean)来定义逻辑变量。

  4、用Java写一个线程安全的单例模式(Singleton)?

  当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。

  5、Java中sleep方法和wait方法的区别?

  虽然两者都是用来暂停当前运行的线程,但是sleep()实际上只是短暂停顿,因为它不会释放锁,而wait()意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。

  6、什么是不可变对象(immutableobject)?Java中怎么创建一个不可变对象?

  不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如String、Integer及其它包装类。详情参见答案,一步一步指导你在Java中创建一个不可变的类。


  7、我们能创建一个包含可变对象的不可变对象吗?

  是的,我们是可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。

  8、Java中++操作符是线程安全的吗?

  不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。

  9、a=a+b与a+=b的区别

  +=隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如byte、short或者int,首先会将它们提升到int类型,然后在执行加法操作。如果加法操作的结果比a的最大值要大,则a+b会出现编译错误,但是a+=b没问题,如下:

  bytea=127;

  byteb=127;

  b=a+b;//error:cannotconvertfrominttobyte

  b+=a;//ok

  (注:这个地方应该表述的有误,其实无论a+b的值为多少,编译器都会报错,因为a+b操作会将a、b提升为int类型,所以将int类型赋值给byte就会编译出错)

  10、我能在不进行强制转换的情况下将一个double值赋值给long类型的变量吗?

  不行,你不能在没有强制类型转换的前提下将一个double值赋值给long类型的变量,因为double类型的范围比long类型更广,所以必须要进行强制转换。

  12、用一个例子解释垃圾回收?

  比方说,下面这个方法就会从函数调用。

  voidmethod(){

  Calendarcalendar=newGregorianCalendar(2000,10,30);

  System.out.println(calendar);

  }

  通过函数第一行代码中参考变量calendar,在堆上创建了GregorianCalendar类的一个对象。

  函数结束执行后,引用变量calendar不再有效。因此,在方法中没有创建引用到对象。

  JVM认识到这一点,会从堆中删除对象。这就是所谓的垃圾回收。

  13、什么时候运行垃圾回收?

  垃圾回收在JVM突发奇想和心血来潮时运行(没有那么糟糕)。运行垃圾收集的可能情况是:

  1.堆可用内存不足

  2.CPU空闲

  14、垃圾回收的最佳做法?

  用编程的方式,我们可以要求(记住这只是一个请求——不是一个命令)JVM通过调用System.gc()方法来运行垃圾回收。

  当内存已满,且堆上没有对象可用于垃圾回收时,JVM可能会抛出OutOfMemoryException。

  对象在被垃圾回收从堆上删除之前,会运行finalize()方法。我们建议不要用finalize()方法写任何代码。

  15、什么是初始化数据块?

  初始化数据块——当创建对象或加载类时运行的代码。

  有两种类型的初始化数据块:

  静态初始化器:加载类时运行的的代码

  实例初始化器:创建新对象时运行的代码

  16、如何使用扫描器类(ScannerClass)令牌化?

  privatestaticvoidtokenizeUsingScanner(Stringstring,Stringregex){

  Scannerscanner=newScanner(string);

  scanner.useDelimiter(regex);

  Listmatches=newArrayList();

  while(scanner.hasNext()){

  matches.add(scanner.next());

  }

  System.out.println(matches);

  }

  tokenizeUsingScanner("ac;bd;def;e",";");//[ac,bd,def,e]

  17、执行语句inta,b,c;a=1;b=3;c=(a+b>3?++a:b++);后,b的值为(3)。

  18、表示换行符的字符常量是('')。

  19、若reader是一个Scanner类的对象,读取一个字符串(以空格或回车为结束符)赋值给已声明的String型变量s的语句是(s=reader.next;)。

  20、一个long型数据在内存占(8)个字节。

  21、String和StringBuffer的区别?

  一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。


  22、Java异常的理解?

  异常主要处理编译期不能捕获的错误。出现问题时能继续顺利执行下去,而不导致程序终止。确保程序的健壮性。

  处理过程:产生异常状态时,如果当前的context不具备处理当前异常的能力,将在heap上new出来一个异常对象,停止当前的执行路线,把产生的异常对象抛给更高层的context。

  Throwable:异常类;Error:系统异常;不能恢复;Exception:普通异常;可恢复。

  利用try/catch/finally来处理异常。

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

  基本数据类型包括byte、int、char、long、float、double、boolean和short。java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

  24、进程和线程的区别是什么?

  进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

  25、创建线程有几种不同的方式?你喜欢哪一种?为什么?

  有三种方式可以用来创建线程:

  继承Thread类

  实现Runnable接口

  应用程序可以使用Executor框架来创建线程池

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  26、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

  监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

  27、Java集合类框架的基本接口有哪些?

  Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

  Collection:代表一组对象,每一个对象都是它的子元素。

  Set:不包含重复元素的Collection。

  List:有顺序的collection,并且可以包含重复元素。

  Map:可以把键(key)映射到值(value)的对象,键不能重复。

  28、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

  吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。

  29、Comparable和Comparator接口是干什么的?列出它们的区别。

  Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。

  Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

  30.解释Java堆空间及GC?

  当通过Java命令启动Java进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC是JVM内部的一个进程,回收无效对象的内存用于将来的分配。

  

鲜花

握手

雷人

路过

鸡蛋
| 收藏

最新评论(0)

发表文章
相关资讯
  • 售后服务
  • 关注我们
  • 社区新手

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.