Java 基本数据类型错题集

1.关于类型转换问题

对于注释 1 来说,在 s1+1 运算时会自动提升表达式的类型为 int,所以将 int 赋予给 short 类型的变量 s1 会出现类型转换错误(无法编译,IDE 提示错误),除非主动加上强转。

对于注释 2 来说 += 是 java 语法规定的运算符,所以 java 编译器会对它进行转换特殊处理,故可以正确编译执行。

2.装箱拆箱问题

Long 包装类型常量为 -128 到 127 之间,如果数据是该范围内的,都引用同一个对象。

对于注释 1 的语句,由于 l1 和 l2 变量是两个对象,== 比较的是对象的地址,所以打印为 false。

对于注释 2 的语句,由于包装类型在表达式中且表达式中至少有一个不是包装类型,所以 Long l1 == 128L 中 l1 自动拆箱退化为基本类型比较,所以数值比较为 true。

对于注释 3 的语句,所以 l3 和 l4 引用同一个对象,故打印 true。

对于注释 4 的语句类似注释 2 语句,所以打印为 true。

注意:Integer、Short、Byte、Character、Long 的 valueOf 方法实现类似,而 Double 和 Float 比较特殊,每次返回新包装对象。

对于两边都是包装类型的比较 == 比较的是引用,equals 比较的是值。

对于两边有一边是表达式(包含算数运算)则 == 比较的是数值(自动触发拆箱过程),对于包装类型 equals 方法不会进行类型转换。

3.自增自减问题

运行结果是0。

 首先 count++ 是一个有返回值的表达式,返回值是 count 自加前的值,

Java 对自加处理的流程是先把 count 的值(不是引用)拷贝到一个临时变量区,然后对 count 变量加1,接着返回临时变量区的值。

如果想要打印结果为 100 则需要修改 count = count++; 语句为 count++; 即可。

4.字符串相关问题1

对于注释1和2,由于对于字符串,==比较的是对象的地址, equals 比较的是内容。

对于注释3,因为String 源码中 equals 方法有对参数进行 instance of String 判断语句,StringBuffer 的祖先为 CharSequence,所以不相等。

对于注释4和5,由于String的 substring 方法实现里面有个 index == 0 的判断,当 index 等于 0 就直接返回当前对象,否则新 new 一个新的对象返回,而 == 又是地址比较。( 注意:String的toUpperCase 方法内部创建了新字符串对象。)

对于注释6,当两个字符串常量连接时(相加)得到的新字符串依然是字符串常量且保存在常量池中只有一份,而 == 又是地址比较。

对于注释7,当字符串常量与 String 类型变量连接时得到的新字符串不再保存在常量池中,而是在堆中新建一个 String 对象来存放,很明显常量池中要求的存放的是常量,有 String 类型变量当然不能存在常量池中了。

对于注释8,因为对 final 变量的访问在编译期间都会直接被替代为真实的值。

对于注释9,final String s9 = getS9() 其实与 final String s9 = new String(“b”) 是一样的,因为 return “12” 会在堆中创建一个 String 对象保存  ”12”。注意:并非定义为 final 的就保存在常量池

5.字符串相关问题2

string s3 = s1+s2,会在堆中创建几个对象?

答案是3个,+运算符会在堆中建立来两个String对象,也就是说从字符串池中复制这两个值,然后在堆中创建两个对象,然后再建立对象s3,然后将计算后的对象的堆地址赋给s3。

原文地址:https://www.cnblogs.com/mcahkf/p/9055202.html