新手学JAVA(三)----StringBuilder类

上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致

每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变

类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。

StringBuffer类和StringBuilder类功能基本相似。算是两个双胞胎。

下面主要说两点

第一点  线程安全

StringBuffer  线程安全

StringBuilder 线程不安全

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

线程安全——如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次

运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

StringBuffer类和StringBuilder类两者没有很大的区别,但是在线程安全方面,StringBuffer允许多线程进行字

符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized(这个关键字是为线程同步机制设定

的。) 修饰了,而StringBuilder没有。

简单的说一说synchronized的含义:

每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行

M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻

塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。

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

有一点需要注意的是,有的人会问,String类是不是也不安全? 事实上不存在这个问题,String是不可变的。线

程对于堆中指定的一个String对象只能读取,无法修改。还有什么不安全的?

第二点  效率问题

一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。

举个简单的例子:

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();
	} 

}

下面是循环50000次,10000次,1000次,100次的运行结果:

总结

(1).如果要操作少量的数据用 = String

(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

时间: 2024-12-22 14:47:59

新手学JAVA(三)----StringBuilder类的相关文章

【经验分享】新手学Java编程语言怎么入门?

新手学Java编程语言怎么入门?掌握语言基础是第一步,了解java基础知识,Java关键字.核心概念或者基本编码技术.掌握操作符.控制执行流程.访问权限控制.复用类.多态.接口.字符串.泛型.数组.容器深入研究.JavaI/O系统.枚举类型.并发以及图形化用户界面等内容. 为了帮助大家更轻松的学好java开发,给大家分享一套java开发学习资料,小编推荐一个学java开发技术的学习裙:三七四三二零二八二,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的新手认为java很难学,遇到问题没人解答,又或者是答案太多,根本不知道哪个回答是正确的.所以,我们得出结论,能系统学习的,有老师指导的java课程学起来相对容易,而没有人指导,仅仅靠看视频学习的同学来说会无形中增加难度. 很多新手在准备转行学习java之前,在网上看到或听到很多不懂的人会说,jav

Java开发StringBuilder类

StringBuffer类和StringBuilder类功能基本相似.算是两个双胞胎. 下面主要说两点 第一点 线程安全 StringBuffer 线程安全 StringBuilder 线程不安全 关于线程安全的知识,正在学习,刚接触,没有太深入的了解,在这知识稍微的提一下. 线程安全——如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. StringBuffer类和S

新手学JAVA(二)----String类与StringBuffer类的区别

在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类). 下面先简单的说一下两者的区别. String类和StringBuffer类都提供了相应的方法实现字符串的操作,但二者略有不同. (1) String类 该类一旦产生一个字符串,其对象就不可变.String类的内容和长度是固定的.如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现.虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例.系统为Stri

新手学JAVA(六)----处理随机性的数据

基础知识 实例 在我们的日常生活中会遇到很多随机性的事情,比如:摇奖,彩票,掷色子,这些都可以通过程序计算其中奖的概率.在JAVA的类库中,有一个专门操作这种随机性数据的类--Random类. 基础知识 Random类一般使用在那些随机性比较强的场合,因为这些场合都含有一种随机的特性,也就是使用同样的方法去操作数据,每次操作的结果都不一样. 下面是Random类的常用方法: 方法 表示 public boolean nextBoolean() 返回true或者是false public doub

新手学Java笔记心得之Java基础

第一次学习Java,一些基本的常用的快捷方式和一些很基础的知识点(笔记比较零散比较乱) Java是一种既面向对象又可以跨平台的语言,即:编写一次,随处运行: Java不仅适用于单机应用程序和基于网络的程序,也可用于创建消费类设备的附件程序,如移动电话.掌上设备等. Java命名规范首字母可以是字母,下划线'_','$'符号后面加上任意多的数字,字母,下划线,'$'符号通常第一个单词的首字母小写,其后单词的 首字母大写.例如:myScore MyEclipse编写Java代码的快捷键(新手不推荐使

新手学JAVA(七)----Override VS Overload

一 Overload 二 Override 三 多态性 一. Overload 在同一个类中的许多方法可以拥有相同的名字,只要他们的参数声明不同即可,这种方法被称为重载. 举个例子: public class overload{ '''一个重则输出方法''' void print(){ System.out.println("Hello!"); } '''重载上面的输出方法,加上了参数''' void print(String name) { System.out.println(na

新手学Java(一)——Equals和“==”的区别

一句话概括: 如果操作两边都是对象句柄,就比较两个句柄是否指向同一个对象.如果两边是基本类型,则比较的就是值. ==不属于任何类,而equals则是任何类(Java中)的一个方法. equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身):而equals()是Object的方法之一. 我们可以这样比较: 1)Primitive1(基本类型)== Primitive2(基本类型) 2)Object1 Reference1(对象引用)== Object1

新手学JAVA(十一)-多线程----线程的生命周期

新建和就绪状态 运行状态和阻塞状态 线程死亡 当一个线程被创建并启动之后,并不是一开始就处于执行状态,已不是一直处于运行状态.线程也是有生命周期的,包括:创建(New).就绪(Runnable).阻塞(Blocked).运行(Running).死亡(Dead)五种状态.当线程运行时,也不可能一直霸占着CPU独自运行,而是一直在运行.就绪状态之间切换. 新建和就绪状态 当程序通过new创建一个线程时,这个线程就处于新建(New)状态了,不过这个时候该线程并没有表现出线程的任何特征,和其他的普通ja