1.每个Java程序都必须有一个main方法吗?例如,Web容器应用程序回答:是的。甚至一个web容器都有一个main方法,比如tomcat的Bootstrap类的main方法。2、java有无符号(Unsigned)类型吗?答:没有。3.NaN等式问题doubled1=Double.NaN;双d3=d1;System.out.println("d3==d1:"+(d3==d1));上面的代码输出的是true还是false?答:假的。doubled1=Double.NaN;doubled2=Double.NaN;System.out.println("d1==d2:"+(d1==d2));System.out.println("Double.NaN==Double.NaN:"+(Double.NaN==Double.NaN));上面的代码输出的是true还是false?答:假的。综上所述,java中所有的非数值都是不相等的。4、如何判断一个数是否为NaN?答案:使用Double.isNaN(double)或Float.isNaN(float)。其实实现就是一个数不等于自己,就是NAN:publicstaticbooleanisNaN(doublev){return(v!=v);}5、Java中一个汉字占多少个字符?答:两个或四个。java中的char类型使用UTF-16来描述一个代码单元。常用的汉字用一个码元来表示。有些汉字由两个码元表示。一个代码单元代码点包含16位。6、java8中char类型占多少字节?使用什么字符集,使用什么编码?可以保存所有汉字吗?char占2个字节,使用Unicode字符集,使用UTF-16编码。有些汉字无法存储。7、java8中String底层是用char[]存储的,那么String怎么存储char放不下的字符呢?其实是Unicode的设计保证的。为了区分WORD的一个UTF-16编码和WORD的两个UTF-16编码,Unicode编码的设计者预留了0xD800-0xDFFF,称之为Surrogate区。D800-DB7FHighSurrogatesHighSubstitutionDB80-DBFFHighPrivateUseSurrogatesHighSpecialSubstitutionDC00-DFFFLowSurrogatesLowSubstitution8.你知道Unocidecodeunit(代码单元)和codepoint(代码点)的区别吗?或者知道“?”占了四个字节,你知道下面这段代码的输出是什么吗?Strings2="?";System.out.println(s2.getBytes().length);System.out.println(s2.codePoints().count());System.out.println(s.length());System.out.println(s.codePointCount(0,s.length()));答案:4、1、2、1。第一个代表占用多少字节。第二个代表Unicode码点数,即字符数。第三个表示需要几个Unicode编码单元,相当于需要几个chars来存储。第四个也代表字符数。9、下列变量名是否合法?intⅦⅢ音__8s好;内部αβ;诠释IIasdf;诠释$as;诠释_sdf;国际9sdf;答:除最后一项不合法外,其他均合法。也就是说,下划线、美元符号、汉字或者其他语言的字母都可以用来命名变量,都可以作为开头。阿拉伯数字不能作为开头。可以使用以下两种方法来检测一个字符是否可以用来组成变量名或作为变量名的开头。Character.isJavaIdentifierPart('齉');Character.isJavaIdentifierStart('9');10、strictfp关键字的作用Java希望所有在不同机器上的操作都应该有相同的结果,即保证可移植性。例如,doublew=xy/z;许多英特尔处理器会将xy的结果存储在一个80位寄存器中,除以z,然后将结果截断为64位。这会导致更准确的结果并避免溢出。这与使用64位寄存器的计算结果不一致。JVM最初规定所有中间结果都需要截断,但这遭到了数值计算界的反对。因为截断不仅浪费时间,而且会造成溢出。最终,JVM的设计者允许对中间结果进行扩展精度。但是对于strictfp关键字标记的方法,必须使用严格的浮点计算,即截断所有中间值。11.java中有符号左移(<<<)运算符吗?答:没有。只有>>>>><<。12、下面两组代码有什么区别?booleancond1=somemethod1();booleancond2=somemethod2()//第一组if(cond1&&cond2){...}//第二组if(cond1&cond2){...}答案:第一组有一个拦截功能;第二组没有阻塞功能。13.Math类和StrictMath类有什么区别?答:Math类中有些方法不是严格意义上的浮点计算,但是效率更高。所有StrictMath计算都是严格的浮点数。“strict”的含义参考上面++strictfp关键字++的作用。14、byte类型+short类型,得到的是什么类型?下面的代码有问题吗?字节b=1;短s=b;短s1=s+b;答:byte类型+short类型,结果是int类型。所以第三行代码报错。但是它可以自动将byte转short,所以第二行代码就ok了。15、下面s1和s2的字符串会不会存储到字符串池中?字符串s1="asd"+"qwe";字符串s2=s1.substring(1);答:不会。因为只会将字符串常量放入字符串池中,+或substring等操作的结果不会放入字符串池中。16、当字符串池中的字符串不再使用时,是否会被GC回收?它的底层存储是什么?在jdk7之前,字符串池在PermGen空间,无法被GC回收,只能增加PermGen大小。在jdk7中,它被移动到堆中,未被引用的字符串将被gc',降低内存泄漏的风险。字符串池是用类似HashMap的结构实现的。一直到java8,string类型的底层还是存储在char数组中,编码使用utf-16,这样每个字符在内存中可以使用2个字节。java9中提出了紧凑字??符串的概念,在某些情况下可以使用字节数组直接存储字符串,从而节省内存占用。什么时候用char数组,什么时候用byte数组,取决于你存储的内容。17.goto标签可以用在if语句或者block语句中吗?publicclassGoto_Demo{publicstaticvoidmain(String[]args){inIfBlock(true);System.out.println("------------分隔符----");块(真);}privatestaticvoidinIfBlock(booleanbool){end:if(bool){System.out.println("in");if(bool){中断结束;}System.out.println("之后");}System.out.println("输出");}privatestaticvoidinBlock(booleanbool){end:{System.out.println("in");if(bool){中断结束;}System.out.println("之后");}System.out.println("输出");}}上面代码的哪个方法可以输出“after”?答:gotolabel可以用在if语句或者block语句中。以上代码都不会输出“after”。18.数组的长度是否需要在初始化时给出?长度可以可变吗?长度可以为0吗?答:数组初始化时,必须给出“最外层”数组的长度(比如二维数组的最外周就是行)。长度可以是可变的。长度可以为0。请注意,长度为0的数组与null是不同的概念。int[]arr=newint[2];int[][]arr2=newint[2][];int[]arr3=newint[0];19。BinarySearchofArrays(type[]a,typev)返回值r代表什么?答:如果返回值r>=0,表示找到对应元素,返回数组下标值。如果返回值r<0,那么(-r-1)就是插入v元素时为了保持数组a有序应该插入的位置。20、Java支持不规则数组吗?比如下面的代码会不会报错?int[][]arr={{1,2,3},{4,5}}答:支持,没有报错。因为Java其实没有多维数组,只有一维数组。多维数组被解释为数组的数组。例如,二维数组的每一行都是对一维数组的引用,我们可以交换行。21.使用Thread和Math类需要import吗?不需要,所有java.lang包下的java预定义类,使用时不需要导入!Java语言中的java.lang包是编译器直接自动导入的,所以编程时会用到这个包中的类,import导入可以省略。要使用其他包中的类,必须使用import导入
