Java中“==”和equals的比较

在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。
“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。
例如下面的代码
public static void main(Strint[] args)
{
String str1=new String("abc");
String str2=new String("abc");
if(str1==str2)
{
System.out.println("str1==str2");
}
else
{
System.out.println("str1!=str2");
}
}
可能我们都会以为输出的应该是str1==str2,但是结果却是str1!=str2。这个并不是我们想要的,那么为什么会出现这样的情况的呢,我们仔细想想,在java中不存在指针,存在的只是引用,当我们使用String str1 的时候他并没有创建什么对象,只是在栈内存上开辟了一个空间,用于存放str1我存储的东西,当然我们没有使用new String之前,在str1的空间里的值是NULL。只有当我们调用了new String之后才会真正的在堆内存上去创建str1这个对象的实体。这时候在栈内存中的str1存储的是str1在堆中实体对象的首地址。同样str2也是执行同样的操做。可能还是不懂,下面看一张图片,大家就应该明白了。
Java中“==”和equals的比较
当我们执行上面的代码的时候,str1和str2存储的分别是str1和str2的实体对象的首地址,并不是对象本身,所以输出的结果才是str1!=str2。
下面我们来修改一下上面的代码
public static void main(String[] args)
{
String str1=new String("abc");
String str2=new String("abc");
String str3=str1;
if(str1==str2)
{
System.out.println("str1==str2");
}
else
{
System.out.println("str1!=str2");
}
if(str1==str3)
{
System.out.println("str1==str3");
}
else
{
System.out.println("str1!=str3");
}
}
上面的代码我们创建了一个String对象str3,并将str1负值给str3,这样按照上面的那张图片,str3存储的应该是和str1一样的地址,所以我想大家就知道输出的结果了,str1==str3。
可是我们很多时候想做的并不是这个比较,我们想做的是比较两个对象的值是否相等,我们可以使用Object类中的equals()方法。由于在java中规定所有的类都是Object所以也就会继承这个方法,但是在String类中,String类重写了这个方法,在java帮助文档中给出了如下的描述:

equals

public boolean equals(ObjectanObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true

覆盖:
Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回false

一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。当我比较两个对象的引用的时候,比较只是对象的首地址,只有调用equals()方法的时候我们才能用于比较两个对象的值。