"equals"和"=="的区别

publicclassckeef{publicstaticvoidmain(Stringargs[]){Strings1,s2,s3,s4;s1=newString("w... public class ckeef

{ public static void main(String args[])

{ String s1,s2,s3,s4;

s1=new String("we are students");

s2="We are students";
s3="We are students";

s4=new String(s1);

System.out.println(s1.equals(s2));

System.out.println(s3==s2);//s2和s3为什么是对的??

System.out.println(s1.equals(s4));

System.out.println(s1==s4);//s1和s4的引用不是一样的么?为什么输出的是false??

}

}
菜鸟求解!!!!!!
展开
 我来答
Jseven_jy
推荐于2017-10-09 · TA获得超过8122个赞
知道大有可为答主
回答量:2499
采纳率:100%
帮助的人:1128万
展开全部
这个确实是容易引起混乱的。。。让人疑惑的。。。

关键在于。。。你要理解s1=new String("we are students");
s2="We are students";
这两个是不一样的。。。。new是用新建一个对象的方法。。。。而后一种是放在常量池中的。。。你一下次再用这种方法去创建的时候。。。就会去常量池里面找,所以
s2="We are students";
s3="We are students";

这两个是相同的。。。指向常量池中的"We are students";。。。

而s1=new String("we are students");
s4=new String(s1);
这两个是不同的对象。。。。。尽管他们的内容是一样的。。。
就像有两个人。。。他们的名字是相同的。。。。但是并不是一样的人。。。。

希望能帮到你。。。这个需要慢慢体会。。。。我刚开始的时候也比较混乱。。。不太理解。。。
雪豹1057200132
2011-05-05 · TA获得超过781个赞
知道答主
回答量:32
采纳率:0%
帮助的人:20万
展开全部
呵呵,很经典的问题.详细说一下,别嫌烦哟~
在java程序设计中,经常需要比较两个变量值是否相等。例如
1、简单数据类型比较
a = 10;
b = 10;
if(a == b){
//写要执行的代码
}
2、引用数据类型比较
ClassA a = new ClassA("abc");
ClassB b = new ClassB("abc");
if(a == b){
//写要执行的代码
}
显然在例1中 a == b的值为true,例2中a == b值为false
你应该有一些java基础吧,下面我用int类型和它的封装类Integer来说明简单类型和封装类型进行比较时的区别:
==和equals()的用法
先看一段代码:
public class TestEqual{
public static void main(String [ ] args){
//简单类型比较
int a = 100;
int b = 100;

System.out.println("a == b?" + (a == b));
//引用类型比较
Integer c = new Integer(100);
Integer d = new Integer(100);

System.out.println("c == d?" + (c == d));
}
}
运行该程序,会打印出以下信息:
a == b? true
c == b? false
可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但他们仍然不同。
why??
要知道,对于这两个引用类型变量c和d,他们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
注意啦,重要结论:
对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象。
*************************************************************************************************************
那么如何比较对象的值是否相等呢?
在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:

Integer c = new Interger(100);
Integer d = new Interger(100);
System.out.println("c equals d?" + (c.equals(d) ));

运行后可得一个true,这是因为,方法equals()进行的是“深层比较”,他会去比较两个对象的值是否相等。

如果你想多学一点,一定会问:“这个可爱的equals()方法是由谁来实现的呢?”
我们知道,java中所有类的父类是Object类,在Object中,已经定义了一个equals()方法,但是这个默认的equals()方法实际上也只是测试两个变量引用是否指向同一对象(即与那个可爱的 == 功能一样)。所以它并不一定能得到你所期望的效果。所以我们还经常需要自己将定义的类(就是上面的TestEqual)中的equals()进行覆盖。像Integer封装类就已经覆盖了Object中的equals()方法,直接可以拿来比较引用类型c和d指向的对象的值。

好了,相信你一定耐心地看到了这里,我们来总结一下
== 和equals()两种比较方法,在使用时要注意:
1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较;
2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
3、如果需要比较两个引用变量是否指向同一对象,则使用“==”来进行比较;
还有,对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。

OK!
你的疑问解决了吗?我的叙述你满意吗?

参考资料: 《java编程思想》Bruce Eckel著 百度文库里就有

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郝林梅77
高粉答主

推荐于2019-08-20 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:238
采纳率:100%
帮助的人:6.6万
展开全部

==  和 Equals 的区别

1. == 是一个运算符。

2.Equals则是string对象的方法,可以.(点)出来。

我们比较无非就是这两种 1、基本数据类型比较  2、引用对象比较

1、基本数据类型比较

==和Equals都比较两个值是否相等。相等为true 否则为false;

2、引用对象比较

==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;

需注意几点:

1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;

2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。

所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;

3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;

拓展资料:

=操作符专门用来比较变量的值是否相等。比较好理解的一点是: 

int   a=10; 

int   b=10; 

则a==b将是true。 

但不好理解的地方是: 

String   a=new   String( "foo "); 

String   b=new   String( "foo "); 

则a==b将返回false。 

对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为 "foo "的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用 "== "操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是 "foo ",应该是“相等”,但是==操作符并不涉及到对象内容的比较。 

对象内容的比较,正是equals方法做的事。 

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dagouaofei
2011-05-05 · TA获得超过494个赞
知道答主
回答量:152
采纳率:0%
帮助的人:0
展开全部
这个问题其实不菜
java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是String str = "abc",虚拟机认为“abc”是常量,放在常量区。下次你再定义String otherStr = “abc", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”abc“,所以不管是equal还是==,都相等,因为值和地址都相等。
另外还有一个区域叫堆,如果String str = new String("abc"), 虚拟机会创建对象放到堆里,再String otherStr = new String("abc"),会在堆里放两个对象。所以==就是false,因为两个对象地址不同。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8950eb8ea
2012-04-13 · TA获得超过326个赞
知道答主
回答量:73
采纳率:0%
帮助的人:36.4万
展开全部
简单的说:==表示比较的是地址,而equals比较的是内容
如:String s1 = new String ("a");
String s2 = new String ("a");
syso(s1==s2)//输出false,因为创建了两个String对象,存在栈中的地址不一样
syso(s1.equals(s2))//输出true,因为里面的内容都是“a”
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(10)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式