Java类型比较

1.使用 == 运算符进行比较

1)基本数据类型使用值对象进行比较
2)基本数据类型和其包装类型比较时,包装类型自动拆箱后进行比较
3)包装类型比较引用地址,IntegerCache类型除外

Java中Integer类型具有IntegerCache,会缓存介于[-128,127]之间的对象。比如:Integer a = 50; 该语句会调用Integer类的valueOf()方法,这个方法会返回一个Integer对象,但在返回前会判断该数值大小是否介于[-128,127],且IntergerCache中是否存在此对象,如果存在直接返回引用,否则就创建一个新的对象返回。IntegerCache是Integer类的内部类,它里面存在一个Integer类型的数组,存放已经存在的且范围在[-128,127]之间的对象。

		Integer a = 50;
        Integer b = Integer.valueOf(50);
        Integer c = new Integer(50);
        System.out.println(a == b);//true IntegerCache中的Integer数组存放了50,调用Integer.valueOf(50)直接返回了引用a赋值给b
        System.out.println(a == c);//false
        System.out.println(b == c);//false
		Integer a = 150;
        Integer b = Integer.valueOf(150);
        Integer c = new Integer(150);
        System.out.println(a == b);//false  150超过了IntegerCache缓存的大小
        System.out.println(a == c);//false
        System.out.println(b == c);//false

4)String类型的比较
对于String类型,我们一般比较它的内容是否相同,所以一般使用equals()方法

当使用 == 运算符比较时,注意比较的是引用!

		String str1 = "home";
        String str2 = "home";
        String str3 = new String("home");
        String str4 = str3.intern();
        System.out.println(str1 == str2);//true
        System.out.println(str1 == str3);//false 
        System.out.println(str1 == str4);//true

当我们直接将字符串常量赋值给String类型的引用时,如String str1 = “home”; 会执行下列操作:
1.先在栈上新建一个String类型的引用,比如 str1
2.然后在常量池中搜索是否存在字符串对象 home
3.如果有直接将引用str1指向该对象;如果没有,则先在常量池中新建一个字符串常量home,然后将str1指向该对象

而我们一般通过new关键字创建对象时,如String str3 = new String(“home”); 会执行下列操作:
1.先在栈上新建一个String类型的引用,比如 str2
2.然后在堆上创建字符串对象home,并将str2指向该对象

String类型的intern()方法是扩充常量池的一个方法:
当一个String对象str3调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用;如果没有,就在常量池中增加一个Unicode等于str的字符串并返回它的引用;

2.使用equal()方法进行比较

equal(Object obj)方法会先判断参数类型是否为Integer类型,如果不是直接返回false。如果是再比较值大小,相等返回true;不相等返回false。

1)基本数据类型无法使用equal()方法进行比较
2)基本数据类型作为equal()方法的参数时,会自动装箱成其包装类型
3)包装类型使用equal()方法比较时,先判断传入参数类型是否为Integer类型,不是直接返回false,如果是再比较值对象

		int a = 50;
        long b = 50L;
        Integer c = new Integer(50);
        Integer d = new Integer(60);
        Long f = new Long(50);
        Long g = new Long(50);
        System.out.println(c.equals(a));//true
        System.out.println(c.equals(b));//false
        System.out.println(c.equals(d));//false
        System.out.println(c.equals(f));//false
        System.out.println(f.equals(g));//true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值