问答详情
源自:2-2 Java 中字符串的不变性

有关练习中s3,s4的以及equals()方法的使用

String s1 = "imooc";

String s2 = "imooc";

String s3= "I love "+ s1; 

String s4 = "I love " + s1;

代码中的定义,并没有用到new,不应该同s1,s2的理解(多次出现的字符常量,编译器程序只创建一个)一样么?s3,s4为什么是指向的不同单元啊?


因(s3==s4)比较的是s3和s4引用所指向的内存单元的地址,如需比较s3,s4的值重写equals()方法。可是为什么编译器不允许重写?提示:此类中没有非静态字段,不能重写equals()。这是为什么啊?


谢谢。


提问者:橙子lovesun 2016-05-23 08:52

个回答

  • AI方法
    2016-09-08 11:27:23

    不需要重写equals,因为String类里面已经帮我们写好了比较内容的equals,你直接调用就可以了

  • qq_慕沐233771
    2016-06-19 14:50:20

    一旦一个字符串在内存中创建,则这个字符串将不可改变。

    多次出现的字符常量,编译器程序只创建一个

    注意这里是常量哦

    String s1 = "imooc";
    String s2 = "imooc";
    //String s3 = "I love " + s1;
    //String s4 = "I love " + s1;
    
    String s3 = "I love " + s1;
    s1 = "Mary";
    String s4 = "I love " + s1;

    通过 String s3="I love"+s1; ,其实质是根据s1创建了字符串对象,变量 s3 指向了创建的字符串对象。

    通过 String s4="I love"+s1; ,其实质是根据s1创建了新的字符串对象,变量 s4 指向了新创建的字符串对象。

    这是两个不同的对象 上面的代码 帮助理解一下


    此类中没有非静态字段,不能重写equals()。

    上次碰到这个问题 是在主方法里进行调试的时候 main()方法是static修饰的 静态方法中 不能直接访问非静态成员变量和方法 只可直接访问静态变量和方法 所以出现这个问题 加个就好了

    希望有所帮助

  • 玄鉴
    2016-06-14 18:40:46

    不相同是应该的,相同才是因为多次优化的结果。我这里编译器允许重写equals啊。

  • Czjhit
    2016-05-23 09:16:20

    在我的代码中,定义S3中love后面是没加空格的,s4有,所以会指向不同的单元,你可以去在确认以下,运行一下。在重写equals()时 ,提示非静态字段可以在重写方法中加入静态关键字,或者尝试下在方法前加入一个@override,希望对你有帮助