zoukankan      html  css  js  c++  java
  • JAVA中对象包装器Wrapper与相应的类型相等判断

    前言:本文解决的问题

    • int a = 122; Integer b = new Integer(122); a==b?

    JAVA为所有的基本类型了提供了一个相应的包装类Wrapper。包装类是不可改变的,一旦构造了,其值就不可以改变,这点跟String是一样的。平时可以把Integer对象直接赋给一个int值,这是由于编译器自动拆箱,这就给人造成一种假象,基本类型和对象包装器是一样的,但是真的一样吗?请看下面:

    public class IntegerTest {
    	public static void main(String[] args) {
    		//int 与Integer对象是否相等
    		Integer a = 10;
    		int c = 10;
    		System.out.println(a==c);	
    		
    		Integer b = 10;
    		System.out.println(a==b);//(-128,127)IntegerCache的范围		
    		int aa = 128;
    		Integer aaa = new Integer(aa);
    		int bb = 128;
    		Integer bbb = new Integer(bb);
    		System.out.println(aaa==bbb);
    		aaa--;
    		bbb--;
    		System.out.println(aaa==bbb);
    	}
    
    }
    

    猜猜结果?

    输出

    true
    true
    false
    true

    分析
    int 与Integer运用相等符号,判断的是值是否相等,第一输出true; a和b这里就是应用了自动装箱autoBoxing,这里明明是不同的对象为什么相等呢?由于JAV会把经常出现的值包装到同一个类中,值的大小比必须在[-128,127]区间中,如果超过这个范围就不成立。因此aaa!=bbb。

    当把aaa和bbb的值分别自减1,编译器将会自动插入一条装箱命令,然后进行自减运算,然后再将结果进行装箱,由于自减后为127再自动装箱规范要求的范围中,因此这两个值被包装为同一类,因此输出又是true了。


    回答开头的问题,
    int a = 122;
    Integer b = new Integer(122);
    If(a==b){//这里相等
    }

  • 相关阅读:
    tcl基本语法
    linux hostid与lmhostid
    linux下uptime命令
    介绍一下 WebApplicationContext?
    Spring 由哪些模块组成?
    怎样开启注解装配?
    解释不同方式的自动装配 ?
    @Qualifier 注解有什么用?
    解释 Spring 框架中 bean 的生命周期?
    如何在 spring 中启动注解装配?
  • 原文地址:https://www.cnblogs.com/java-learner/p/9656603.html
Copyright © 2011-2022 走看看