数据的比较
这个代码实现都放在了maven项目的单元测试中
int数据类型的比较
-
基本数据类型之间的比较 == 都是比较字面量
@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); }
-
Integer和int的比较
其实Integer和int比较的时候,都会进行自动的拆箱和包箱,其实就是Integer中的值和int的值直接进行比较,所以是不管大小的,只要这两个的值相等,这两个变量就相等。
@Test
public void test2_1(){// 测试通过
int i1 = 10;
Integer i2 = 10;
Assert.assertTrue(i1 == i2);
}
-
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数据类型的比较
-
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); }
-
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()); }