黑马程序员技术交流社区

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

作者: 周志强    时间: 2012-12-5 18:52
标题: 字符串的比较
public class Test {
    public static void main(String[] args) {
                                String str1="abc";
                         String str2="abc";
                         String str3=new String("abc");
                           System.out.println(str1==str2);
                        System.out.println(str1==str3);
                        }
}
为什么运行结果是:str1==str2为true,str1==str3为false?不懂,有哪位大侠帮帮?谢谢了
作者: 李小锋    时间: 2012-12-5 19:09
本帖最后由 李小锋 于 2012-12-5 19:11 编辑

当执行第一句str1 = "abc" 实例化出第一个指向;当进行第二句str2 = "abc" 的时候出现第二个指向,因为堆内存中存在"abc",而且str2也没有new一个新的对象,所以为了节省内存,str2指向了str1所指向的对象;但是第三句的时候出现new语句,他实例化出了一块新的空间用来盛放"abc",自然str3的指向也是指向这段新开辟的空间, 所以出现不同的结果。
作者: 怪盗急得    时间: 2012-12-5 19:30
首先你要区分== 和equals的区别在什么地方,Object类中有equals方法,其实用到的就是==这个比较运算符。

==这个比较运算符,比较的是两个变量对应的内存中存储的数值是否相同,或者是两个引用变量指向的两个实例对象占用的内存地址是否相同。
str1==str2 之所以为true,原因是这两个引用变量指向的是同一个String类型的实例对象。"abc"是一个字符串常量,也就是说在内存中,"abc"只能有一个。
str1 和 str2 的值不是对象,而是对象的内存地址。而内存地址是同一个,自然比较起来是相等的。

str1==str3 为什么不相等,主要是因为两个引用变量指向的不是同一个内存地址,意思就是"abc"和new String("abc")占用的内存空间并不是同一个,他们的内存地址不一样。
如果是str1.equals(str3),那么返回的结果会是对的。因为String类的equals方法是已经覆写了Object类的这个方法,里面的实现内容不同,不再是简单的比较两个对象的内存地址,而是比较连个对象指定的内容是否相同。

作者: Rancho_Gump    时间: 2012-12-5 20:02
今天刚看完这方面视频, "abc" 本身就是一个String型的对象,str1和str2都指向对象"abc"的地址,”==“比较的是地址是否相同,所以str1==str2为true,
String str3=new String("abc");是新开辟了个内存空间,所以str3指向一个新的地址,虽然str1和str3的内容一样,但指向地址不同,所以str1==str3为false.
若比较两个字符串的内容,用String类的一个方法:str3.equals(str1)为true
作者: 胡高德    时间: 2012-12-5 21:52
public class Test {
     public static void main(String[] args) {
                                 String str1="abc";
                          String str2="abc";
                          String str3=new String("abc");//此处new出来的str字符串相当于内存中新开劈了一块空间
                            System.out.println(str1==str2);//此处比较的是str1在内存中所占大小和str2在内存中所占大小,因内存所占大小一样而输出true。
                         System.out.println(str1==str3);//而此处相当于把str1在内存总所占的大小与str3在内存中的地址做比较,因而输出false。
                         }
}
作者: 邵新瑜    时间: 2012-12-5 22:57
String str1="abc";      //str1是指向堆内存中的"abc"字符串所在的地址,假设用A1表示
String str2="abc";     //这里是将"abc"字符串的地址赋值给了str2,也是A1
String str3=new String("abc");   //这里new了一个对象,新开辟了一个内存空间,那么就有一个新的地址A2,
那么A1必然就!=A2,则str1==str2为true,str1==str3为false

作者: 焦健    时间: 2012-12-6 21:09
   String str1="abc";
    String str2="abc";
    String str3=new String("abc");
  字符串一旦被初始化以后就不可以被改变,改变的只有地址,第一个  String str1="abc";会创建一个对象,第二个  String str2="abc";虚拟机发现内存中存在“abc”,不会在创建对象,会把str2的地址指向st1创建的“abc”,所以str1和st2r相同, String str3=new String("abc");是在内存中新建了一个对象“abc”,新创建的“abc”地址与原有的str1
创建的“abc”地址必然不同,所以比较结果不为真




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