Java开发StringBuilder类

StringBuffer类和StringBuilder类功能基本相似。算是两个双胞胎。
下面主要说两点

第一点 线程安全
StringBuffer 线程安全
StringBuilder 线程不安全

关于线程安全的知识,正在学习,刚接触,没有太深入的了解,在这知识稍微的提一下。

线程安全——如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次
运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

StringBuffer类和StringBuilder类两者没有很大的区别,但是在线程安全方面,StringBuffer允许多线程进行字
符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized(这个关键字是为线程同步机制设定
的。) 修饰了,而StringBuilder没有。

简单的说一说synchronized的含义:
每一个类对象都对应一把锁,当某个Java技术线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行
M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻
塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。

因此,多线程编程中StringBuffer比StringBuilder要安全的多。

有一点需要注意的是,有的人会问,String类是不是也不安全? 事实上不存在这个问题,String是不可变的。线
程对于堆中指定的一个String对象只能读取,无法修改。还有什么不安全的?

第二点 效率问题
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
举个简单的例子:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class TestCharacter{
final static int time=100; //循环次数

public TestCharacter(){

}

public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0;i<time;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; i<time; 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; i<time; 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; i<time; 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; i<time; 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();
}

}

时间: 2024-10-14 14:11:11

Java开发StringBuilder类的相关文章

java开发常用类

Object类:超类,所有类的父类 equals(String str):用于比较两个对象(字符串)是否相等 toString() :返回字符串 System类:系统类  out:输出 in:接收键盘输入 exit():停止程序 currentTimeMillis():返回以毫秒为单位的当前时间 Math类:算法类  ceil(double d):小数点后为零 取整数,不为零向上取整 double d =212.9; Math.ceil(d);---->213; double d2 = 212.

常用Java开发工具类

common: LruLinkedHashMap:一个支持Lru算法的LinkedHashMap. 源码地址:点击打开链接 MD5:MD5工具类 源码地址:点击打开链接 Slicer:可以将List切割成多个List的工具类. 源码地址:点击打开链接 TimeCounter:一个方便的计时器,不用手动的使用System.nanoTime()去计算程序时间,使用ThreadLocal实现,线程安全且具有可重入特性. 源码地址:点击打开链接 并发相关: CompletableTreadPoolUti

Java StringBuilder类

StringBuilder的原理 String类 字符串是常量,它们的值在创建之后不能更改 字符串的底层是一个被final修饰的数组,不能改变 private final byte[] value; 进行字符串的相加,内存中就会多字符串,占用空间多,效率低下 如: "a" + "b" + "c" = "abc" 相加之前 "a" "b" "c" 就有三个字符串了(&q

(1)StringBuilder类和StringBuffer类 (2)日期相关的类 (3)集合框架 (4)List集合

1.StringBuilder类和StringBuffer类(查手册会用即可)1.1 基本概念 由于String类描述的字符串内容无法更改,若程序中出现大量类似的字符串时需要申请独立的内存空间单独保存,此时对内存空间的消耗比较大. 为了节省内存空间希望对字符串内容本身直接进行更改,则需要使用java.lang.StringBuilder类或者java.lang.StringBuffer类. 其中StringBuffer类是从jdk1.0开始存在,是一个线程安全的可变字符序列,效率比较低 其中St

Object类.时间日期类.System类.Stringbuilder类.包装类

Object类 java.lang.Object类是java语言中的根类,即所有类的父类.它中描述的所有方法都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类没有特别指定父类,那么默认则继承自Object类.例如: 自己随便定义的一个类: public void Demo{ //......... } 根据JDK源码和Object类的API文档,Object类当中包含的方法有11个,然后,我只挑选了两个来做重点介绍: public String toString():返回

阿里巴巴 Java 开发手册 1.4.0

一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ / name__2. [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用.正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同

java中stringBuilder的用法

java中stringBuilder的用法 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类.例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能. 通过用一个重载的

Java使用StringBuilder时--找不到符号

写了个Test试了下Java的StringBuilder类 代码如下: import java.util.Scanner;public class StringBuilder1{    public static void main(String[] args)    {      Scanner in = new Scanner(System.in);      System.out.println("开始用许多小段的字符串构建一个字符串:");      System.out.pr

第9篇-JAVA面向对象-常用类Ⅴ

第9篇-JAVA面向对象-常用类Ⅴ 每篇一句 :巨轮寻深水而航行 初学心得: 没有胆大的猜测就没有伟大的发现 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-13| JAVA面向对象 Ⅴ] 1.JAVA Scanner类 java.util.Scanner 是 Java5 的新特征,读者可以通过 Scanner 类来获取用户的输入 创建 Scanner 对象的基本语法格式: Scanner s = new Scanner(System.in); 使用 next 方法代码: 1