java可变字符数组_Java中的可变字符串

可变字符串

StringBuffer和StringBuilder类

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,多线程的情况下,则必须使用 StringBuffer 类【StringBuilder 和 StringBuffer 用法基本一致】。

总结:

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

说简单点就是可灵活操作的字符串

StringBuffer和String的区别

String只能赋值一次,每次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变。每次改变String的字符串内容,都会在内存创建新的对象,而每一次生成新的对象都会对系统性能产生影响,这会降低Java虚拟机的工作效率。

改变变量前:

String str = "abc";

|堆:new String()| → |栈:abc|

修改变量后

String str = "abc";

String str = "abcde";

|堆:new String()| → |栈:abc|

|堆:new String()| → |栈:abcde|

只有整个函数运行完内存才会被释放(栈中的值会清除)

而StringBuffer不同,每次都是操作自身对象,而不是生成新的对象,其所占的空间会随着内容的增加而扩充,做大量的修改时,不会因产生大量匿名对象(new Xxx())而影响系统性能。

改变变量前:

StringBuffer str = new StringBuffer("abc");

|堆:new StringBuffer()| → |栈:abc|

修改变量后

StringBuffer str = new StringBuffer("abc");

str.append("de"); //向str中添加元素

|堆:new StringBuffer()| → |栈:abcde|

StringBuffer和StringBuilder使用

StringBuilder和 StringBuffer用法基本一致

使用append在末尾追加元素

sbf.append(str);

示例代码:

public class test {

public static void main(String[] args) {

StringBuffer sBuffer = new StringBuffer("这里面可添加值:"); // 创建sBuffer的对象

sBuffer.append("one,");

sBuffer.append("two,");

sBuffer.append("three");

// 链式编程(也可以下面这样写)

// sBuffer.append("one,").append("two,").append("three");

System.out.println("第一次输出:" + sBuffer);

StringBuffer bf = new StringBuffer(",这是新的StringBuffer");

sBuffer.append(bf);

System.out.println("第二次输出:" + sBuffer);

}

}

eclipse执行结果:

第一次输出:这里面可添加值:one,two,three

第二次输出:这里面可添加值:one,two,three,这是新的StringBuffer

使用setCharAt修改指定索引值

sbf.setCharAt(index, str);

示例代码:

public class test {

/**

* 将StringBuffer中后3位替换为x

* */

public static void main(String[] args) {

StringBuffer sbf = new StringBuffer("18312345678");

for (int i=8;i

sbf.setCharAt(i, 'x');

}

System.out.println(sbf);

}

}

eclipse执行结果:

18312345xxx

使用insert向指定索引插入值

sbf.insert(index,str)

示例代码:

public class test {

/**

* 在StringBuffer中索引为8的后面插入值

* */

public static void main(String[] args) {

StringBuffer sbf = new StringBuffer("18312345678");

sbf.insert(8, "我要插队");

System.out.println(sbf);

}

}

eclipse执行结果:

18312345我要插队678

使用delete删除指定索引值

sbf.delete(start,end)

示例代码:

public class test {

/**

* 将StringBuffer中索引0-5的元素删除

* */

public static void main(String[] args) {

StringBuffer sbf = new StringBuffer("12345上山打老虎");

sbf.delete(0, 5); //0-5但不包含下标为5的元素

System.out.println(sbf);

}

}

eclipse执行结果:

上山打老虎

使用reverse翻转字符串

public class Demo {

public static void main(String[] args) {

StringBuffer sBuffer = new StringBuffer("abcd");

sBuffer.reverse();

System.out.println("字符串翻转后的值:" + sBuffer);

}

}

eclipse执行结果:

字符串翻转后的值:dcba

StringBuilder和String相互转换

/*

* StringBuilder和String的相互转换

*

* StringBuilder -- String

* public String toString():通过toString()就可以实现把StringBuilder转成String

*

* String -- StringBuilder

* StringBuilder(String str):通过构造方法就可以实现把String转成StringBuilder

*/

public class StringBuilderTest {

public static void main(String[] args) {

//StringBuilder --> String

StringBuilder sb = new StringBuilder();

sb.append("hello").append("world");

String s = sb.toString();

System.out.println(s);

//String --> StringBuilder

String s = "helloworld";

StringBuilder sb = new StringBuilder(s);

System.out.println(sb);

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值