java中==和equals()

以前一直在使用==比较符合equals()方法去比较两个对象,在使用的时候也是有时候使用==比较符而有时候使用equals()方法.

在使用的时候没有去注意他们的区别,而是很随意的使用,当一种行不通时就去换另一种.  一次在使用test==""在条件判断中时没有达到想要的效果,

就换用了"".equals(test);  然后突然想到他们之间到底有什么区别.于是就做了一些实验想要弄清楚他们之间的区别与联系.

public class EqualsDemo
{
	public static void main(String[]args){
		String s1=new String("test");
		String s2="test";
		String s3="test";
		if(s1==s2)System.out.println("s1==s2");
		else System.out.println("s1!=s2");


		if(s1.equals(s2))System.out.println("s1 equals s2!");
		else System.out.println("s1 not equals s2!");


		if(s2==s3)System.out.println("s2==s3");
		else System.out.println("s2!=s3");
	}
}

运行结果:

运行结果分析:

(1)==比较符是比较两个对象的地址

(2)对于equals()方法不同的类比较的内容不同. 

equals()方法是在Object类中实现的一个方法,在Object类中equals方法是比较两个两个对象的地址.

 public boolean equals(Object obj) {
	return (this == obj);
 }
而java中任何类都可以重写equals()方法来实现自己的比较方式,String类重写了equals()方法. String类的equals()方法不仅会比较两个对象的地址,还会比较他们的字符串的内容.

如果被比较的两个引用指向不同的地址,但是两个地址中的字符串的内容是相同的String的equals()方法仍然会返回true.  而==比较符只会比较地址,如果地址不同就返回false.

 public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }
(3)String test1=new String("test"); 和String test2="test";这两种字符串变量初始化方式是不同的.

String test1=new String("test");这种初始化方式是直接去堆中为String对象分配内存,

而采用String test2="test";这种方式初始化时,编译器会首先去常量池中寻找"test"字符串,如果常量池中有"test"变量,test2这个引用会直接指向常量池中的"test"字符串,

如果常量池中没有"test"这个字符串,会先向常量池中添加"test"这个字符串,然后将test2指向这个字符串.  在声明String test3="test";的时候是直接将test3指向常量池中的"test"变量,所以test2和test3具有相同的地址,而test1和test2地址不同.


总结:==比较符比较两个引用所指向的对象地址,equals()方法比较的内容要根据具体的类来判断,如果重写equals()方法除了判断两个引用是否指向同一个对象外,还会判断两个对象的内容.


后续:

如下代码在程序中想要用==判断test1和letter是否相等。结果在逻辑上出现错误,test1属于类的成员变量,而letter是局部变量,两个变量存储在不同的地方。test1和test2都是类的成员变量,两个变量的值相同时实际是存储在同一个地方的。

public class Test{
	private String test1=null;
	private String test2="A";
	public void test(){
		String letter="A";
		if(test1==null)test1=letter;
		if(test1==letter)System.out.println("test1==letter");
		if(test1==test2)System.out.println("test1==test2");
	}
	public static void main(String[]args){
		new Test().test();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值