A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kun1990 中级黑马   /  2013-12-14 18:01  /  1277 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在java中为什么无法使用==来判断字符串是否相等?望解答...

评分

参与人数 1黑马币 +5 收起 理由
乔兵 + 5

查看全部评分

8 个回复

倒序浏览
如果是引用数据类型的话,==比较的内存地址,如果是基本数据类型比较是就是具体的值了,用String里的equals比较的是字符串是否相等
回复 使用道具 举报
楼主您好,首先我先贴一段代码:
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                
  4.                
  5.                 System.out.println("abc"=="abc");//打印结果为true
  6.                 System.out.println("123"=="abc");//打印结果为false
  7.                
  8.                 String a1 = "abc";
  9.                 String a2 = "123";
  10.                 String a3 = "abc";
  11.                
  12.                 System.out.println(a1 == a2);//打印结果为false
  13.                 System.out.println(a1 == a3);//打印结果为true

  14.         }

  15. }
复制代码

当字符串都为"abc"的时候返回true;当字符串一个为"abc",一个为"123"的时候返回false,这是不是说明我们是可以用"=="来比较两个字符串是否相等的?所以对楼主的问题我表示不解,我说的有什么不对的,欢迎批评指正。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
如果是String类型,应该是可以用“==”的。
相同字符串的堆内存地址都是一样的,只是在栈内存的引用不同,所以可以用"=="。
新手回答,回答的不好不要介意,大家一起学习!!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
1.==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同.
2.如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报 1 1
  1. public class T1 {
  2. public static void main(String[] args) throws ClassNotFoundException,InstantiationException,IllegalAccessException{
  3. // TODO Auto-generated method stub
  4. String s1 = "abc";
  5. String s3 ="abc";
  6. String s2 = new String("abc");
  7. System.out.println(s1);//输出abc
  8. System.out.println(s2);//输出abc
  9. System.out.println(s3==s1);//输出ture
  10. System.out.println(s1.equals(s2)); //判断其内容相同都是abc返回true
  11. System.out.println(s1.getClass()==s2.getClass());//都是String 类的字节码对象所以返回true
  12. System.out.println(s1==s2); //2个不同对象地址值不同返回flase

  13. }

  14. }
复制代码
String类来说明,可以看出equals是判断内容是否相同
==是判断对象地址是否相同(即指向对象是否相同)
getClass()是类字节码对象,所以是比较类是否相同。
当s3这种方式建立string对象的时候,其实s1和s3是可以进行==比较的,因为他们都指向同一对象,如果是s2这种new对象,就不能使用==,因为他们对象不同

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
冯国强 发表于 2013-12-16 13:53
1.==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同.
2. ...

比较认同你的观点:D
回复 使用道具 举报
== 是比较地址  equals 比较值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马