先说几个要注意的地方,然后根据以下的结论来分析两个题目。
1.所有数值类型都有正负号
2.浮点数值有后缀f或F,表示float类型,没有的话默认为double类型,double可加可不加后缀d或D。long型有后缀l或L
3.不同类型运算结果向右靠齐 char<short<int<float<double
4.计算机进行运算是以补码形式进行
5.正数的补码就是原码,负数的补码是除符号位以外其余各位取反+1
6.对象包装器类是不可变的
7.自动装箱规范要求boolean, byte, char<=127,-128-127之间的int和short被包装到固定的对象中
8.==运算,在两边是引用类型时比较两引用是否指向同一对象,在两边是数值类型时,比较两数值是否相等。当一边是包装类型另一边是基本类型时,包装类型会自动解包成基本类型来比较。
9.装箱拆箱是编译期认可的,而不是虚拟机。(语法糖)
10.equals方法要为true的首要条件是同种类型的对象,如果都不是同种类型对象比较的话,肯定是false。equals方法不会处理数据转型关系,但是会根据情况看是否需要拆包。
11.Integer.valueOf()返回一个Integer对象,Integer.intValue()返回一个int值。
一.
链接:https://www.nowcoder.com/questionTerminal/1bab09264a1c4528aa60ee9bca5f0976
来源:牛客网
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
答案:-128, 127
分析:
1.Byte a = 127, Byte b = 127;这两句自动打包。
2.add(++a); 首先是Byte a解包成byte a = 127。然后执行自加操作,byte范围是-128~127,所以自加后a变成-128。add(Byte b)的参数类型是包装类型,又会对byte a = -128打包成Byte,但是Byte是不可变类型,所以实际上add函数并没有更改a的值。最后a的值为-128
3.add(b); 与上面的不同之处就在于没有自加操作,所以b还是127。
二.
周志明《深入理解java虚拟机》316页
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a+b));
System.out.println(c.equals(a+b));
System.out.println(g == (a+b));
System.out.println(g.equals(a+b));
}
答案:
true
false
true
true
true
false
分析:
1.c == d;两个包装类型比较,c,d的值相等并在-128-127之间,被包装到了固定对象中。所以为true。
2.e == f;两个包装类型比较,e,f值相等但是不再-128-127之间,属于两个不同对象,false。
3.c == a+b;a+b会执行解包操作,此时c为包装类型,a+b为基本类型,那么c会自动解包为基本类型来比较,true。
4.c.equals(a+b);a+b首先会进行解包操作将值相加之后再进行装箱。Integer类重写了equals方法,比较的是Integer包装的数值是否相等,true。
5.g = a+b; a+b进行解包成数值类型,c检测到等号右边变成数值类型了,自己也会拆箱成基本类型,尽管左边是long,右边是int,但是只要数值相等,就没有关系。亲测了一下int a = 1;double b = 1。a == b也是true。
6.g.equals(a+b);a+b先拆箱再装箱成为值为3的Integer类型,g为值为3的Long型,两对象不是同一类型所以返回false,可见equals不会把Integer转成Long。
实际上是执行了如下的操作
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == (long)(a.intValue() + b.intValue()));
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));