Java的数据类型分为两种
1.基本数据类型,byte,short,char,int,long,float,double,boolean,只要使用==运算符就可以了,==进行比较只是简单进行比较其中的字节组合。
两个引用变量是否引用到堆上的同一个对象,也可以使用==。
2.复杂的对象类型,通常用equals。
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。equals与其相同。
举例
String s1 = new String("Monday"); String s2 = "Monday";String s3 = "Monday";String s4 = s1.intern();
比较s1,s2是否相同
if (s1 == s2) { // false
System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { // true System.out.println("s1.eauqals(s2)"); } else { System.out.println("!s1equals(s2)"); }程序输出:
s1 != s2s1.eauqals(s2)s1与s2分别引用了两个String对象,所以s1 != s2
字符串缓冲池
程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1将s2引用s1所引用的对象"Monday",所以s1.eauqals(s2)比较s2,s3
if (s3 == s2) { // true
System.out.println("s2 == s3"); } else { System.out.println("s2 != s3"); } if (s3.equals(s2)) { // true System.out.println("s2.eauqals(s3)"); } else { System.out.println("!s2equals(s3)"); }输出结果:
s2 == s3
s2.eauqals(s3)
比较s2,s4
if (s4 == s2) { // true
System.out.println("s2 == s4"); } else { System.out.println("s2 != s4"); } if (s4.equals(s2)) { // true System.out.println("s2.eauqals(s4)"); } else { System.out.println("!s2equals(s4)"); }s2 == s4
s2.eauqals(s4)(java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。
Foo a = new Foo();
Foo b = new Foo(); Foo c = a;if (a == b) { // false System.out.println("a == b"); } else { System.out.println("a != b"); } if (a.equals(b)) { // false System.out.println("a.equals(b)"); } else { System.out.println("!a.equals(b)"); }
输出结果:
a != b
!a.equals(b)if (a == c) { // true System.out.println("a == c"); } else { System.out.println("a != c"); } if (a.equals(c)) { // true System.out.println("a.equals(c)"); } else { System.out.println("!a.equals(c)"); }
输出结果:
a == c
a.equals(c)