2015-02-05 44 views
0

我写了这段代码来比较StringStringBuffer计数创建的字符串对象数

public static void main(String[] args) { 
    String inputText = "let us learn pig latin"; 
    usingString(inputText); 
    usingStringBuffer(inputText); 
} 

public static void usingString(String input) { 
    String pigLatinText = new String(); 
    input = input.trim(); 
    String tokens[] = input.split(" "); 
    for (int i = 0; i < tokens.length; i++) { 
     String temp = tokens[i]; 
     temp = temp.substring(1) + temp.charAt(0); 
     temp += "ay"; 
     pigLatinText += temp+" "; 
    } 
    System.out.println("Using String    :"+pigLatinText); 
} 

public static void usingStringBuffer(String input) { 
    String pigLatin = new String(); 
    input = input.trim(); 
    String tokens[] = input.split(" "); 
    for (int i = 0; i < tokens.length; i++) { 
     StringBuffer temp = new StringBuffer(tokens[i]); 
     temp.append(temp.charAt(0)).deleteCharAt(0); 
     temp.append("ay"); 
     pigLatin += temp+" "; 
    } 
    System.out.println("Using String Buffer :"+pigLatin); 
} 

我知道String +运营商内部使用StringBuilderappend()。它创建临时对象,因为它是不可变的。 我正在尝试以证明通过计算在使用String时使用创建的对象的数量以及使用StringBuffer时的对象数量。 使用静态变量来计算对象的数量不会帮助我,因为我无法修改String类。我发现这个link。看起来很有希望。但我不知道如何修改Object.java文件。 使用System.currentTimeInMillis()前后并没有帮助,因为这个操作很小。 所以我的问题是

  1. 有没有什么办法来分析或比较这些类别的表现?
  2. 如何计算在程序中创建的String对象的数量?
+1

Netbeans有一个'Profile'功能,可以让你看到创建了多少个String。 – DeadlyJesus 2015-02-05 14:11:39

回答

1

首先串联的字符串使用StringBuilderStringBuffer完成。

例如:

public static void main(String[] args) { 
    String s = "a"; 
    String s1 = s + "b"; 
} 

字节代码s1=s+"b"

 16: invokevirtual #31 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 

在这里,你创建3个字符串对象的 “a” 和 “b” 是字符串文字(也是字符串对象)并进入String常量池。 "ab"将在运行时间期间使用StringBuilder创建。

StringBuffer线程安全/同步所以它会比StringBuilder慢。

+0

感谢您的快速回复。我纠正了这个错误。我的问题不是关于字符串缓冲区和生成器。 – Ram 2015-02-05 14:39:28