String StringBuffer StringBuilder
Posted 断剑重铸之时
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String StringBuffer StringBuilder相关的知识,希望对你有一定的参考价值。
1.string
String是不可变类:
String不是基本数据类型,而是一个对象,并且是final类型的,不可变的。(public static class String)
例如:
代码:String text = "a";
text = "b";
String不是不可变的么?为什么可以这样用?因为text是字符串"a"的引用,即引用是可以变化的,跟对象实例的属性变化没有关系。(这里创建的是两个String对象)
String设计成不可变的原因:
字符串常量池是Java方法区中的一个特殊的存储区域,当创建一个String对象时,假如这个字符串已经在常量池中了,就不会创建一个新的对象,而是引用已经存在的对象。常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量
String text1 = "abc";
String text2 = "abc";
上面的代码只会在堆内存中创建一个实际的String对象。如果字符串对象允许改变的话,那么会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。
栈(stack):主要保存基本数据类型和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆
堆(heap):用于存储对象
安全性,因为字符串是不可变的,所以线程是安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串本身是线程安全的。
1.StringBuffer,StringBuilder
StringBuffer:
StringBuffer和String一样都是用来存储字符串的,只不过他们内部的实现方式不一样,导致他们所使用的范围不同,对于StringBuffer,它在处理字符串的时候,如果是进行修改操作,并不会产生一个新的字符串对象。
StringBuffer的许多方法和String差不多,只不过修改时StringBuffer是修改自身的,而String类则是产生一个新的对象,这是他们最大的区别。
同时,StringBuffer是不能通过=来进行初始化的,它必须通过构造方法来进行初始化。
StringBuilder:
StringBuilder和StringBuffer的不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。
附:equals()是用来比较两个值的,==会比较两个引用
String字符串与BufferString的传递问题
-
基本数据类型的值传递,不改变其值;引用数据类型的值传递,改变其值
-
String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
以上是关于String StringBuffer StringBuilder的主要内容,如果未能解决你的问题,请参考以下文章
String,StringBuffer与StringBuilder的区别
(转)String,StringBuffer与StringBuilder的区别
重温java中的String,StringBuffer,StringBuilder类