将单字符String附加到StringBuilder

时间:2016-07-19 10:31:44

标签: java string performance

我想知道做

是否有一些好处
sb.append('\n').toString();

在:

sb.append("\n").toString();

"\n"代替'\n'表现。

具有字符而不是字符串的版本在内存方面会更有效吗?或者编译器会发现字符串是实际的字符吗?

3 个答案:

答案 0 :(得分:1)

在课程java.lang.AbstractStringBuilder中,添加一个char将确保/ 1扩展容量,而追加CharSequenceString将同样对象的长度。

可以说,在后面的案例中调用length会有轻微的开销。

你几乎不会注意到它。

有人可能会争辩说,附加一个String字面值会产生实际内容的开销,但同样应该被认为是最小的开销。

答案 1 :(得分:1)

我做了一个小实验来测试两个选项的性能:

似乎'\ n'在大规模操作中肯定更快。

但规模较小,难以察觉。即使是内存消耗似乎也非常微不足道。

此代码附加\ n,1000次:

    package test;           


    public class StringAppend {         

        public static void main(String[] args) {            

            //Run 1         
            long startTime = System.nanoTime();         
            long startMem = Runtime.getRuntime().freeMemory();          
            StringBuilder sb1 = new StringBuilder("This is a test");            
            for (int i = 1; i <= 1000; i++) {           
                sb1.append("\n");           
            }           
            sb1.append("To Test \"\\n\"");          
        System.out.println("sb1 = " + sb1.toString());          
        long endTime = System.nanoTime();           
        long endMem = Runtime.getRuntime().freeMemory();            

        //Run 2         
        long startTime2 = System.nanoTime();            
        long startMem2 = Runtime.getRuntime().freeMemory();         
        StringBuilder sb2 = new StringBuilder("This is a test");            
        for (int i = 1; i <= 1000; i++) {           
            sb1.append('\n');           
        }           
        sb1.append("To Test '\\n'");            
        long endTime2 = System.nanoTime();          
        long endMem2 = Runtime.getRuntime().freeMemory();           
        System.out.println("Run1: append \"\\n\"execution time [" + (endTime - startTime) + " nanos], Memory " + "[" + (endMem - startMem) + "]");          
        System.out.println("Run2: append '\\n' execution time [" + (endTime2 - startTime2) + " nanos], Memory " + "[" + (endMem2 - startMem2) + "]");           
    }           
}           

以下是我在高性能笔记本电脑上发现的结果:

  

Run1:追加“\ n”执行时间[767526 nanos],Memory [0]

     

Run2:追加'\ n'执行时间[121823 nanos],Memory [0]

答案 2 :(得分:0)

Java确实为单个字符串创建了一个字符串实例。

@Html.ActionLink("Register", "Signup", "Account", null, new { @class = "call-to-action", id = "registerLink" })