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
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


