String长度为什么不可变?
StringBuffer的长度为什么可变?
StringBuffer的长度为什么可变?
解决方案 »
- MyEclipse总是突然自动关闭、然后浏览器会打开www.13721.net这个网站
- [SOS]如何隐藏掉hibernate日志中的密码
- 请高手指教 hibernate有没有法子中断执行中的任务
- [100分求助]HPUNIX、WebLogic700环境下deploy CMP的问题
- 求Struts+EJB+Hibernate入门小实例
- hibernate中,当通过SessionFactory.openSession返回一个session对象时,该session对象是不是不含用任何持久化对象?
- 讨论:Struts+Spring+Hibernate框架在大中型项目中是否可行?
- 请教关于多主键的实体BEAN的写法,急急急
- Exception activating module的问题怎么解决啊?
- jdbc,sql出错,如何解决
- 做个调查:java开发的webservice有多少语言可以调用?
- Spring的异常问题?
而StringBuffer内部维护了一个数组吧
而StringBuffer 是字符串变量 它的对象是可以进行修改 和扩充的 它可以设定容量大小的构造器
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
private final char value[];
private final int offset;
private final int count;
private int hash; // Default to 0
private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
public String() {
this.offset = 0;
this.count = 0;
this.value = new char[0];
} public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
//......
}
而StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
那样浪费堆地址
str是final类型的
它在栈里指向堆内定义好的字符串,比如str = “xu”
那个堆内定义的字符串就是xu
str指向xu
如果你执行str = str+“XXXX”
那么堆需要再次开辟一个“xuXXXX”的空间给你
再让str指向xuXXXX
原来还有一个“xu”
这样内存就被浪费了
stringbuffer是一个可变对象
内部可以说有一个内存的池,默认长度为16个字节(或者16个字符大小,具体的忘记了,呵呵)
stringbuffer的对象可以主动malloc和delete来完成扩充和缩减的工作
于是其长度就可变了