V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1oNflow
V2EX  ›  Java

字符串被设计成 final 且不可变的和符号引用有关吗?

  •  
  •   1oNflow · 2019-11-20 23:35:39 +08:00 via iPhone · 2638 次点击
    这是一个创建于 1860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看到有文章总结了这样设计的原因
    1.为了实现字符串池
    2.为了线程安全
    3.为了实现 String 可以创建 HashCode 不可变性

    另外 class 文件里的符号引用也是用字符串(这里的字符串还是 java 里的 String 吗)存储的,为了保证符号引用转直接引用的安全性,这是不是也是 String 不可变的原因之一?
    4 条回复    2019-11-21 10:55:38 +08:00
    misaka19000
        1
    misaka19000  
       2019-11-20 23:40:33 +08:00
    根本原因在于防止误修改吧,类似于 Python 里的 global
    aguesuka
        2
    aguesuka  
       2019-11-21 00:58:06 +08:00 via Android
    effective java 最小化可变性
    hinate
        3
    hinate  
       2019-11-21 09:26:45 +08:00
    符号引用是字符串,这个字符串包含足够的信息,以供实际使用时可以找到相应的位置。
    符号引用会被替换为直接引用,下次就不用搜索了。直接引用就是偏移量,通过偏移量虚拟机可以直接在该类的内存区域中找到方法字节码的起始位置。
    zappos
        4
    zappos  
       2019-11-21 10:55:38 +08:00
    你自己尝试一下,字符串各种操作是新生成字符串方便还是在原字符串上改动方便。

    结论就是不可变字符串在时间上不弱于可变字符串,在空间上由于有了常量池甚至更优。

    这才是字符串默认不可变的原因。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:32 · PVG 03:32 · LAX 11:32 · JFK 14:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.