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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志强 中级黑马   /  2012-12-5 18:52  /  1600 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?不懂,有哪位大侠帮帮?谢谢了

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
本帖最后由 李小锋 于 2012-12-5 19:11 编辑

当执行第一句str1 = "abc" 实例化出第一个指向;当进行第二句str2 = "abc" 的时候出现第二个指向,因为堆内存中存在"abc",而且str2也没有new一个新的对象,所以为了节省内存,str2指向了str1所指向的对象;但是第三句的时候出现new语句,他实例化出了一块新的空间用来盛放"abc",自然str3的指向也是指向这段新开辟的空间, 所以出现不同的结果。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
首先你要区分== 和equals的区别在什么地方,Object类中有equals方法,其实用到的就是==这个比较运算符。

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

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
今天刚看完这方面视频, "abc" 本身就是一个String型的对象,str1和str2都指向对象"abc"的地址,”==“比较的是地址是否相同,所以str1==str2为true,
String str3=new String("abc");是新开辟了个内存空间,所以str3指向一个新的地址,虽然str1和str3的内容一样,但指向地址不同,所以str1==str3为false.
若比较两个字符串的内容,用String类的一个方法:str3.equals(str1)为true

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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。
                         }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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:38
7#
   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”地址必然不同,所以比较结果不为真
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马