使用此代码创建了多少个对象? - 我知道3个字符串文字在字符串常量池中,StringBuilder对象在堆中,但是当我调用reverse(),insert()或append()时它是否在池中创建了一个新字符串?
StringBuilder sb = new StringBuilder("abc"); sb.append("def").reverse().insert(3, "---"); System.out.println( sb );
创建的字符串: "abc", "def", "---"
"abc", "def", "---"
StringBuilders创建: sb
sb
sb.append("def").reverse().insert(3, "---") 没有创建新对象,只是编辑 StringBuilder's 内部缓冲区(这就是建议使用StringBuilder进行演出的原因) .
sb.append("def").reverse().insert(3, "---")
StringBuilder's
StringBuilder 只会在调用 toString() 时创建一个新字符串 . 在此之前,它保留了添加到其中的所有元素的 char[] 数组 .
StringBuilder
toString()
char[]
您执行的任何操作(如 insert 或 reverse )都在该阵列上执行 .
insert
reverse
在堆中只创建1个StringBuilder对象,无论该类提供哪种方法,如append,reverse等 .
无论使用 toString() 方法将其转换为String,都不会更改分配的内存 .
3 回答
创建的字符串:
"abc", "def", "---"
StringBuilders创建:
sb
sb.append("def").reverse().insert(3, "---")
没有创建新对象,只是编辑StringBuilder's
内部缓冲区(这就是建议使用StringBuilder进行演出的原因) .StringBuilder
只会在调用toString()
时创建一个新字符串 . 在此之前,它保留了添加到其中的所有元素的char[]
数组 .您执行的任何操作(如
insert
或reverse
)都在该阵列上执行 .在堆中只创建1个StringBuilder对象,无论该类提供哪种方法,如append,reverse等 .
无论使用
toString()
方法将其转换为String,都不会更改分配的内存 .