Java面试复习之Java深入解析一

  1. 关键字与非关键字:goto在c和c++中是关键字,但由于其打破了正常程序的流程。因此在Java中,取消了goto的使用。但是为了将goto定义为标识符,Java语言仍将goto定义为关键字。由于是从未使用的关键字,因此称为“保留字”。const在c和c++中定义常量。但是在Java中与goto类似也被定义为关键字(保留字)。true、false和null是不是关键字,true和false是boolean类型的字面常量。null是引用类型的字面常量。因此以上5字符串不能作为标识符使用。
    不常用的关键字有:transient、assert、strictfp、volatile、native。
  2. 表示符定义规则:首字符必须使Character类中的isJavaIdentifierStart()方发返回true,其他字符必须使isJavaIdentifierStart方发返回true;不能是关键字;不能是字面常量;长度不能超过系统所支持的范围。
 System.out.println(Character.isJavaIdentifierStart('9'));

运行结果

false

3."$"(dollar符)被编译器所使用,在源文件(.java)编译成字节码(.class)后,"$“会成为顶层类与嵌套类之间的连接符。因此要避免“$”的使用。
4. 标识符的最大长度:最大长度为65535,长度仅限于除null以外的其他ASKII字符,若果出现这些字符以外的字符,最大长度会减小。
5. 转移符:“\uxxxx”代表Unicode转义,”\xxx"代表八进制转义。对于增补字符,Unicode使用两个两个字符来进行转义。
A的三种表示方发:

char ch1='A';//ASKII码为65
char ch2='\101';
char ch3='\u0041';
System.out.println(ch1==ch2&&ch2==ch3);

运行结果为true。
Unicode转义字符处理的非常早,在编译器将程序解析成各种符号之前,就会先将Unicode转义字符转换成其表示的字符。

char ch1='\u000a';//换行符
char ch2='\u000d';//回车符
System.out.println("OK");

这段代码跑不出“OK”,即使是注释掉前两行也跑不出来。因为Unicode转义字符比注释符处理的早。如果注释掉,以上代码类似于:

//char ch1='
        ';
//char ch2='
        ';

这样的代码当然不会通过编译了。相对于Unicode,编译器对转移序列符和八进制转义的处理要晚。可以写成‘\n’和‘\r’或‘\12’和‘\15’。
6.增补字符:增补字符使用两个字符(一个代理对)对其进行编码,代理对中的每个字符编码被保留,也就是说这个编码并不会对应一个字符。否则,会出现两个字符到底是代表两个字符还是一个代理对的歧义。
7.类型转换:如果将int类型的变量 i 对byte、short、char进行赋值。则会出现编译错误。(final修饰的变量可以当成常量)如果将整型字面常量(没有超过所对应的类型的范围)赋给以上三个变量,编译器可以做隐式的类型转换。

int i=1;
byte j=i;

出现编译错误。byte j=128; 也会出现编译错误。加强转时输出为-128。
char、short、byte参与运算时,结果为int。符合赋值运算符可以自动的将结果转化为左侧的操作数类型。

int a=1;
byte b=1;
b+=a;//相当于b=(byte)(b+a);

从byte到char的转换成为扩展收缩转换。byte先转换成int(扩展符号位),在将int转换为char(截取低16位)。因此正数在转时值不发生变化。负数在转时,值会发生变换。(操作数有符号时扩展符号位,无符号时扩展位为0)。
8.浮点类型的悬疑:由于计算机底层是二进制存储,因此浮点型的数只能被近似存储。

double d1=0.1;
double d2=0.2;
System.out.println(d1+d2==0.3);

返回false。
除了不精确存储外,浮点数还有不连续存储。两个相邻的数的间隔随着数的增大而增大。

float f1=300000000;
float f2=300000000;
System.out.println(f1+1==f2);

因为与f1相邻的下一个数与f1的差值大于1,因此加1相当于没加,所以返回true。因此无论是很大或是很小的int转为float和long转为double时会出现精度损失。这是就会采用IEEE754最近舍入模式提取与该值最为接近的浮点值。
浮点转整型,NAN(not a number)变0;
如果是无穷,就会变(相应类型的)最值;
其他转整型,就向0靠拢。
Math中关于浮点数的方发:
ulp:返回参数的间隔。
nextup:返回下一个浮点值。
nextAfter:返回指点方向上的浮点值。
9.for循环与加强型for循环的对比:
加强型for循环的优势与缺点:
优势:操作便利。
缺点:只能对元素进行顺序访问。
只能访问数组(集合)中的所有元素。
没有当前索引,无法对指定元素进行操作。
底层实现:是基本的for循环。但是加强型for循环的条件是右侧变量必须是数组或者Iterable类型。因为for循环对集合进行访问时要用到迭代器。因此加强型for循环可以遍历的集合需实现Iterable接口

猜你喜欢

转载自blog.csdn.net/Hello_1024/article/details/83187048