• JAVA 中为什么String 是immutable的


    本文翻译自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

    这是一个很老但很流行的问题,这里有几个原因String在java中被设计成immutable的。对内存、同步、数据结构等有好的理解,能更好的回答这个问题。下面我将简单的介绍这些原因:

    1, String Pool的需要。

    String pool(String intern pool) 是一个方法区里的特殊的存储区域。当创建一个String, 如果它已经在pool中存在,则会返回一存在String的引用,相反,怎会创建一个新的String,并返回该引用。

    下面的代码将仅仅在堆中创建一个String对象。

    String string1 = "abcd";
    String string2 = "abcd";

    如图:

    如果String不是immutable的,改变String的一个引用将导致另一个引用的到错误的值

    2. 允许String缓存它的hashcode

    String的hashcode在JAVA中是使用非常频繁的。例如在HashMapzhong, String设计成immutable保证了hashcode总是一样的,所以hashcode可以被缓存而不用担心改变。也就是说,不需要每次在使用hashcode时都去计算一遍,这样更高效。

    在String类里,代码:

    private int hash;//this is used to cache hash code.

    3. 安全

    String广泛的作为参数被JAVA中的类使用,比如 网络连接,打开的文件等等,如果String不是immutable,一个连接或文件的改变将导致严重的安全威胁,一个方法还以为正连接到一个机器上,并其实没有。可变的String同样将导致反射的安全性问题,因为反射中的参数都是String类型的。

    代码:

    复制代码
    boolean connect(string s){
        if (!isSecure(s)) { 
    throw new SecurityException(); 
    }
        //here will cause problem, if s is changed before this by using other references.    
        causeProblem(s);
    }
    复制代码

    总之:原因包括设计、效率和安全。实际上,这三点也是JAVA面试中一些“为什么”的答案。

    欢迎关注微信公众号:shoshana

  • 相关阅读:
    linux安装jdk(二)
    Java实现进程调度算法(一) FCFS(先来先服务)
    用Java Swing实现Freecell(空当接龙)
    windows主机开启MySQL慢查询日志
    CentOS LNMP 服务器安装配置详解
    shopex 网店系统 v4.8.5 安装图文教
    mysqldumpslow和mysqlsla分析mysql慢查询日志
    window下nginx配置
    PHP开发编码规范
    IIS+PHP+MySQL+Zend Guard Loader(ZendOptimizer)+phpMyAdmin环境配置图解(转)
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10822837.html
Copyright © 2020-2023  润新知