StingUtil
package StringDemo;
public class StringBufferDemo {
/*
* StringBuffer字符串缓冲区
* 缓冲区:容器,对数据进行临时存储
* 缓冲区容器还是数组,只不过封装了数组,对外提供方法,长度为16的数组
* StringBuffer字符串缓冲区
* 用于存储数据的容器
* 数组也是容器,也能存东西,有固定长度,定义够只能存同一类型数据,数组不会转换成数据
* StringBuffer特点:
* 可变长度
* 存储不同类型数据
* 最终转成字符串进行使用
* 可以对字符串进行修改(字符串本身不能修改,通过缓冲区可以修改)
*
* 既然是容器,具有容器对象,应该具备什么功能?
* 容器自己知道添加什么东西,基本功能如下
* 1、添加
* append(data),返回本类对象
* insert(index,data)
* 2、删除
* delete(start,end) 包含头不包含尾
* deleteCharAt(int index)删除指定位置的元素
* 3、查找
* char charAt(index)
* int indexOf(String)
* int lastIndexOf(String)
* 4、修改
* StringBuffer replace(start, end, str)
* void setCharAt(index, ch)
*增删改查c(create)u(update)r(read)d(delete)
*/
public static void main(String[] args) {
bufferMethodDemo4();
}
/**
* 其他功能
*/
public static void bufferMethodDemo4() {
StringBuffer sb = new StringBuffer("abcd");
System.out.println("sb:"+sb.toString());
System.out.println("sb:"+sb.reverse());
System.out.println("len:"+sb.length());
sb.setLength(0);//清空缓存一个意思 设置缓冲区长度,设置多了就空字符串代替
System.out.println("sb:"+sb.toString());
System.out.println("len:"+sb.length());
sb.setLength(10);//清空缓存一个意思
System.out.println("sb:"+sb.toString());
System.out.println("len:"+sb.length());
/*
* 初始容量为16个字符的数组,如果装到17个字符怎么办,但是数组必须固定长度
* 如果超过了,复制一个数组,即创建一个数组,把原来数组的元素复制到新的数组,怎么复制,遍历一遍即可
* 新的元素放在复制的一个数组
*
* 为什么一构造就是16个字符串?
* 如果能确定数据量在40以内,那么直接产生长度为40的数组就可以,刚刚减少新数组和动作的速度,提高效率
* 如果用默认处理40数组,一旦超过40,开辟空间,进行运算,效率低
* * */
}
/**
* 修改
*/
public static void bufferMethodDemo3() {
StringBuffer sb = new StringBuffer("abcd");
//替换多个位置
sb.replace(1, 3, "NBA");
System.out.println(sb.toString());
//替换一个位置
sb.setCharAt(1, 's');
System.out.println(sb.toString());
}
/**
* 删除
*/
public static void bufferMethodDemo2() {
StringBuffer sb = new StringBuffer("abcd");
// sb.delete(1, 3);//ad
//清空缓冲区
sb.delete(0, sb.length());//缓冲区不在,清空,内容清空了,盆还在,推荐使用
// sb = new StringBuffer();//买了个新盆,没内存。不推荐
System.out.println(sb.toString());
}
public static void bufferMethodDemo1() {
StringBuffer sb = new StringBuffer("abcd");
// sb.append("xixi");
sb.insert(2, "qq");
}
/*
* 缓冲区方法演示
*/
public static void bufferMethodDemo() {
//创建缓冲区对象
StringBuffer sb = new StringBuffer();
//
StringBuffer s1 = sb.append(4);
//两个缓冲区有什么关系,缓冲区变成字符串了
System.out.println(sb.toString());
System.out.println(s1.toString());
//放进去前后都是容器,不论放什么东西都是容器
System.out.println(sb==s1);
sb.append(4);
sb.append(true);
sb.append("haha").append("ss");//方法调用链
System.out.println(sb.toString());
//存数据,存储后整合,想用,要变成字符串才能使用,存储数据,最后是整个一个字符串
//都是尾部中间,如果要把数据放中间怎么办 嘻嘻放hah和ss中间,在制定位置插入任意数据
sb.insert(10, "嘻嘻");
System.out.println(sb.toString());
}
}
package StringDemo;
public class StringBuilderDemo {
/**
* 兼容
* 一回事,你用哪个都行,功能一模一样,用法一模一样
* 但是他俩严重区别
* StringBuffer 1.0
* StringBuilder 1.5
* 为什么搞个一模一样的?
* StringBuilder 不保证同步
* StringBuffer 线程安全(咋安全?)
*jdk1.5以后出现了功能和StringBuffer一模一样的对象,就是StringBuilder
*不同的是:
* StringBuilder线程不同步的(不需要判断锁,所以速度快) 通常用于单线程,他的出现提高效率
* StringBuffer线程同步的 通常用于多线程
*
*jdk升级:
* 1、简化书写 通常局限性
* 2、提高效率 有弊端
* 3、增加安全性 书写的麻烦 可能侧重安全,书写不麻烦
*
*如何使用?
* 数据一多就要存起来,并且是以字符串使用,就使用StringBuffer StringBuilder
*
*
*/
public static void main(String[] args) {
int [] arr = {1,3,4,5};
System.out.println(arrayToString1(arr));
}
public static String arrayToString1(int arr[]) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
if (i!=arr.length-1) {
sb.append(arr[i]+",");
}else{
sb.append(arr[i]+"]");
}
}
return sb.toString();
}
/**
* 将一个int数组变成一个字符串8
*/
public static String arrayToString(int arr[]) {
String str = "";
for (int i = 0; i < arr.length; i++) {
if (i!=arr.length-1) {
str += arr[i]+",";
}else{
str += arr[i]+"]";
}
}
return str;
}
}
/**
* StringBuffer 万一被多线程锁操作不安全怎么办?同步
* 怎么同步?
* class StringBuffer{
* //同步什么最重要
* public synchronized StringBuffer append(int x){}
* public synchronized StringBuffer delete(int start,int end){}
* //创建一个StringBuffer对象,一个在里面添加,一个在里面删除,就会出现安全隐患
* //删除的时候不能添加,添加的时候不能删除,添加和删除要进行同步,用同一锁,但是通常用同步代码块解决
* object lock
* public StringBuffer append(int x){
* synchronized(lock){}
* }
* public StringBuffer delete(int start,int end){
* synchronized(lock){}
* }
* }
* 调用一次,添加一次,判断锁,慢,更多考虑的是安全,单线程的话,废了
* StringBuilder提高了缓冲区效率,但是不安全,单线程可以使用
*/