因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String
对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象
,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会
有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。
分享到:
- 2009-07-13 11:23
- 浏览 1067
- 评论(0)
- 论坛回复 / 浏览 (0 / 1603)
- 查看更多
相关推荐
String类型在Java中是一种特殊的对象类型,用于存储和处理文本字符串。它是由一系列字符组成的不可变序列,意味着一旦创建,其内容不能被改变。String类型支持多种操作,如拼接、分割、查找等。 #### 1.2 int类型 ...
### Java中的基本类型与String类型详解 在Java编程语言中,数据类型分为两大类:基本类型(primitive types)和引用类型。基本类型直接存储值,而引用类型则存储指向对象的引用。本文将深入探讨Java中的基本类型...
在Java编程语言中,String类型扮演着至关重要的角色。它被广泛用于表示和操作文本,因为它是不可变的,这确保了字符串的安全性和效率。本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他...
这意味着一旦创建了 String 对象,它的值就不能被改变。 在 Java 中,可以使用两种方式创建 String 对象:一种是使用字面值赋值方式,例如 `String s = "a";`;另一种是使用 new 关键字,例如 `String s = new ...
`String`对象一旦创建后,其内容就不能改变。 - **数组(Array)**:数组是一种基本的数据结构,用于存储固定大小的同类型元素。在Java中,数组的大小是固定的,一旦定义就无法更改。 #### 二、List转String数组的...
String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一个新的 String 对象,然后将指针指向新的 String 对象。这意味着,如果经常改变字符串内容,最好不要使用 String 类型,因为每次生成对象都会对...
因此,当我们在方法内部改变 String 对象的值时,实际上是改变了 String 对象的引用,而不是改变了 String 对象本身。 例如,在上面的代码示例中,我们将 String 型参数 `originalStr` 传递给了 `...
`声明了一个`std::string`对象`Str`,它会被默认构造函数初始化为空字符串。 - `string s(str);`使用拷贝构造函数创建`str`的副本。 - 其他构造函数允许从不同来源初始化字符串,例如指定子串、C风格字符串、字符...
string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,...对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。
在.NET程序设计中,String类型是一个非常基础且重要的数据类型,用于表示文本。然而,由于.NET框架对String类型的特殊处理,开发者需要理解其工作原理,才能有效地利用它,避免不必要的性能损失。以下是对String类型...
1. 对于String类型的`str`,在`change`方法中执行`str = "test ok"`,这并不改变`Example`类中`str`引用的对象,而是创建了一个新的`String`对象,并将方法内的`str`引用更改为这个新对象。由于字符串是不可变的,...
在Java编程语言中,内存管理和String类型是两个非常关键的概念,尤其对于深入理解Java开发至关重要。本文将详细探讨这两个主题,旨在提供一个全面且深入的分析。 首先,我们来看Java的内存分配。Java内存主要分为三...
总结一下,Java中的`String`类型是不可变的,每次对`String`对象的修改都会创建一个新的`String`对象,原对象不会被改变。而数组则是可变的,可以修改其元素。在方法调用中,`String`类型的参数是按值传递(实际传递...
此外,`String`对象储存在常量池中,一旦创建就无法改变,这使得字符串操作具有高度的安全性和效率。 **一、String对象的创建** 1. 字符串字面量:`String str = "Hello, World!";` 2. 构造器:`String str = new ...
例如,当我们调用`String.Replace`方法时,它实际上并不改变原始字符串,而是返回一个新的字符串对象,其中包含了替换后的结果。 #### 5. 引用与值传递 在C#中,`string`类型(实际上是`System.String`)是通过...
Java中的`String`对象是一种非常特殊的数据类型,虽然它不属于八种基本数据类型(byte, short, int, long, char, float, double, boolean),但它却在编程中扮演着重要角色。`String`是一个对象,这意味着它在内存中...
`string`类型是不可变的,这意味着一旦创建了一个`string`对象,就不能更改它的内容。例如: ```csharp string str = "Hello"; str += " World"; // 实际上是创建了新的字符串对象 ``` 在这个例子中,虽然表面上看...
在JavaScript中,字符串(String)是一种不可变的基本数据类型,用于表示文本。字符串对象(String对象)提供了许多方便的方法和属性,帮助我们处理和操作文本。以下是对`String`对象的一些核心知识点的详细解释: 1. *...
1. **类型安全**:在转换时确保正确地处理类型转换,例如使用 `(String[])` 显式地将数组转换为 `String[]`。 2. **性能考量**:频繁地进行数组和列表之间的转换可能会对性能造成影响,特别是在处理大量数据时。 3. ...
首先,`String`类是不可变的,这意味着一旦创建了一个`String`对象,它的内容就不能改变。当我们尝试修改`String`对象时,实际上是创建了一个新的`String`对象。例如,`str += "hello"`实际上会创建一个新的`String`...