全面解释java中StringBuilder、StringBuffer、String类之间的关系

2016-02-19 11:39 6 1 收藏

下面图老师小编要跟大家分享全面解释java中StringBuilder、StringBuffer、String类之间的关系,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

1. String 类

  String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
因此String的操作都是改变赋值地址而不是改变值操作。

2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

3.StringBuffer
  StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。

4.线程安全
StringBuffer 线程安全
StringBuilder 线程不安全

5.速度
一般情况下,速度从快到慢:StringBuilderStringBufferString,这种比较是相对的,不是绝对的。

6.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

以下是代码与演示说明:

代码如下:

public class TestCharacter {
final static int time = 50000; //循环次数

public TestCharacter(){

}
public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0; itime; i++){
s += “add”;
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”);
}
public void test(StringBuffer s){
long begin = System.currentTimeMillis();
for(int i=0; itime; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getCanonicalName()+”类型使用的时间为:”+(over-begin)+”毫秒”);
}
public void test(StringBuilder s){
long begin = System.currentTimeMillis();
for(int i=0; itime; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”);
}

/*对 String 直接进行字符串拼接的测试*/
public void test2(){
String s2 = “abcd”;
long begin = System.currentTimeMillis();
for(int i=0; itime; i++){
String s = s2 + s2 +s2;
}
long over = System.currentTimeMillis();
System.out.println(“操作字符串对象引用相加类型使用的时间为:”+(over-begin)+”毫秒”);
}
public void test3(){
long begin = System.currentTimeMillis();
for(int i=0; itime; i++){
String s =”abcd” + “abcd” + “abcd”;
}
long over = System.currentTimeMillis();
System.out.println(“操作字符串相加使用的时间为:”+(over-begin)+”毫秒”);
}
public static void main(String[] args){
String s1 = “abcd”;
StringBuffer st1 = new StringBuffer(“abcd”);
StringBuilder st2 = new StringBuilder(“abcd”);
TestCharacter tc = new TestCharacter();
tc.test(s1);
tc.test(st1);
tc.test(st2);
tc.test2();
tc.test3();
}
}

我在myeclipse和dos下都运行了这段代码,各自打印出的时间有些不同,运行结果如下:
1)myeclipse下循环10000次时:

2)myeclipse下循环50000次时:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)3)在DOS下运行时:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1598102.html

延伸阅读
最佳答案 : 主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故。 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final。 其它答案一 : String 和其他基本类型不同 , 他是个对象类型. 既然是对象类型 , 如果是在静态方法下是必须调用静态方法或值的 , 如果是非静态的方法 , 就必须要实例化. mai...
人体是一个统一的有机整体,它是由脏腑、经络等许多组织器官所构成的。各脏腑、组织、器官的功能活动不是独立的,而是整体活动的一个组成部分,它们不仅在生理功能上存在着相互制约、相互依存和相互为用的关系;而且还以经络为联系通道,在各脏腑组织之间,相互传递着各种信息,在气血津液环周于全身情况下,形成了一个非常协调和统一的整体...
package com.adrop.util; ?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />   import Java.io.*; import java.util.Properties; import javax.servlet.http.*; import javax.servlet.*; import javax.servlet.jsp.*;   public class PropertiesUtil {   private String fileNam...
1:类的基本概念 Java程序的基本单位是类,类是对象的实例,或者说对象是类定义的的数据类型的变量。你建立类之后,就可用它来建立许多你需要的对象。Java把每一个可执行的成分都变成类。 类的定义形式如下: class classname extends superclassname { ..... } 这 里,classname和superclassname是合...
标签: Java JAVA基础
Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年。这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它。 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一...

经验教程

943

收藏

53
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部