6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1; 有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,因为s1是short类型,1是int类型,所以结果自动提升为int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1; 因为+=是java语言的内置的运算符,是一种特殊的运算,不会有编译错误,不会出错。
7、char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字。
补充说明:Unicode编码占用两个字节,因此Java的char类型的变量也是占用两个字节。
其它补充:
基本类型长度(字节)范围
Byte1-128 ~ 127
Short2-32768 ~ 32767
Int4-2147483648 ~ 2147483647
Long8-9223372036854775808 ~ 9223372036854775807
Float4-3.4E38 ~ 3.4E38
Double8-1.7E308~1.7E308
Char20~65535
boolean1true, false
8、用最有效率的方法算出2乘以8等于几?
2 << 3
因为2 * 8 = 2 * 2 ^ 3 = 2 << 3,采用位运算可以提高计算机的运行效率,一个数乘以2的n次方,就可以使用移位运算左移n位。同事如果一个数除以2的n次方,就可以使用移位运算向可移动n位。位运算是CPU直接支持的,效率非常高。
9、请设计一个一百亿的计算器
设计一个百亿计算器,是一件非常麻烦的事情,因为百亿已经超出了int类型的最大值(2147483647,即21.5亿),long值会出现科学计算法的表示,也不太适合直接做这个计算器,需要使用把数字切分成多段,分别进行计算和加合,段与段之间的运算可能会出现越界,需要进行特殊处理,加减法运算相对容易,乘除法就非常困难了,再加上浮点数运算,更是难上加难。
此题主要考查的是面试者是不是知道Java中的大数字运算类的使用。
如果只是大整数运算,使用BigInteger就可以
如果有浮点数据参与运算,就需要使用BigDecimal了
Java中基本类型的浮点数运算是不精确的,需要使用BigDecimal运算,尤其是金融、会计方向的软件
例如:
System.out.println(2.1– 1.2);
结果是:0.9000000000000001
10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
引用变量不能重新赋值,但是引用指向的对象的内容可以改变
例1:
final StringBuffer a=new StringBuffer("test");
a=new StringBuffer(" ");
有编译错
例2:
final StringBuffer a=new StringBuffer("test");
a.append(“123”);
正确
例3:
有些人想要在传参时,防止参数值发生变化,以下做法是错误的:
public void test(final StringBuffer buffer) { }
但是这是做不到的,因为buffer的值是可以改变的,方法体中可以使用buffer.append(“test”)