转 String的不变性 immutable

转 https://blog.csdn.net/limm33/article/details/54962259





我们经常在Java里面提到String的不变性,下面就来说一下对于String的不变性的理解:

可以参考以下程序:

String str = "Hello";
System.out.println(str);//输出为Hello
str.concat("World");//该方法是在原来的变量后面添加一个字符串然后变成新的字符串
System.out.println(str);//输出为Hello
str=str.concat("World");
System.out.println(str);//输出为HelloWorld

通过以上程序能更好的帮助我们理解String的不变性,不变性是什么呢?就是指引用的对象实例的是不可以改变的,但是我们可以改变引用的地址,改变地址改变值。

常量池概念:

在Java虚拟机的整个体系里面,我们加载类文件,分别存放到不同的单元,占用大部分内存空间的是常量池,大约能占到60%,为了节省内存,JVM专门用一片特殊的存储区域存储String,作为String ,面对String常量,会检查String常量池中是否存在此常量,如果存在的话,直接进行引用,避浪费多余的内存空间,因此必须确保这个具体的常量不能变,这就是我们经常讲的String的不变性。

我们可以联想到其它方式,还有其它使用的技术:

String newStr=“java”;//这个应该是放在String的常量池中的常量。

String newStrObj=new String("java");//这个放在常规的内存中。

原文地址:https://www.cnblogs.com/tabCtrlShift/p/9419212.html

时间: 2024-12-01 18:04:24

转 String的不变性 immutable的相关文章

[图说Java]图说String的不变性

我们用下面一组图来说明Java的不变性. 1.声明一个字符串 String s = "abcd"; s存储了字符串对象的引用.下面图片中的箭头就表示这种存储引用. 2. 将一个字符串变量赋值给另外一个字符串变量 String s2 = s; s2变量存储了同样的引用值.所以,两个变量指向同一个字符串对象. 3. 合并字符串 s = s.concat("ef"); s现在存储的是新生成的字符串对象的引用. 4. 总结 一旦一个字符串在内存(堆)上创建,这个字符串就不会

String的不变性

String类型的不变性理解: String x = "java"; System.out.println(x);//输出为java x.concat("java");//该方法是在原来的变量后面添加一个字符串然后变成新的字符串 System.out.println(x);//输出为java x=x.concat("java"); System.out.println(x);输出为javajava 这就是不变性的概念. 所谓的不变性是指引用的对象

为什么Java中的String是不可变的?(Why String is immutable o...

There are many reasons due to the string class has been made immutable in Java. These reasons in view, concurrency issues, security issues and performance issues. Here is a list of various valid reasons to go for immutable string class: String在Java中被

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

多线程学习之二坚不可摧模式Immutable pattern

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状

多线程程序设计学习(3)immutable pattern模式

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状

String源码解析

定义 先看一下文档中的注释 12345 * Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they can be shared. */ String对象是常量,创建之后就不能被修改,所以该对象可以被多线程共享. 123456789

堆与栈(JAVA)——以String str="abc"的深度含义解释

栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运

从String类型字符串的比较到StringBuffer和StringBuilder

1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they ca