基本类型与自动装箱与拆箱

先说几个要注意的地方,然后根据以下的结论来分析两个题目。


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())));







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值