账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java中String.intern方法一个怪异的问题
    57
    0

    最近在研究一些基础知识,看到Java中的常量池及String.intern方法,也在网上找了一些示例代码在自己机器上运行,但是发现一个奇怪的问题,如下代码:

    // #0
    String str1 = new String("0") + new String("0");
    str1.intern();
    String str2 = "00";
    System.out.println(str1 == str2); // true
    System.out.println(str1.equals(str2)); // true
    
    // #1
    String str1 = new String("1") + new String("1");
    str1.intern();
    String str2 = "11";
    // 不知道为什么不是指向同一个引用
    System.out.println(str1 == str2); //  false,        
    // 两个变量的hashCode也是相等的
    System.out.println(str1.hashCode() == str2.hashCode()); // true
    System.out.println(str1.equals(str2)); // true
    
    
    // #2
    String str1 = new String("2") + new String("2");
    str1.intern();
    String str2 = "22";
    
    System.out.println(str1 == str2); // true        
    System.out.println(str1.equals(str2)); // true
    
    

    搞不明白为什么两个new String("1") + new String("1")相加之后的变量intern的时候,再定义一个一样的string就不会指向StringPool中的地址!

    上述代码#1更改为如下写法:

    // #1-Update
    String str1 = (new String("1") + new String("1")).intern();
    String str2 = "11";
    System.out.println(str1 == str2); //  true           
    System.out.println(str1.equals(str2)); // true
    

    又能在StringPool中找到相应的引用,怪事一桩,请各位大侠指点迷津!!!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 前世情未了 VIP会员 1楼

      在Java中,String类并没有直接提供intern方法,这可能是因为在某些情况下,这可能会导致性能问题。

      例如,如果在运行时确定字符串的内容不会改变,那么在内存中创建一个新的字符串实例(String对象)可能会导致浪费,而返回一个已存在的字符串实例( intern 方法返回的)则不会。在这种情况下,如果你不希望使用 intern 方法,那么你可以使用一个双端字节流(InputStream 和 OutputStream)来创建一个新的字符串实例。

      以下是使用双端字节流创建新的String实例的示例:

      java InputStream is = new FileInputStream("test_string.txt"); String str = new String(is); is.close();

      在这个示例中,我们首先创建了一个InputStream对象,然后使用这个对象来创建一个String对象。这种方法的性能取决于输入文件的大小和Java虚拟机(JVM)的性能。

      如果你仍然想要使用 intern 方法,那么你可能需要在String对象内部使用一个临时的临时字符集来跟踪字符的位置,以便在 intern 方法中正确地使用字符。这可能会导致额外的性能开销,但会使得 intern 方法的使用更加稳定。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部