黑马程序员技术交流社区

标题: 字符串比较 [打印本页]

作者: 胡志翔    时间: 2013-9-9 12:08
标题: 字符串比较
本帖最后由 杨增坤 于 2013-9-11 17:24 编辑

String s1="abcd";
String s2="1234";
s1==s2和s1.equais(s2)是对s1和s2做同样的比较吗?
作者: 焦允    时间: 2013-9-9 12:29
这个是不同的:“==”比较的是地址值也就是引用类型的变量所指向的地址。,而equels方法比较的是内容
首先字符串是引用类型,s1和s2分别指向不同地址,并且这两地址里面存放的东西也不相同。
s1==s2结果是false
s1.equals(s2)结果也是false
但两者比较的东西不一样的。
作者: joechen    时间: 2013-9-9 12:45
String s1="abcd";
String s2="1234";
s1和s2分别指向两个对象,所以s1==s2是false
s1.equais(s2)比较的是s1和s2指向的字符串是否相同,也就是说只看字符串是否相同
所以s1.equais(s2)的结果也是false

作者: 杨彬    时间: 2013-9-9 13:24
equals方法是Object基类的方法,在Object中的equals方法就是用的“==”比较,只不过任何类都继承自Object类都可以重写equals方法,String类就是其中之一,重写equals方法后,比较的是两个字符串的值是否相同,而“==”比较的是两个对象的地址,你要明白为什么“==”比较的是地址,因为“==”比较的是对象,对象存的就是地址。
作者: hoyouly    时间: 2013-9-9 13:49
其实这个问题你自己实验一下就可以了,两个结果都是false,但是这并不代表两个是相同的,因为正确答案都相同,而错误答案却五花八门,这个就是,因为==是比较的对象地址,如果你要是学过C语言的话,你就可以认为==比较的是指针,而equals比较的是数值,
作者: mo﹎雲℡    时间: 2013-9-9 13:58
对于引用数据类型来说:
“==”比较的是地址值也就是引用类型的变量所指向的地址。,而equels方法比较的是内容。
s1和s2分别指向不同地址,并且这两地址里面存放的东西也不相同。
s1==s2结果是false
s1.equals(s2)结果也是false
但两者比较的东西不一样的。
但是对于基本数据类型来说:是一样的。
作者: 张文豪    时间: 2013-9-9 18:23
s1==s2  比较的是地址值 而s1和s2指向2个不同的对象,为false
而是s1.equal(s2)呢,它用到了String类中的 equal方法,该方法比较的是2个字符串。题中"abcd"和“1234”不相同,所以为false

作者: 昝文萌    时间: 2013-9-9 18:38
用"=="来比较,这种比较是针对两个String类型的变量的引用,也就是说它们所引用同一个String对象(即指向同一块内存堆),则"=="比较的结果是true。另一种是用Object对象的equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较,也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。

作者: 杨增坤    时间: 2013-9-9 19:38
楼主,你好,如果您的问题解决了!


请把您问题的未解决更改为已解决

谢谢合作!



作者: hmwudizl91zl    时间: 2013-9-9 20:20
  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
  如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = newObject();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
  equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
  String a=new String("foo");
  String b=new String("foo");
  两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
  在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
  如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
  boolean equals(Object o){
  return this==o;
  }
  这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
作者: bjbao1    时间: 2013-9-9 20:51
首先回答你的问题:s1==s2跟s1.equais(s2)对于s1、s2做的是完全不同的比较
其区别在于:
(1)关于s1==s2,“==”在此检测的是s1和s2是否引用了相同的对象,显然s1和s2在此引用了不同的对象(s1 引用的是abcd,s2引用的是1234)。
在此给出相应的英文解释:The "==" operator checks only whether s1 and s2 refer to the same object. In your example, it is obviously not.

(2)String.equals()方法用来比较两个字符串型对象的内容,显然s1和s2所含的字符串内容也不相符。
在此给出相应的英文解释:The String.equals() method is used to compare the contents of two strings.

总结:“==”这个运算符的操作是针对于对象的, 它所体现的是s1和s2是否代表了相同的对象,并不能体现出s1和s2是否有相同的内容。而 String.equals()方法则是用来比较两个字符串的内容是否一致,是专门对字符串内容作比较用的。
作者: 陶智第    时间: 2013-9-9 23:03
这两种比较是不同的。
首先“==”比较的是两个String类型对象的堆内存地址
而“equal()”比较的是两个String类型对象的内容
作者: mf152    时间: 2013-9-10 00:34
因为
==比较的是2个对象的地址,而equals比较的是2个对象的内容。

又由于
String s1="abcd";
String s2="1234";
创建了两个对象,所以“s1==s2”为false

这个两个对象的内容不同(一个是abcd ,一个是1234)所以“s1.equais(s2)”为false










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2