Java中简单的数据比较

数据的比较

这个代码实现都放在了maven项目的单元测试中

int数据类型的比较
  1. 基本数据类型之间的比较 == 都是比较字面量

        @Test
        public void test1_3(){// 测试通过
            int i1 = 127;
            char c = (char) 127;
            Assert.assertTrue(i1 == c);
        }
        @Test
        public void test1_4(){// 测试通过
            int i1 = 127;
            double d = 127.0;
            Assert.assertTrue(i1 == d);
        }
    
    
  2. Integer和int的比较

    其实Integer和int比较的时候,都会进行自动的拆箱和包箱,其实就是Integer中的值和int的值直接进行比较,所以是不管大小的,只要这两个的值相等,这两个变量就相等。

   @Test
    public void test2_1(){// 测试通过
        int i1 = 10;
        Integer i2 = 10;
        Assert.assertTrue(i1 == i2);
    }
  1. Integer和Integer之间的比较

    Integer之间的比较的话就要看数值了,当我们将常量赋值给Integer对象的时候,若是常量在-128到127之间的话,那木就是常量池对象的比较,如果在这个范围外,就是堆里面对象的比较(意味着就成为了引用,需要用equals)。

    如果是用 new Integer()的方式创建了一个对象,那样的话就不管大小,肯定要用equals来进行比较

   @Test
    public void test3_1(){// 测试通过
        Integer i1 = 10;
        Integer i2 = 10;
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test3_2(){// 测试不能通过
        Integer i1 = 128;
        Integer i2 = 128;
        Assert.assertTrue(i1 == i2);
    }

    @Test
    public void test4_1(){ // 测试不能通过
        Integer i1 = 10; // 缓存中
        Integer i2 = new Integer(10); //new 到 堆里了
        Assert.assertTrue(i1 == i2);
    }
    @Test
    public void test4_2(){//测试不可以通过
        Integer i1 = 128;
        Integer i2 = new Integer(128);
        Assert.assertTrue(i1 == i2);
    }

String数据类型的比较
  1. String之间的比较

    当我们给String赋值的时候,这个String对象就会被保存在字符串常量池中,而若是用new String()的方法来创建一个String对象的时候,这个String对象就会被保存在堆中

    @Test
        public void test3(){// 测试不能通过
            String s1 = "he";
            String s2 = new String("he");
            Assert.assertTrue(s1 == s2);
        }
    
    

    当使用 + 来创建一个String对象的时候,编译器会进行优化

        // s3 = "he" + "llo"
        // JVM在编译期间会进行优化:s3为字面量拼接的字符串"hello",存在常量池
        @Test
        public void test2(){// 测试通过
            String s1 = "hello";
            String s2 = "hel" + "lo"; // 编译操作进行优化
            Assert.assertTrue(s1 == s2);
        }
    

    但是若是将两个字符串相加然后比较的话,结果就会与之相反

     // s4是用s2和s3两个常量池中的对象相加新生成的对象,存在堆中
        @Test
        public void test5(){// 测试不能通过
            String s1 = "hello";
            String s2 = "hel";
            String s3 = "lo";
            String s4 = s2 + s3;
            // 字符串相加 底层是 new StringBuilder.append();
            Assert.assertTrue(s1 == s4);
        }
    
    
  2. String的intern()方法

    x是一个字符串,当我们调用 x.intern()方法的时候,若是字符串常量池中已经包含了相当于调用了equals()方法得到的x的对象的字符串,就会返回来自池中的字符串x。若是没有,就会将x添加到字符串常量池中,并且返回对x的引用。那木,对任何两个字符串s和t 若是s.intern() == t.intern()是true的时候 ,那木s.equals(t)也是true。

    intern()方法 若是常量池中有这个对象 则会返回这个对象,若是常量池中没有这个对象 就会返回这个对象的引用
    “hello” 这个创建的时候 会看常量池是否有这个对象的引用,若是有引用 则返回的是引用, 若没有引用,则会在常量池中创建这个对象并返回这个对象

       @Test
        public void test4(){// 测试通过
            String s1 = "hello";
            String s2 = new String("hello");
            Assert.assertTrue(s1 == s2.intern());
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值