stringBuffer详解
Posted ElloeStudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stringBuffer详解相关的知识,希望对你有一定的参考价值。
stringBuffer与string
stringBuffer简介 :StringBuffer是一个字符的缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffe。
工作原理:
StringBuffer的底层是一个char类型的数组,如果没有明确设定,则系统会自动创建一个长度为16的char类型数组,在使用数组的时候,如果长度不够了,则会通过拷贝对数组进行扩容,所以使用StringBuffe时最好预测并且手动进行初始化长度,这样能够减少数组的拷贝,从而提高效率。
StringBuffer与String的区别:
- string是不可变字符序列,储存在字符串常量池中
- stringBuffer的底层是char类型数组,系统会对该数组进行扩充
- StringBuffer: 线程安全的可变字符串
- 我们如果对字符串进行拼接操作,每次拼接都会构成一个新的String对象,既耗时,又浪费空间
- 前者长度和内容可变,后者不可变
StringBuffer 的构造方法:
- 如果没有明确指出参数长度的话,系统会自动给一个16的长度参数。,如下创建:
StringBuffer sb=new StringBuffer();
- 如果明确指定容量的字符串缓冲区对象,则长度为指定的大小。如下创建:
StringBuffer sb1 = new StringBuffer(50);
- 指定字符串内容的字符串作为缓冲区对象,则长度大小为:StringBuffer的长度就是这个String类型的字符串长度+16
StringBuffer sb2 = new StringBuffer("hello"); // StringBuffer的长度为21
- 给出具体代码测试:
StringBuffer sb = new StringBuffer();
System.out.println("sb-->" + sb);
System.out.println("sb-->" + sb.capacity());
System.out.println("sb--" + sb.length());
System.out.println("=============================");
StringBuffer sb1 = new StringBuffer(50);
System.out.println(sb1);
System.out.println(sb1.capacity());
System.out.println(sb1.length());
System.out.println("=======================");
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb2);
System.out.println(sb2.capacity());
System.out.println(sb2.length());
sb--> // 没有指定对象,则创建的对象为空
sb-->16 // 容量
sb--0 // 实际的stringbuffer的长度length
=============================
// 没有指定对象,则创建的对象为空
50 // 容量
0 // 实际的stringbuffer的长度length
=======================
hello
21
5
- StringBuffer与String的相互转换:
// string ----> stringbuffer
String s = "123";
StringBuffer sb = new StringBuffer(s);
System.out.println("StringBuffer "+sb);
// stringbufffer ---- string
StringBuffer sb1 = new StringBuffer("hello");
String ss = sb1.toString();
System.out.println("string "+ss);
需要注意的是,StringBuffer和String属于不同的类型(stringbuffer是一个单独的类型),也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
stringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别
-
Capacity() 返回当前容量 理论值
-
length() 返回长度(字符数) 实际值
-
append方法
- 该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。该方法以后,StringBuffer对象的内容也发生改变。
- 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
-
insert方法
- 该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。
- insert(int offset,String str),在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
-
deleteCharAt(int index)方法
- 删除指定位置字符,并返回本身stringbuffer对象
-
delete(int start,int end)方法
- 删除从指定位置开始,并从指定位置结束字符,并返回本身
- 注意:包左不包右
-
substring(int start)方法
- StringBuffer的截取功能:注意返回值类型不是StringBuffer,返回值为string类型
- substring(int start,int end)
-
replace (int start,int end,String str) 方法
- StringBuffer的替换功能:从start到end用 str 替换
-
reverse()方法
- StringBuffer的反转功能:注意返回值类型仍是StringBuffer,可以通过toString()方法转换为string类型
-
codePointBefore(int index)方法
- 返回字符串中指定索引之前的字符的Unicode值。第一个字符的索引为1,第二个字符的索引为2
- index 值0将产生错误,因为这是一个负数(超出范围) index从1开始
-
setCharAt()方法
- 该方法的作用是修改对象中索引值为index位置的字符为新的字符ch
-
trimToSize()方法
- 该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
-
....等等方法 ,大家可以自行测试
-
测试代码
StringBuffer sb1 = new StringBuffer();
sb1.append("hello");
sb1.append(1);
sb1.append(1.2);
sb1.append(true);
System.out.println("---->>>>>>>");
System.out.println(sb1);
System.out.println("sb1 capacity " + sb1.capacity());
System.out.println("sb1 len " + sb1.length());
System.out.println("------------------");
sb1.append("hello").append(1).append(1.2).append(true);
System.out.println(sb1);
System.out.println("sb1 capacity " + sb1.capacity());
System.out.println("sb1 len " + sb1.length());
System.out.println("----------");
sb1.insert(5, 2222);
sb1.insert(0, 11111);
System.out.println(sb1);
System.out.println("sb1 capacity " + sb1.capacity());
System.out.println("sb1 len " + sb1.length());
---->>>>>>>
hello11.2true
sb1 capacity 16
sb1 len 13
------------------
hello11.2truehello11.2true
sb1 capacity 34
sb1 len 26
----------
11111hello222211.2truehello11.2true
sb1 capacity 70
sb1 len 35
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("is").append("big");
System.out.println(sb);
sb.delete(0, 5);
System.out.println(sb);
sb.deleteCharAt(0);
System.out.println(sb);
sb.delete(0, sb.length());
System.out.println("sb " + sb);
helloworldisbig
worldisbig
orldisbig
sb
StringBuffer sb = new StringBuffer();
sb.append("hello").append("wolrd").append("java");
System.out.println(sb);
String s = sb.substring(5);
System.out.println(s);
String ss = sb.substring(5, 10);
System.out.println(ss);
System.out.println("====================");
StringBuffer sb1 = new StringBuffer();
sb1.append("this is good"); // 空格也算一个大小
System.out.println(sb1);
System.out.println(sb1.capacity());
System.out.println(sb1.length());
hellowolrdjava
wolrdjava
wolrd
====================
this is good
16
12
StringBuffer sb = new StringBuffer();
sb.append("this is good");
sb.replace(0, 4, "after");
System.out.println(sb);
after is good
StringBuffer sb = new StringBuffer();
sb.append("this is a good");
// sb.reverse(); // 结果还是一个stringbuffer类型,结果在内存里
String ss = sb.reverse().toString(); // 将反转的结果,转变为一个string类型输出
// System.out.println(sb);
System.out.println(ss);
doog a si siht
StringBuffer sb = new StringBuffer();
sb.append("this is a good");
System.out.println(sb);
System.out.println(sb.capacity());
System.out.println(sb.length());
sb.append(" yes");
System.out.println(sb);
System.out.println(sb.capacity());
System.out.println(sb.length());
StringBuffer sb1 = new StringBuffer(50);
System.out.println(sb1);
System.out.println(sb1.capacity());
System.out.println(sb1.length());
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb2);
System.out.println(sb2.capacity());
System.out.println(sb2.length());
this is a good
16
14
this is a good yes
34
18
50
0
hello
21
5
// string ----> stringbuffer
String s = "123";
StringBuffer sb = new StringBuffer(s);
System.out.println("StringBuffer "+sb);
// stringbufffer ---- string
StringBuffer sb1 = new StringBuffer("hello");
String ss = sb1.toString();
System.out.println("string "+ss);
StringBuffer 123
string hello
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(s);
// 预判断 用户是否还有下一个输入
if (scanner.hasNext()) {
// 如果有下一个输入,将这个结果赋值给ss
String ss = scanner.next();
System.out.println(ss);
}
StringBuffer sb = new StringBuffer();
sb.append("this is good");
System.out.println(sb);
sb.insert(0, 1111);
System.out.println(sb);
sb.replace(0, 4, "2222");
System.out.println(sb);
sb.replace(0, 4, "333");
System.out.println(sb);
sb.delete(0, 4);
System.out.println(sb);
sb.deleteCharAt(4);
System.out.println(sb);
String ss = sb.substring(4);
System.out.println(sb); // 截取对原的stringbuffer,没影响,相当于拷贝,截取
System.out.println(ss);
StringBuffer sss = sb.reverse();
String ssss = sb.reverse().toString();
sb.setCharAt(0, \'t\');
System.out.println(sb);
System.out.println(sb.capacity());
System.out.println(sb.length());
sb.trimToSize();
System.out.println(sb);
System.out.println(sb.capacity());
System.out.println(sb.length());
// codePointBefore()方法返回字符串中指定索引之前的字符的Unicode值。第一个字符的索引为1,第二个字符的索引为2
// 值0将产生错误,因为这是一个负数(超出范围) index从1开始
int code = sb.codePointBefore(1);
System.out.println(code);
System.out.println(sb);
// x 不能直接.toString() ; 要把一个整数变为字符串 ,需要包装类integer.toString(x)
// 其他基本类型变为字符串也是用到包装类
int x= 10;
Integer.toString(x);
this is good
1111this is good
2222this is good
333this is good
his is good
his s good
his s good
s good
tis s good
16
10
tis s good
10
10
116
tis s good
小结
-
相信看到这个的小伙伴,已经弄明白了stringBuffer的使用方法
学而不敲则罔,思而不敲则殆
本文来自博客园,作者:ElloeStudy,转载请注明原文链接:https://www.cnblogs.com/ElloeStudy/p/15535161.html
2016.3.12 JAVA中StringBuffer类常用方法详解(转)
String是不变类,用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此java提供了一个StringBuffer类,这个类在修改字符串方面的效率比String高了很多。
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
1 public class UsingStringBuffer { 2 /** 3 * 查找匹配字符串 4 */ 5 public static void testFindStr() { 6 StringBuffer sb = new StringBuffer(); 7 sb.append("This is a StringBuffer"); 8 // 返回子字符串在字符串中最先出现的位置,如果不存在,返回负数 9 System.out.println("sb.indexOf(\"is\")=" + sb.indexOf("is")); 10 // 给indexOf方法设置参数,指定匹配的起始位置 11 System.out.println("sb.indexOf(\"is\")=" + sb.indexOf("is", 3)); 12 // 返回子字符串在字符串中最后出现的位置,如果不存在,返回负数 13 System.out.println("sb.lastIndexOf(\"is\") = " + sb.lastIndexOf("is")); 14 // 给lastIndexOf方法设置参数,指定匹配的结束位置 15 System.out.println("sb.lastIndexOf(\"is\", 1) = " 16 + sb.lastIndexOf("is", 1)); 17 } 18 19 /** 20 * 截取字符串 21 */ 22 public static void testSubStr() { 23 StringBuffer sb = new StringBuffer(); 24 sb.append("This is a StringBuffer"); 25 // 默认的终止位置为字符串的末尾 26 System.out.print("sb.substring(4)=" + sb.substring(4)); 27 // substring方法截取字符串,可以指定截取的起始位置和终止位置 28 System.out.print("sb.substring(4,9)=" + sb.substring(4, 9)); 29 } 30 31 /** 32 * 获取字符串中某个位置的字符 33 */ 34 public static void testCharAtStr() { 35 StringBuffer sb = new StringBuffer("This is a StringBuffer"); 36 System.out.println(sb.charAt(sb.length() - 1)); 37 } 38 39 /** 40 * 添加各种类型的数据到字符串的尾部 41 */ 42 public static void testAppend() { 43 StringBuffer sb = new StringBuffer("This is a StringBuffer!"); 44 sb.append(1.23f); 45 System.out.println(sb.toString()); 46 } 47 48 /** 49 * 删除字符串中的数据 50 */ 51 public static void testDelete() { 52 StringBuffer sb = new StringBuffer("This is a StringBuffer!"); 53 sb.delete(0, 5); 54 sb.deleteCharAt(sb.length() - 1); 55 System.out.println(sb.toString()); 56 } 57 58 /** 59 * 向字符串中插入各种类型的数据 60 */ 61 public static void testInsert() { 62 StringBuffer sb = new StringBuffer("This is a StringBuffer!"); 63 // 能够在指定位置插入字符、字符数组、字符串以及各种数字和布尔值 64 sb.insert(2, ‘W‘); 65 sb.insert(3, new char[] { ‘A‘, ‘B‘, ‘C‘ }); 66 sb.insert(8, "abc"); 67 sb.insert(2, 3); 68 sb.insert(3, 2.3f); 69 sb.insert(6, 3.75d); 70 sb.insert(5, 9843L); 71 sb.insert(2, true); 72 System.out.println("testInsert: " + sb.toString()); 73 } 74 75 /** 76 * 替换字符串中的某些字符 77 */ 78 public static void testReplace() { 79 StringBuffer sb = new StringBuffer("This is a StringBuffer!"); 80 // 将字符串中某段字符替换成另一个字符串 81 sb.replace(10, sb.length(), "Integer"); 82 System.out.println("testReplace: " + sb.toString()); 83 } 84 85 /** 86 * 将字符串倒序 87 */ 88 public static void reverseStr() { 89 StringBuffer sb = new StringBuffer("This is a StringBuffer!"); 90 System.out.println(sb.reverse()); // reverse方法将字符串倒序 91 } 92 }
小结:
StringBuffer不是不变类,在修改字符串内容时,不会创建新的对象,因此,它比String类更适合修改字符串。
StringBuffer类没有提供同String一样的toCharArray方法
StringBuffer类的replace方法同String类的replace方法不同,它的replace方法有三个参数,第一个参数指定被替换子串的起始位置,第二个参数指定被替换子串的终止位置,第三个参数指定新子串
以上是关于stringBuffer详解的主要内容,如果未能解决你的问题,请参考以下文章
扯皮系列一篇与众不同的 StringStringBuilder 和 StringBuffer 详解