String、StringBuffer和StringBuilder简介说明

乔欣 Java经验 发布时间:2023-07-07 13:45:25 阅读数:10685 1
下文笔者讲述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
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202307/16887087727024.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者