`
dsxwjhf
  • 浏览: 73703 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

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

阅读更多
本文转自 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 中的键往往都使用字符串。

以上就是我总结的字符串不可变性的好处。
分享到:
评论

相关推荐

    浅谈为什么Java里面String类是不可变的

    那么,为什么 Java 语言的设计者要把 String 类型设计成不可变对象呢?下面,我们将深入探讨字符串不可变性的原因和优点。 不可变对象的定义 不可变对象指的是对象创建之后,对象的内部状态以及对象的内存指针地址...

    Java中的String为什么是不可变的?-String源

    在Java编程语言中,String类是一个非常特殊且...总的来说,Java中的String设计为不可变对象是出于性能、安全和并发控制的考虑,这种设计在许多场景下都是有利的。理解这一特性对于编写高效、安全的Java代码至关重要。

    简单的string类

    首先,`std::string`是C++标准库中的一个类模板,它表示可变长度的字符序列。在声明时,你可以通过构造函数初始化字符串,例如: ```cpp std::string str = "Hello, World!"; ``` 这将创建一个包含"Hello, World!...

    Java中的String为什么是不可变的共7页.pdf.z

    Java中的字符串类`String`是不可变的,这个特性在编程实践中有着深远的影响。了解其不可变性,有助于我们更好地理解和优化代码。以下是对这一核心概念的详细解释: 1. **不可变性定义**:不可变对象是指一旦创建,...

    Java string不可变原理实例解析

    在面试中,了解并能够解释Java中的String为什么是不可变的,是展示对Java内存模型和多线程概念理解的很好方式。阅读《Effective Java》等书籍可以帮助深入理解这一设计决策背后的思考。同时,熟悉字符串操作的最佳...

    utf8与string的相互转换

    例如,在Python中,字符串是不可变的序列,可以包含任何Unicode字符,包括由UTF-8编码的字符。在Java中,String类也是用于存储和操作字符序列,同样支持UTF-8编码。 实现UTF-8与字符串之间的转换通常需要特定的函数...

    Java 中的 String对象为什么是不可变的

    String类的设计使其不可变,有以下几个主要原因: 1. **线程安全**:由于String对象不可变,所以在多线程环境中,多个线程可以安全地共享同一个String对象,无需担心同步问题。这提高了程序的并发性能。 2. **缓存...

    Java中的String对象是不可变的吗Java开发Jav

    在Java编程语言中,String对象被认为是不可变的。这个特性是Java设计者为了优化性能、安全性和线程安全性而有意设定的。理解String对象的不可变性对于Java开发者来说至关重要,因为它影响着代码的编写、内存管理和多...

    String类的笔记

    它被设计为不可变(immutable),这意味着一旦创建了一个`String`对象,其内容不能被改变,这对于多线程环境下的安全性至关重要。 #### `String`类的关键特性与方法 1. **字符串初始化**:可以通过多种方式创建`...

    AndyJennifer#Android_Interview#为什么 String 被设计为不可变的1

    这样的话,以后每次想要用到 HashCode 的时候,不需要重新计算,直接返回缓存过的 hash 的值就可以了,因为它不会变,这样可以提高效率,所以这就使得字符

    JAVA精华 String类一旦初始化就不可以改变,而stringbuffer则可以。它用于封装内容可变的字符串。

    这是因为String对象在Java中是不可变的。这意味着每次对String对象进行操作(如拼接或替换字符),都会生成一个新的String对象。例如,`String x="a"+4+"c"` 在编译时等同于 `String x=new StringBuffer().append("a...

    C++封装的String类,用于Cocos2d-x开发等

    总之,这个C++封装的`String`类是一个为Cocos2d-x游戏开发定制的工具,它的设计目标是提供便捷的字符串操作,并优化性能,降低开发者的编码复杂度,使得在C++环境中进行字符串处理能有与Java类似的体验。

    JAVA不可变类(immutable)机制与String的不可变性(推荐)

    本文将深入探讨不可变类的概念、优点、设计方法以及String类的不可变性。 一、不可变类简介 不可变类的特征是,它们的实例在创建后,其成员变量的值不能被修改。例如,Java中的Integer、Long和String类都是不可变...

    StdString类代码,可完善替代CString字符串类.rar

    在C++编程中,字符串处理是必不可少的部分,而Visual C++(VC++)提供了多种字符串类,如MFC中的CString类。然而,对于某些开发者来说,可能需要更灵活或者性能更高的字符串处理工具。"StdString类代码,可完善替代...

    Java常用类与基础API-String的理解与不可变性

    综上所述,`String` 的不可变性是其设计的核心原则之一。这一特性不仅保证了并发环境下的安全性,还提高了性能,减少了不必要的内存开销。开发者应当充分利用这一特性来编写更高效、更安全的代码。 #### 三、String...

    深入了解C#的String类.zip

    在C#编程语言中,`String`类是一个非常核心且常用的部分,它代表不可变的字符序列。在深入探讨`String`类之前,先要理解C#与SQL Server数据库技术的结合,因为这两个领域的知识是现代软件开发中的基础。`String`类在...

    字符串、String类和StringBuilder类

    在C#中,String类是不可变的,这意味着一旦一个字符串对象被创建,它的内容就不能被改变。例如,当你对字符串进行拼接、替换或截取等操作时,系统实际上会创建一个新的字符串对象,而不是在原地修改。这种设计提高了...

    C#_String与string的区别

    ### C#中String与string的区别详解 在C#编程语言中,`String`与`string`两者虽然在表面上看起来...在实际开发中,应根据具体情况选择使用`string`或`String`,并充分利用`String`的不可变性来优化程序性能和资源管理。

Global site tag (gtag.js) - Google Analytics