关于字符串的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
7911364440
V2EX    Java

关于字符串的疑问

  •  
  •   7911364440 2022 年 9 月 29 日 2633 次点击
    这是一个创建于 1303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    字符串有两种创建方式:

    String str = "abc"; 
    String str = new String("abc"); 

    第一种创建方式 JVM 会判断字符串常量池中是否包含该对象,如果有则返回常量池中对象的引用,如果没有则在常量池中创建一个新对象。

    第二种创建方式在类加载阶段会将"abc"保存在 class 常量池中,调用 new 指令时会在堆中创建一个新的 String 对象。

    问题:第一种创建方式是否等价于new String("abc").intern()

    14 条回复    2022-09-30 17:46:01 +08:00
    AoEiuV020CN
        1
    AoEiuV020CN  
       2022 年 9 月 29 日 via Android
    等价不可能的,最后这段明显多 new 一个没用的字符串,
    至于是否相等,真的在意写个==判断一下不就知道了,

    研究这种东西真的有用吗,你在搞 jvm 开发的话当我没说,
    Hurriance
        2
    Hurriance  
       2022 年 9 月 29 日
    创建过程是一样的,只不过 intern 函数是提供用来判断字符串对象的源对象(字符串常量池对象)
    dcsuibian
        3
    dcsuibian  
       2022 年 9 月 29 日
    不一样,new 了就代表新分配内存空间了。
    cslive
        4
    cslive  
       2022 年 9 月 30 日
    不同 jdk 版本这个方法执行结果是不同的,具体看美团技术团队这篇文章。fastjson 中大量使用了 String#intern
    https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html
    Kasumi20
        5
    Kasumi20  
       2022 年 9 月 30 日
    感觉有点类似 Rust 中的 drop 函数?把临时内存删掉,指向一个公共的只读内存
    BQsummer
        6
    BQsummer  
       2022 年 9 月 30 日
    @AoEiuV020CN 为什么会没用, 新手经常把 String 类型的字段做 synchronized 锁的对象, 而不用 intern, 导致锁失效.
    @dcsuibian 上面美团文章里有说: "String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。"
    dcsuibian
        7
    dcsuibian  
       2022 年 9 月 30 日
    @BQsummer 我是表达的是 new String("abc").intern()拆分一下应该是
    String temp=new String("abc");①
    temp.intern();②
    "abc"本身就在常量池里面了,而 temp 又申请了内存,但如果直接"abc"的话,那就直接用常量池里的了。不用多此一举
    AoEiuV020CN
        8
    AoEiuV020CN  
       2022 年 9 月 30 日
    @BQsummer #6 啊这,我仔细想了一下也没想到什么情况会需要锁 String ?
    方法写了放在那里就肯定是有用的, 我想说的是没头没尾的花时间研究纠结这些东西没用,
    4kingRAS
        9
    4kingRAS  
       2022 年 9 月 30 日
    为什么没用呢?很多优化的思维就是跟标准库学习的,复用常量池,反手我就用在平时的性能优化中
    aguesuka
        10
    aguesuka  
       2022 年 9 月 30 日
    @AoEiuV020CN 总有人以 tricky 为荣, 没办法说服他们的
    AoEiuV020CN
        11
    AoEiuV020CN  
       2022 年 9 月 30 日
    @4kingRAS #9 不研究这些你就没法优化了吗?
    难道说你优化前写的代码就是 String str = new String("abc"); 像这样的?
    那你确实要好好学学这些区别,我是觉得一般人靠常识就能避开这些坑,真到了需要在意这些细节的场景也会知道自己当下无法判断哪种是最优解,这时候针对性的学习一下就很合理,
    4kingRAS
        12
    4kingRAS  
       2022 年 9 月 30 日
    @AoEiuV020CN 难怪你会被降权,不是没有理由的
    4kingRAS
        13
    4kingRAS  
       2022 年 9 月 30 日
    总有一些人有莫名优越感,跑别人提问帖上劝别人别研究这些无聊东西。你有聊你高效,你来回复这种无聊贴干嘛呢?找抽吗不是?
    AoEiuV020CN
        14
    AoEiuV020CN  
       2022 年 9 月 30 日
    @4kingRAS #13 总有人无话可说只能人身攻击了,我最喜欢喷这种人喷到对方撒泼打滚了,
    另外我被降权应该不是这类原因,
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3061 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 06:00 PVG 14:00 LAX 23:00 JFK 02:00
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86