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

简介: <p><span style="font-size:18px">   <span style="font-family:KaiTi_GB2312">上一篇文章</span><a target="_blank" href="http://blog.csdn.net/zlts000/article/details/44677933"><span style="font-family:KaiTi

   上一篇文章新手学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 

相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
175 57
|
29天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
81 8
|
2月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
92 17
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
149 4
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
98 2
|
2月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
95 4
|
2月前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
61 3
|
2月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
36 0