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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 万坤 中级黑马   /  2014-5-5 14:05  /  1389 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 万坤 于 2014-5-6 10:03 编辑

String a=“aaa”;String b=“aaa”;
在比较时 if(a==b)结果是 flash;
if( a.equals(b))结果是true;
能仔细解释一下这是为什么吗?

点评

常用论坛搜索功能。  发表于 2014-5-5 14:32

7 个回复

倒序浏览
本帖最后由 神马 于 2014-5-5 14:29 编辑

a、b都是引用数据类型,本身的值是哈希地址值,指向的是对应的对象,你这就是相应的字符串。String的equals方法比较的就是字符串内容。equals方法在Object中就存在,String类中重写了这个方法。而且你的问题有错:
                String a="aaa";
                String b="aaa";
                System.out.print(a==b);            //结果应该是true

因为字符串常量池的存在,当你String b="aaa";的时候,因为常量池中存在“aaa”,会让b也指向a所指向的“aaa”,所以两者的哈希地址值相等。如果:
                String a="aaa";
                String b=new String("aaa");
                System.out.print(a==b);            //结果应该是false

因为new的存在,不管常量池中有没有“aaa”,都会在堆内存中新建一个“aaa”,所以a、b是两个不同的地址值。


回复 使用道具 举报
"=="一般比较的是基本数据类型的值和引用类型的对象是否相等,引用类型指向的是对象堆中的变量,实质就是堆中对象的地址储存在栈中。
String a=“aaa”;String b=“aaa”;
if(a==b)结果是false。
"equals"比较的是两个对象是否相等(即对象里对应的属性是否对应的相等),而在字符串中String类中复写了equals方法,比较两个字符串的内容是否相等。
回复 使用道具 举报
1.“==”用于基本数据类型时,是判断值是否相等;
而用于判断引用数据类型时,则是比较HashCode值,即该对象在内存中的地址值是否相等
而你说的String a=“aaa”;String b=“aaa”;
打印 System.out.print(a==b); 应该为true。  建立“aaa”字符串时,内存会分配字符串常量池,所以String a和String b指向的都是同一个“aaa”.应该相等

2.equals方法是Object类的方法,String类也只是复写了equals方法。而String的equals()判断字符串是否相同,a和b的值都是“aaa”.因此为true

回复 使用道具 举报
  1. public class StringTest
  2. {
  3.    public static void main()
  4.   {
  5.       String a=“aaa”;
  6.       String b=“aaa”;
  7.       System.out.print(s1==s2);//为true
  8.       System.out.print(s1.equals(s2));//也为true
  9.       
  10.     }
  11. }
  12. 你可以在编译器验证下。结果都为true;
  13. 首先:String s1="aaa";系统会在常量池中寻找是否存在内容为"aaa"的字符串对象,发现不存在,就建立了指向该字符串对象的
  14. 引用变量。当执行String s2="aaa";时,如上所诉,它也会在常量池中寻找是否存在内容为"aaa"的字符串,存在就直接将s2指向该字符串。在内存中只开辟了一个空间。所以(s1==s2)==true;由于字符串String类复写了equals方法,表示比较对象的内容是否相等,所以s1.equals(s2)==true.
复制代码

1,"equals"比较的是两个对象是否相等(即对象里对应的属性是否对应的相等),而在字符串中String类中复写了equals方法,比较两个字符串的内容是否相等。
2."=="一般比较的是基本数据类型的值和引用类型的对象是否相等,引用类型指的是对象的别名指向堆中的变量,实质就是堆中对象的地址储存在栈中。
3,当比较栈中的内容是否相等时用"=="进行比较比较;当比较堆中的内容是否相等时,用equals进行比较。基本数据类型以及引用类型储存在栈中,数组以及new出来的对象储存在堆中。
回复 使用道具 举报
“==”和“equals()”方法比较字符串时,其比较方法不同。

1)“==”比较两个变量本身的值,即两个对象在内存中的首地址。
2)“equals()”比较字符串中所包含的内容是否相同。
如果按照你所给的话String a="aaa",String b="aaa"的话equals和“==”的效果是一样的为ture:
(原因)equals为ture无可置疑,而a和b仅仅只是串常量,常量的存储地址是一样的!
你的情况1)可能是你对两个中某一个初始化,类似:String a=new String("aaa");String b=new String("aaa"), 导致首地址不同而flase
2)就是你定义的不是object中的,因为object中存在equals语句,像StringBuffer中就不存在!
回复 使用道具 举报
验证了一下二楼的说法,程序:
class TestStringEqual
{
        public static void main(String[] args)
        {
                String a = "abc";
                String b = "abc";
                String c = new String("abc");
                System.out.println("a==b结果为:"+(a==b));
                System.out.println("a.equal(b)结果为:"+(a.equals(b)));
                System.out.println("a==c结果为:"+(a==c));
                System.out.println("a.equal(c)结果为:"+(a.equals(c)));
        }
}
运行结果为:
D:\>javac TestStringEqual.java

D:\>java TestStringEqual
a==b结果为:true
a.equal(b)结果为:true
a==c结果为:false
a.equal(c)结果为:true
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马