FreeFly辉
2021-08-23 14:47
采纳率: 50%
浏览 51
已结题

java中的String的==比较

public static void main(String[] args) throws Exception {
        String a = "a";
        String param = "b" + a;
        System.out.println(param.intern() == "ba");
        System.out.println(param == "ba");
}

输出为 :

true
true

public static void main(String[] args) throws Exception {
        String a = "a";
        String param = "b" + a;
        System.out.println("ba" == param.intern());
        System.out.println(param == "ba");
 }

却是输出为:

true
false


我想知道为啥俩次输出的结果不一样,仅是调换了 == 俩边参数的位置,==前后有啥特殊的特性嘛?

  • 好问题 提建议
  • 收藏

4条回答 默认 最新

  • FreeFly辉 2021-08-23 15:42
    已采纳

    String a = "a";
    String param = "b" + a;
    // System.out.println(param.intern() == "ba"); //param.intern放在前面,此时常量池还没有 "ba",
    // 因此将自身放入了常量池,后面的"ba"也就指向了自身,比较也就是true了
    System.out.println("ba" == param.intern()); //放在 == 后面时,此时"ba"已经存在了,因此param.intern()并不会将自身放在常量池中,
    // 只是返回值是常量池中的对象。所以自身已用和常量池中的不再是同一个对象
    System.out.println(param == "ba");

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 404警告 2021-08-23 15:29

    intern()方法的本意是:【当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。】
    intern在前会先一步添加到常量池中 在后 是后一步加入常量池

    评论
    解决 2 无用
    打赏 举报
  • huang_ftpjh 2021-08-23 15:13

    顶,我也很好奇。 先执行 System.out.println(param == "ba"); 比较param变量和“ba”的值和地址值是否相等; 我们都知道他们是不相等的。那么是param.intern()这个方法对变量做了什么引起的吧

    @Test
        public void printEqual(){
            String a = "a";
            String param = "b" + a;
            System.out.println(param == "ba");
            System.out.println(param.intern() == "ba");
        }
        @Test
        public void printEqual2(){
            String a = "a";
            String param = "b" + a;
            System.out.println(param == "ba");
            System.out.println("ba" == param.intern());
        }
    ```java
    
    
    
    

    ```

    评论
    解决 无用
    打赏 举报
  • pureblackman 2021-08-23 16:17

    public static void main(String[] args) throws Exception {
    String a = "a";
    String param = "b" + a;
    System.out.println(param.intern() == "ba");
    System.out.println(param == "ba");
    }
    这一段,param.intern()执行时,串池中没有“ba”,于是param的值被放进了串池中,这样 == 后面的“ba” 是从串池中拿来的。也就是说“ba”跟param所指向的串是同一个,param与param.intern()所指向的串也是同一个。
    public static void main(String[] args) throws Exception {
    String a = "a";
    String param = "b" + a;
    System.out.println("ba" == param.intern());
    System.out.println(param == "ba");
    }
    这一段param.intern()执行时,==左边的“ba”已经放进了串池中,param.intern执行拿回的是开始的这个“ba”,也就是在串池中equal("ba")的这个“ba”,而param 所构造的“ba” 并没有被放入串池中,也就是说param与param.intern()指向的是不同的两个“ba”。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题