Java教程-String 和 StringBuffer 的区别
String 和 StringBuffer 有很多区别。下面列出了 String 和 StringBuffer 之间的差异:
No. | String | StringBuffer |
---|---|---|
1 | String 类是不可变的。 | StringBuffer 类是可变的。 |
2 | 当我们连接太多字符串时,String 很慢并且会消耗更多内存,因为每次它都会创建新实例。 | 当我们连接 t 个字符串时,StringBuffer 速度很快并且消耗的内存更少。 |
3 | String 类覆盖了 Object 类的 equals() 方法。所以可以通过equals()方法比较两个字符串的内容。 | StringBuffer 类不会覆盖 Object 类的 equals() 方法。 |
4 | 字符串类在执行串联操作时速度较慢。 | StringBuffer 类在执行串联操作时速度更快。 |
5 | String类使用String常量池。 | StringBuffer 使用堆内存 |
String和StringBuffer的性能测试
ConcatTest.java
public class ConcatTest{
public static String concatWithString() {
String t = "Java";
for (int i=0; i<10000; i++){
t = t + "Tpoint";
}
return t;
}
public static String concatWithStringBuffer(){
StringBuffer sb = new StringBuffer("Java");
for (int i=0; i<10000; i++){
sb.append("Tpoint");
}
return sb.toString();
}
public static void main(String[] args){
long startTime = System.currentTimeMillis();
concatWithString();
System.out.println("Time taken by Concating with String: "+(System.currentTimeMillis()-startTime)+"ms");
startTime = System.currentTimeMillis();
concatWithStringBuffer();
System.out.println("Time taken by Concating with StringBuffer: "+(System.currentTimeMillis()-startTime)+"ms");
}
}
输出:
Time taken by Concating with String: 578ms
Time taken by Concating with StringBuffer: 0ms
上面的代码计算了使用 String 类和 StringBuffer 类连接字符串所需的时间。
String 和 StringBuffer 哈希值测试
正如我们在下面给出的程序中看到的,String 在执行连接时返回新的哈希值,但 StringBuffer 类返回相同的哈希值。
InstanceTest.java
public class InstanceTest{
public static void main(String args[]){
System.out.println("Hashcode test of String:");
String str="java";
System.out.println(str.hashCode());
str=str+"tpoint";
System.out.println(str.hashCode());
System.out.println("Hashcode test of StringBuffer:");
StringBuffer sb=new StringBuffer("java");
System.out.println(sb.hashCode());
sb.append("tpoint");
System.out.println(sb.hashCode());
}
}
输出:
Hashcode test of String:
3254818
229541438
Hashcode test of StringBuffer:
118352462
118352462