1oNflow
V2EX  ›  Java

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

  •  
  •   1oNflow · Nov 20, 2019 via iPhone · 3136 views
    This topic created in 2437 days ago, the information mentioned may be changed or developed.
    看到有文章总结了这样设计的原因
    1.为了实现字符串池
    2.为了线程安全
    3.为了实现 String 可以创建 HashCode 不可变性

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

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

    这才是字符串默认不可变的原因。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 22:38 · PVG 06:38 · LAX 15:38 · JFK 18:38
    ♥ Do have faith in what you're doing.