当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

【转】为什么 String 类要设计成不可变的?

发表于: 2015-04-20   作者:dsxwjhf   来源:转载   浏览次数:
摘要: 本文转自 http://www.importnew.com/7440.html String 是所有语言中最常用的一个类。我们知道在 Java 中, String 是不可变的、 final 的。Java 在运行时也保存了一个字符串池( String Pool ),这使得 String 成为了一个特别的类。 String 类不可变性的好处 1. 只有当字符串是不可变的,字符串
本文转自 http://www.importnew.com/7440.html

String 是所有语言中最常用的一个类。我们知道在 Java 中, String 是不可变的、 final 的。Java 在运行时也保存了一个字符串池( String Pool ),这使得 String 成为了一个特别的类。

String 类不可变性的好处

1. 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么 String interning 将不能实现(译者注: String interning 是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

2. 如果字符串是可变的,那么会引起很严重的安全问题。譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在 socket 编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

3. 因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。

4. 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载 java.sql.Connection 类,而这个值被改成了 myhacked.Connection ,那么会对你的数据库造成不可知的破坏。

5. 因为字符串是不可变的,所以在它创建的时候 hashCode 就被缓存了,不需要重新计算。这就使得字符串很适合作为 Map 中的键,字符串的处理速度要快过其它的键对象。这就是 HashMap 中的键往往都使用字符串。

以上就是我总结的字符串不可变性的好处。

【转】为什么 String 类要设计成不可变的?

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int、bo
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?
编者按:原文作者 Amber Leigh Turner是名视觉设计师。在 这篇文章中她认为创业公司应该提高设计的
相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如
App市场风起云涌。可是,却只有少数几个App能成为“暴发户”,更多的则沉淀在应用商店中无人问津。
我的朋友熟人不少,这些情况都有。有个女朋友离婚后对我说,不是对前夫灰心,是对婚姻本身灰心了。
产品经理为什么要改行参加广州网页平面UI设计培训?   日前,广州网页平面UI设计的老学员回“家”
本章目标 掌握String类的两种实例化方式 掌握String的两种比较操作 深入分析String类两种实例化方式
本章目标 掌握String类的两种实例化方式 掌握String的两种比较操作 深入分析String类两种实例化方式
知乎上有一个问题:人为什么要努力?我的回答比较简单:对于自己来说:体验不一样的世界;不想被少
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号