这段代码创建了多少个对象?我知道3个字符串字面量在字符串常量池中,而StringBuilder对象在堆中。但是当我调用reverse()、insert()或append()方法时,它是否会在常量池中创建一个新的字符串?
StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );
这段代码创建了多少个对象?我知道3个字符串字面量在字符串常量池中,而StringBuilder对象在堆中。但是当我调用reverse()、insert()或append()方法时,它是否会在常量池中创建一个新的字符串?
StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );
StringBuilder
类只有在调用 toString()
方法时才会创建一个新的字符串。在此之前,它会保持一个所有添加进去的元素所组成的 char[]
数组。
任何你执行的操作,比如 insert
或者 reverse
,都是在该数组上执行的。
append(String str)
时,JVM不会创建另一个字符串对象吗? - RP-append(String str)
方法时,首先必须正确创建str
对象。 - RP-创建的字符串:"abc", "def", "---"
创建的字符串构建器:sb
sb.append("def").reverse().insert(3, "---")
并没有创建新的对象,只是编辑了 StringBuilder
的内部缓冲区(这就是为什么推荐使用 StringBuilder 来提高性能)。
"abc"
、"def"
和"---"
之外,还有一个字符串。System.out.println
使用String.valueOf
,它会在传递的对象上调用toString()
方法,由于我们传递了sb
,因此它调用了它的toString
方法,从而创建了这个额外的实例。 - PshemoStringBuilder
构造函数创建的内部 StringBuilder
对象。 - BobbyStringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );
无论使用StringBuilder类提供的哪种方法,如append、reverse等,堆中只会创建1个对象。
一旦分配了内存,即使使用toString()方法将其转换为字符串,内存也不会改变。