java无效的字符串或缓冲区长度_Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)...

一、字符串拼接问题

由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。

Demo:

1 public classStringDemo {2 public static voidmain(String[] args) {3 String s = "Hello";4 s += "World";5 System.out.println(s);6 }7 }

上面这段代码,总共产生了三个字符串,即“Hello”,“world” 和 “HelloWorld”。引用变量 s 首先执行 Hello 对象,最终指向拼接出来的新字符串对象,即 HelloWorld。

由此可见,如果对字符串进行拼接操作,每次拼接,都会构建一个新的 String 对象,既耗时,又浪费空间。为了解决这一问题,可以使用 java.lang.StringBuilder 类。

String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。

二、可变字符序列:字符串缓冲区

1、StringBuffer、StringBuilder、String 的区别

581a304c559c8e4f723489823db6499c.png

(1)一个类似于 String 的字符串缓冲区,但能被修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容,所有对 StringBuffer 或 StringBuilder 对象的字符序列的修改不会产生新的 StringBuffer 或 StringBuilder 对象,这点和String很大的不同。

1770735d490762e0e21d7e6555b3c48d.png

value没有final声明,value可以不断扩容,count记录有效字符的个数。

(2)StringBuilder:线程不安全,效率高 StringBuffer:线程安全,效率低;

2、StringBuilder 概述(JDK1.5引入,线程不安全)

StringBuilder又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。

原来StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作。

它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder会自动维护数组的扩容。(默认char[]数组16字符空间,如果不够了扩容为原来的 2 倍+2)

e669d04029e14c6205a9460072eb63a7.bmp

三、 StringBuffer和StringBuilder不同的API

1、构造方法

常用构造方法:

StringBuffer或StringBuilder对象的创建必须用new+构造器。

StringBuffer() 初始容量为16的字符串缓冲区

StringBuffer(int size) 构造指定容量的字符串缓冲区

StringBuffer(String str) 将内容初始化为指定字符串内容

public StringBuilder():构造一个空的StringBuilder容器。

public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去。

Demo:

1 public classStringBuilderDemo {2 public static voidmain(String[] args) {3 StringBuilder sb1 = newStringBuilder();4 System.out.println(sb1); //(空白)5 //使用带参构造

6 StringBuilder sb2 = new StringBuilder("java");7 System.out.println(sb2); //java

8 }9 }

2、常用方法

常用方法:

public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身

StringBuffer delete(int start,int end):删除指定位置的内容

deleteCharAt(int index):删除[index]位置

StringBuffer insert(int offset, xx):在指定位置插入xx

StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str

StringBuffer reverse() :把当前字符序列逆转

setCharAt(int index, char ch):替换[index]位置的字符为ch

setLength(int newLength) :设置缓存的长度

substring(int start, int end):截取

indexOf(String str) :获取某个串第一次出现的顺序

lastIndexOf(String str):获取某个串最后的索引位置

public String toString()`:将当前StringBuilder对象转换为String对象

注意:上面的方法支持方法链。

(1)append 方法

append方法具有多种重载形式,可以接收任意类型的参数。任何数据作为参数都会将对应的字符串内容添加到StringBuilder中。

Demo:

1 public classStringBuilder {2 public static voidmain(String[] args) {3 //创建对象

4 StringBuilder builder = newStringBuilder();5 //public StringBuilder append(任意类型)

6 StringBuilder builder2 = builder.append("hello");7 //对比一下

8 System.out.println("builder:"+builder);9 System.out.println("builder2:"+builder2);10 System.out.println(builder == builder2); //true11 //可以添加 任何类型

12 builder.append("hello");13 builder.append("world");14 builder.append(true);15 builder.append(100);16 //在我们开发中,会遇到调用一个方法后,返回一个对象的情况。然后使用返回的对象继续调用方法。17 //这种时候,我们就可以把代码现在一起,如append方法一样,代码如下18 //链式编程

19 builder.append("hello").append("world").append(true).append(100);20 System.out.println("builder:"+builder);21 }22 }

Tips:StringBuilder已经覆盖重写了Object当中的toString方法。

2、toString 方法

通过toString方法,StringBuilder对象将会转换为不可变的String对象。

Demo:

1 public classDemo16StringBuilder {2 public static voidmain(String[] args) {3 //链式创建

4 StringBuilder sb = new StringBuilder("Hello").append("World").append("Java");5 //调用方法

6 String str =sb.toString();7 System.out.println(str); //HelloWorldJava

8 }9 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值