文档章节

Java字符串的String、StringBuilder、StringBuffer三者特性详解

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/12 22:25
字数 850
阅读 160
收藏 3

一、不可变String类型

字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再改变。虽然String类中提供很多方法看起来像是可以修改String对象,比如trim()、subString()等等,但是实际上它们并没有改变原来的字符串对象,这些方法传递的只是引用的一个拷贝,所以重新创建了一个String类型的对象,并且有了新的引用。

例如下面一段代码可以说明String的不可变特性:


package date0804.demo2;
 
 
public class ImmutableString {
 
    public static void main(String[] args){
         
        String str=new String("xyz");
        change(str);
        System.out.println(str);
    }
     
    public static void change(String s) {
        s="xml";
    }
}



其输出结果为


str=xyz

因此,我么可以看到每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未改变过。

另外,String对象还支持+操作符,+操作符可以合并字符串,但是根据相关的研究发现,使用+操作符来连接字符串会使得效率下降,因而,涉及到字符串的更改时,优先使用下面的StringBuilder或StringBuffer,二者都提供了丰富的字符串处理命令。

二、StringBuilder类型

StringBuilder类型是一个可变的字符串类型,StringBuilder类型的API与StringBuffer类型的API基本一致,唯一的区别是StringBuilder的使用假设在单一线程中,换句话说,StringBuilder是线程不安全的。StringBuilder在实例化的时候,通常也会默认设定一个容量大小,一般为字符串参数的长度+16。StringBuilder是继承AbstractStringBuilder这个抽象类的,而这个抽象类的内部使用字符数组来实现的,数组可以进行动态扩展。StringBuilder类提供的常用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,可以实现字符串的增删改查等基本功能。


package date0812.demo1;

public class Test3 {

	public static void main(String[] args) {
		StringBuilder stringBuilder = new StringBuilder("Eclipse");
		//添加
		stringBuilder = stringBuilder.append(" software");
		//容量
		int C = stringBuilder.capacity();
		//翻转
		stringBuilder= stringBuilder.reverse();
		System.out.println(C);
		System.out.println(stringBuilder);
	}
}


运行结果:
23
erawtfos espilcE



三、StringBuffer类型

StringBuffer是一个可变的、线程安全的处理字符串的类型。同样,StringBuffer也是继承AbstractStringBuilder抽象类的,因此内部也是使用字符数组来存储字符串的。与StringBuilder的区别是,StringBuffer类型的绝大多数方法的修饰符都加上了关键字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,这一方面表明StringBuffer是线程安全的,可以用于多线程并发的场合,所有对StringBuffer的并发操作都要按照一定的顺序来执行,确保它们都能够正确的执行;另一方面,也表明StringBuffer的开销要比StringBuilder大一点。StringBuffer是要早于StringBuilder开发的,在单一线程中,可以使用StringBuilder来提高运行速度,如果遇到多线程需要同步时,则使用StringBuffer类型。其他的,在API的调用方面,基本上一模一样。


© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
【翻译】Java中String, StringBuffer, StringBuilder的区别

String 是 Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会用String定义一些内容,然后通过著名的System.out.println()语句来打印出来。 然而,很多Java新手都不会意识到 String...

YuanyuanL
2014/09/03
462
4
[Java学习]Striing StringBuffer StringBuilder 的比

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/52159425 最近发现对java中一些比较基础的东西掌握还是...

紫雾凌寒
2016/08/09
0
0
String、StringBuilder、StringBuffer 用法比较

String、StringBuilder、StringBuffer 三个类源自JDK的 java/lang/ 目录下: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全,JDK 5.0(1.5.0...

长平狐
2013/01/06
148
0
Java基础1(String StringBuilder StringBuffer 三者区别)

问题:String str =“niu”; 创建了一个对象 常量池 String str ="hah" +"oo"; 创建了三个对象 都在常量池 String str =new String("oo"); 创建了2个对象 一个在常量池,另外一个被复制到堆......

木九天
2018/01/25
21
0
Java中String/StringBuffer/StringBuilder区别(转)

1、三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2、String <(StringBuffer,StringBuilder)的原因 String:字符串常量 StringBuffer:字符串变量 StringBuilder:字......

easonjim
2017/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

电脑萌新向这看!荣耀笔记本装Win10系统攻略

     随着 Win10 系统功能的完善,越来越多的人想要为自己的电脑重装载一个 Win10 系统。但很多小伙伴对于重装系统也只是一知半解,不知道如何重装 win10 系统才是正确的。笔者认为,重装...

梅丽莎好
12分钟前
2
0
玩转阿里云 Terraform(四):Terraform 常用命令详解

通过前几篇文章的介绍,相信大家对Terraform已经有了大致的熟悉和了解,本文将从实践开始,向大家介绍Terraform的几个常见命令。 Terraform是一个面向客户端的工具,所以对所有资源的管理都是...

阿里云官方博客
14分钟前
3
0
GMAT数学满分目标 5条精华备考经验分享

GMAT数学对于大部分中国考生来说难度并不算太高。但伴随着近年来GMAT数学题难度逐渐提升的趋势,想要在GMAT数学部分保住高分满分的成绩以带动GMAT整体得分也变得越来越困难。下面小编就为大家...

bole6
19分钟前
3
0
elasticsearch 聚合之后获取桶的平均值avg_bucket或者stats_bucket

例子 GET /collect_data_store_goods_fact*/_search{ "query": { "match_all": {} }, "size": 0, "aggs": { "brand":{ "terms": { ......

之渊
25分钟前
3
0
一篇文章把你带入到JavaScript中的闭包与高级函数

在JavaScript中,函数是一等公民。JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式。 function dada(...

达达前端小酒馆
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部