String、StringBuffer和StringBuilder简介说明
下文笔者讲述String,StringBuffer,StringBuilder之间的区别说明,如下所示
一、String
String类是不可变类 即一个String对象被创建以后 包含在这个对象中的字符序列是不可改变的 直至这个对象被销毁
String实例化方式
通过字面量方式实例化 String str ="java265.com"; 通过new+构造器的方式实例化 String str = newString("java265.com");
两者创建String的区别: 通过字面量方式为字符串赋值时 此时的字符串存储在方法区的字符串常量池中 通过new+构造器方式实例化字符串时 字符串对象存储在堆中 但是字符串的值仍然存储在方法区的常量池中 String字符串具有不可变性 当字符串重新赋值时 不管是对字符串进行拼接 还是调用String的replace()方法修改指定的字符或字符串 都不会在原来的内存地址进行修改 而是重新分配新的内存地址进行赋值
二、StringBuffer
StringBuffer对象代表一个字符序列可变的字符串 当一个StringBuffer被创建以后 通StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法 可以改变这个字符串对象的字符序列 但都不会产生新的对象 通过StringBuffer生成的字符串 可以调用toString()方法 将其转换为一个String对象
StringBuffer是线程安全
StringBuffer类中实现的方法
@Override public synchronized int length() { return count; } @Override public synchronized int capacity() { return value.length; } @Override public synchronized void ensureCapacity(int minimumCapacity) { super.ensureCapacity(minimumCapacity); } /** * @since 1.5 */ @Override public synchronized void trimToSize() { super.trimToSize(); } 从源码中可以看到 StringBuffer类中的方法 都添加synchronized关键字 此时方法添加一个锁,用于保证线程安全
三、StringBuilder
StringBuilder类 可变字符串对象 实际上 StringBuilder和StringBuffer基本相似 他们的原理与操作一样 两个类的构造器和方法也基本相同 不同的是: StringBuffer是线程安全 StringBuilder则没有实现线程安全功能,所以性能略高。
String、StringBuffer和StringBuilder三者的区别
String: 不可变的字符序列 底层使用byte[]存储 StringBuffer: 可变的字符序列: 线程安全的,效率低 底层使用 byte[] 存储。 StringBuilder: 可变的字符序列 jdk5.0新增 线程不安全 效率高 底层使用byte[]存储
性能比较
package com.java265; public class StringTest { public static void main(String[] args) { long startTime; long endTime; String str1 = ""; StringBuffer str2 = new StringBuffer(""); StringBuilder str3 = new StringBuilder(""); //1.拼接str1,计算String所耗时间 startTime = System.currentTimeMillis(); for(int i= 1;i<=10000;i++){ str1 += i; } endTime = System.currentTimeMillis(); System.out.println("String所耗时间为:" + (endTime-startTime) + "毫秒"); //2.拼接str2,计算StringBuffer所耗时间 startTime = System.currentTimeMillis(); for(int i= 1;i<=10000;i++){ str2.append(i); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer所耗时间为:" + (endTime-startTime) + "毫秒"); //3.拼接str3,计算StringBuilder所耗时间 startTime = System.currentTimeMillis(); for(int i= 1;i<=10000;i++){ str3.append(i); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder所耗时间为:" + (endTime-startTime) + "毫秒"); } } //运行以上代码,将输出以下信息 String所耗时间为:835毫秒 StringBuffer所耗时间为:3毫秒 StringBuilder所耗时间为:1毫秒
字符串操作可对比出三者效率 StringBuilder>StringBuffer>String
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。