java之String不可变思考
2017-08-24 18:23
239 查看
String属于引用类型,创建的对象放在堆上,引用放在栈上
String c = "aaa";
在堆上分配一片内存,创建对象保存数据aaa,而c属于在创建在栈上的引用,指向保存数据堆的位置
这时再添加一个String c=”bbb”;
这时堆上开辟一个新内存,保存数据bbb,然后c指向bbb
然后再String d=”bbb”; 因为bbb已经存在,并且被保存在了字符串常量池里面,所以
d就不用判断了一下,所要创建的对象存在,不用再创建了,直接引用d指向bbb就行了
这时c与d指的是同一个对象
创建字符串有两种方式
1.使用new运算符
2.使用字符串常量或者常量表达式 这个创建字符串的方式才使用字符串常量池
上面看完了图理解了字符串的拼接以及为什么说String不可变 从底层看一下不可变的原因
首先设置了private访问权限,外部无法直接访问,接着加上final无法被继承,并且没有提供setValue的公共方法,所以String对象建立后无法改变
其中substring, replace, replaceAll这样方法可以修改String对象的值,源码中修改方式是新建String一个对象,然后返回
接着把新的对象重新赋值给 引用,所以也是没有改变String对象
比如
String dString="12645";
String eString=dString.replace('1','3');
这时eString输出32645,而dString仍旧不变,
所以如果只dString.replace('1','3');这样,但是没有将新建的对象赋值给引用是无法输出32645的,因为dString不改变
String c = "aaa";
在堆上分配一片内存,创建对象保存数据aaa,而c属于在创建在栈上的引用,指向保存数据堆的位置
这时再添加一个String c=”bbb”;
这时堆上开辟一个新内存,保存数据bbb,然后c指向bbb
然后再String d=”bbb”; 因为bbb已经存在,并且被保存在了字符串常量池里面,所以
d就不用判断了一下,所要创建的对象存在,不用再创建了,直接引用d指向bbb就行了
这时c与d指的是同一个对象
创建字符串有两种方式
1.使用new运算符
String str =
new
String(
"Hello"
);
2.使用字符串常量或者常量表达式 这个创建字符串的方式才使用字符串常量池
String str=
"Hello"
;
//(字符串常量) 或者
String str=
"Hel"
+
"lo"
;
//(字符串常量表达式)
String a=
"Hello"
;
String d=
"Hel"
;
String str=
d+”lo”
; 这里a==str false
对于这种类型的拼接,如果d在编译器可以确定值结果为true。否则为false,比如final String d=”Hel”
上面看完了图理解了字符串的拼接以及为什么说String不可变 从底层看一下不可变的原因
首先设置了private访问权限,外部无法直接访问,接着加上final无法被继承,并且没有提供setValue的公共方法,所以String对象建立后无法改变
其中substring, replace, replaceAll这样方法可以修改String对象的值,源码中修改方式是新建String一个对象,然后返回
接着把新的对象重新赋值给 引用,所以也是没有改变String对象
比如
String dString="12645";
String eString=dString.replace('1','3');
这时eString输出32645,而dString仍旧不变,
所以如果只dString.replace('1','3');这样,但是没有将新建的对象赋值给引用是无法输出32645的,因为dString不改变
相关文章推荐
- java中String的传参和不可变问题探究
- Java String 设计为不可变类型的好处
- Java基础:String不可变性和final修饰
- Java写一个不可变类(如String)
- java基础解析系列(九)---String不可变性分析
- 三、为什么String在Java中是不可更改的
- Java中String不可变性的本质
- Java中String不可变性以及通过反射进行修改
- 在java中,String为什么是不可变的类?
- Java中String类型的不可变性和驻留池
- java基础入门-你不知道的string-不可改变性与编译器优化
- Java String类型值真的不可改变吗?
- JAVA String类型不可变
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
- java:可变类StringBuffer与不可变类String
- JAVA不可变类(immutable)机制与String的不可变性
- java String不可变对象,但StringBuffer是可变对象
- JAVA不可变类(immutable)机制与String的不可变性
- Java进阶知识点4:不可变对象与并发 - 从String说起
- Java中String为什么是不可变