三、为什么String在Java中是不可更改的

String在Java中是个不可更改的类。一个不可更改的类简单来说就是这个类的所有实例是不可以更改的。所有的实例信息在创建的时候被初始化而且信息是不可以更改的。不可更改的类有很多好处。
这篇文章总结了为什么String被设计成不可以改变的。一个好的回答需要深入理解内存、同步和数据结构等。
1、 字符串池的需要
字符串池(字符串内部池) 是在方法区域的特殊区域。当一个string被创建如果这个string已经在内存里面存在了,那个存在的string的引用被返回,而不是创建个新的对象和返回它的引用。
下面的代码将在堆上创建一个string对象。


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

如果这个string是可以改变的,通过一个引用改变一个string将导致另一引用指向错误的值。
2、 缓存哈希值
在Java中,string的哈希值经常被用。举个例子,在HashMap中。保持不变,可以保证总是返回相同的哈希值。所以它可以被缓存而不用担心被改变。 这意味这不需要在使用的时候每次都计算哈希值。
这将更高效。
在String类中,它有以下的代码:

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

3、 使其他类的使用更加容易。
为了更具体,想想下面的程序:


HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));

for(String a: set)
a.value = "a";

在这个例子中,如果String是可以改变的,如果它的值被改变这将违反了Set的设计(Set不可以包含重复的元素)。这个例子是为了简化设计的,在实际的String类中没有value 属性。

4、 安全
String 在很多java的类中,网络连接中,打开的文件中经常被作为参数使用。如果String是可以改变的,一个连接或者文件将有可能被改变,这将导致严肃的安全威胁。这个方法认为它正连接到一个机器,但是实际上不是。易变的strings将在反射或者作为参数将导致安全问题。
下面是代码实例:


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);
}

5、 不变对象是自然线程安全
因为不可变对象是不可以改变的,它能够被多个线程自由的共享。这消除了同步。
总结,String被设计成不可以更改的是为了效率和安全。这也是为什么现在很多不可以改变的类。

时间: 2024-10-26 10:24:45

三、为什么String在Java中是不可更改的的相关文章

String是java中的基本数据类型吗

1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. Java代码 new String() 和 new String("")都是申明一个新的空字符串,是空串不是null: 3. String str="kvill": String str=new String ("kvill"); 的区别: 在这里,我们

Object,scanner,String,StringBuffer,Java中基本类型的包装类型等

一.Scanner类 Scanner类:简单文本扫描器1.键盘录入步骤:(1)需要创建键盘录入对象:Scanner 键盘录入对象=new Scanner(System.in):(2)导包:import java.util.Scanenr(快捷键:ctrl+shift+o):(3)接收数据:XXX 变量名= 键盘录入对象.nextXXX():(例如:int 变量名=键盘录入对象.nextInt():).2.构造方法public Scanner(InputStream source):以输入流形式录

五、String在Java中是传“引用”

这个是Java的经典问题.许多类似的问题在stackoverflow被提问,有很多不正确或不完备的答案.如果不想太多你会认为这个问题比较简单.( The question is simple if you don't think too much.)如果你想的多的话,它会非常让你困扰. 1. 下面的代码片段是有有趣和让人困惑的 public static void main(String[] args) { String x = new String("ab"); change(x);

Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配

Java中的String类是一个很常用,但最不注意其细节的类,因此大多数面试会那这个类做文章.比如String str = new String("hello");开辟了几个内存空间,String和StringBuffer的区别等等.下面就做一个我的理解: String是一个被final修饰的类,它是不能被继承的.StringBuffer也是被final修饰的类. 一.堆内存和栈内存 在JVM中,堆内存是内存空间存放的是对象实例化的内容(程序的数据),栈内存存放的是对象的名称,其内容是

java中String 、 StringBuilder 和 StringBuffer的联系与区别

String作为java中最基本的类,担负着承载字符信息的作用.String具有不可变的final属性 , 这也决定了它对于在程序中传递信息的不可或缺性 .开发中,我们常常要对字符串进行拼接,这时我们会用到String对象重载的“+”操作符或concat(str)方法,也可以用StringBuilder.StringBuffer对象的append(str)方法来实现. 那么,String.StringBuilder.StringBuffer之间到底有什么联系和区别? 什么情况下分别适合使用这三个

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, 如果它

Java中String类的特殊性

java中特殊的String类型 Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String("abc"); 第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值'a'.'b'.'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成

Java中int和String互相转换的多种方法

1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 String ? A. 有叁种方法: 1.) St

Java中的String与常量池

string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种基本数据类型,String是一个类类型. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null: 3. String str=”k