Java之String,StringBuffer,StringBuilder类

在 java 语言中, 用来处理字符串的的类常用的有 3 个: String、StringBuffer、StringBuilder。

它们的异同点:

1) 都是 final 类, 都不允许被继承;

2) String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的;

3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。就是说StringBuffer类中的很多方法使用了synchronized关键字修饰,允许多线程进行操作字符串。

三个类大部分时间性能:StringBuilder》StringBuffer》String。

4) StringBuffer 和StringBuilder 方法的使用基本上一样

使用以下代码测试性能:

 1 public class TestStringClass {
 2
 3     private final int LOOPS = 200000;
 4     private final String CONSTANT_STRING = "java-String";
 5
 6     public static void main(String[] args) {
 7
 8         new TestStringClass().testString();
 9         new TestStringClass().testStringBuffer();
10         new TestStringClass().testStringBullder();
11     }
12
13     public void testString() {
14         String string = "";
15         long currentTime = System.currentTimeMillis();
16         for (int i = 0; i < LOOPS; i++) {
17             string += CONSTANT_STRING;
18         }
19         long endTime = System.currentTimeMillis();
20         System.out.println("String: " + (endTime - currentTime));
21     }
22
23     public void testStringBuffer() {
24         StringBuffer stringBuffer = new StringBuffer();
25         long currentTime = System.currentTimeMillis();
26         for (int i = 0; i < LOOPS; i++) {
27             stringBuffer.append(CONSTANT_STRING);
28         }
29         long endTime = System.currentTimeMillis();
30         System.out.println("StringBuffer: " + (endTime - currentTime));
31     }
32
33     public void testStringBullder() {
34         StringBuilder stringBuilder = new StringBuilder();
35         long currentTime = System.currentTimeMillis();
36         for (int i = 0; i < LOOPS; i++) {
37             stringBuilder.append(CONSTANT_STRING);
38         }
39         long endTime = System.currentTimeMillis();
40         System.out.println("StringBullder: " + (endTime - currentTime));
41     }
42 }

结果:

String: 149549
StringBuffer: 9
StringBullder: 7

差别很明显。String的性能差的厉害。

但是呢,假如在编译阶段使用字符串常量的话,String的性能会很快的。

总结:

1.在编译阶段使用字符串常量的话,使用String。比如:String haha = "I" + " am " + "java";

2.在不考虑线程安全的情况下,StringBuilder对象的append效率高于StringBuffer对象的append效率要高于String对象的"+"连接操作。

3.多线程同步的情况下,建议使用StringBuffer。

时间: 2024-11-12 19:33:56

Java之String,StringBuffer,StringBuilder类的相关文章

重温java中的String,StringBuffer,StringBuilder类

任何一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String 类已在上一篇随笔 小瓜牛

java ——String , StringBuffer, StringBuilder类

一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: “==”  比较两个对象是否引用同一实例 public class StringDemo { public static void main(String args[]) { StringDemo1(); } public static void StringDemo1() { String str1="abcd"; Str

Java的String&amp;StringBuffer&amp;StringBuilder

一:String类 1.String对象的初始化 由于String对象特别用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "abc"; s = "Java语言"; 其实按照面向对象的标准语法,其格式应该为: String s = new String("abc"); s =new String("Java语言"); 只是按照面向对象的标准语法,在内存使用上存在比较大

JAVA中String和StringBuilder类的特点及使用

转自:https://www.imooc.com/code/2202 仅做个人学习记录之用,侵删! 什么是 Java 中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: Java 中字符串的不变性 String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同.如下所示: 运行结果: 结合上面的代码,关于字符串小

整理Java基础知识--StringBuffer&amp;StringBuilder类

StringBuffer 类 & StringBuilder 类String 长度大小不可变StringBuffer 和 StringBuilder 长度可变StringBuffer 线程安全 StringBuilder 线程不安全StringBuilder 速度快StringBuffer 类 & StringBuilder 类的对象能够被多次修改,并且不产生新的未使用对象(String会产生新的,并且比较耗费内存)StringBuffer 方法1.指定字符串追加字符到这个字符序列xxxx

java中String&amp;StringBuffer&amp;StringBuilder

1. String,字符串常量 StringBuffer,字符串变量(线程安全) StringBuilder,字符串变量(非线程安全) 2.String and StringBuffer String和StringBuffe的主要区别在于String是不可变对象,每次对String进行改变的时候其实 等于生成了一个新的String对象,因此经常改变内容的字符串不要使用String类型,因为每次形成新的对象都会对系统的性能产生影响,特别当内存中的无引用的对象多了之后,JVM的GC就会开始工作,那速

java中string , StringBuffer , StringBuilder 区别

1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这样的值,虚拟机则会另外在方法区中划分出一块内存空间存储字符串常量,然后把这块地址赋给String变量. 因此,String类的内容声明后不可被改变,改变的只是其内存地址的指向. 2.StringBuffer StringBuffer是使用缓冲区存储字符串对象的,对象的内容可以改变.并且是线程安全的.

Java中String, StringBuffer, StringBuilder

String: 1,是字符串常量,一旦创建就不能修改.对于已经存在了的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 2,String也是final类,不能被继承. 3,而且String是对象而不是基本类型. 4,string重写了equals方法和hashCode()方法. StingBuffer: 1,是字符串可变对象,可以对字符串进行操作,修改字符串原有值时不会新建一个对象. 2,执行效率较慢,但是线程安全 3,StringBuffer没有覆盖equals方法和ha

【Java】String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以