一、StringBuffer的特点:
1、线程安全的
不安全,就是存在同步操作同一数据的行为,效率高
安全的时候,没有同步操作,效率低。
在实际开发中,效率和安全这两个问题一直都是很难平衡的问题
生活中的例子:
线程安全的例子:银行的一些业务,电影院卖票,医院取号
线程不安全的例子:视频会员,博客评论
2、线程安全的,StringBuffer是一个可变序列
3、StringBuffer又称之为字符串缓冲区,就是把它当作一个字符串去操作,只不过它与String相比是可以修改内容的
4、在任何时间地点,它包含着一些特定的字符序列,但是可以通过某些方法修改这些字符序列的长度和内容
简单记忆:StringBuffer是一个线程安全的可变序列
面试题:StringBuffer和String的区别:
1、StringBuffer的长度和内容都是可以改变的,String却不行
2、String每创建一个新的字符串都会开辟一个新的常量池区域
StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新开辟空间
StringBuffer的构造方法:
public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符
public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区
public class StringBufferDemo1{
public static void main(String[] args){
//public StringBuffer()构造一个梦没有字符的字符串缓冲区,初始容量为16个字符
StringBuffer sb1 = new StringBuffer();
System.out.println("sb1:" + sb1);//StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量
System.out.println("当前StringBuffer的容量为:"+ sb1.capacity());
//public int length()返回长度(字符数)
System.out.println("StringBuffer中字符串的长度为:" + sb1.length());
Syatem.out.println("===========================================");
//public StringBuffer(int capacity)构造一个没有字符的字符串缓冲区和指定的初始容量
StringBuffer sb2 = new StrngBuffer(50);
System.out.println("sb2:" + sb2);//StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量
System.out.println("当前StringBuffer的容量为:" + sb2.capacity());
//public int length() 返回长度(字符数)
System.out.println("StringBuffrer中字符串的长度为:" + sb2.length());
System.out.println("===================================");
//public StringBuffer(String str)构造一个初始化为指定字符串内容的字符缓冲区
StringBuffer sb3 = new StringBuffer("hello");
System.out.println("sb3:"+ sb3);//StringBuffer重写了toString方法
//如何获取StringBuffer的容量
//public int capacity()返回当前容量
System.out.println("当前StringBuffer的容量为:" + sb3.capacity());//21 = 6 + 5
//public int length()返回长度(字符数)
System.out.println("StringBuffer中字符串的长度为:" + sb3.length());//5
}
}
------------------------------------------------------------------------------------------------------------------------
StringBuffer的添加功能:
public StringBuffer append(String str)
通过观察API发现,不光可以追加字符串,还可以是任意数据类型的追加到StringBuffer中
返回StringBuffer是什么呢?
public StringBuffer insert(int index,String str)
public class StringBufferDemo2{
public static void main(String[] args){
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer();
//public StringBuffer append(String str)
StringBuffer stringBuffer = sb.append("hello");
System.out.println(stringBuffer);
System.out.println(sb);
System.out.println(sb == stringBuffer);
// sb.append(10);
// sb.append('a');
// sb.append(true);
// sb.append(12.34);
// 无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串
// System.out.println(sb);
// System.out.println(stringBuffer);
// 链式编程
sb.append(10).append('a').append(true).append(12.34);
System.out.println(sb);
System.out.println("========================================");
//hello 10atrue12.34
//public StringBuffer insert(int offset,String str)
//将字符串插入到此字符序列中,返回的是字符串缓冲区本身
//String参数的String按顺序插入到指定偏移量的该序列中,向上移动原始位于该位置上的1任何字符
//并将该序列的长度增加到参数的长度
sb.insert(5,"hadoop");
System.out.println(sb);
//如果str是null,则四个字符"null"被插入到该序列中
// sb.insert(5,null);
Object o = null;
sb.insert(5,o);
System.out.println(sb);
}
}
---------------------------------------------------------------------------------------------------------
remove,move,delete,drop,turncate
StringBuffer的删除功能
public StringBuffer deleteCharAt(int index) 删除指定索引处的字符。该序列缩短了一个char
public StringBuffer delete(innt start,int end)
public class StringBUfferDemo3{
public static void main(String[] args){
//使用带参数的构造方法创建StringBuffer对象
StringBuffer sb = new StringBuffer("bigdata");
System.out.println("未做删除操作之前的StringBuffer:" + sb);
// StringBuffer sb2 = sb.deleteCharAt(3);//操作的是同一个StringBuffer对象
// System.out.println(sb);
// System.out.println(sb2);
// System.out.println(sb == sb2);
sb.deleteCharAt(3);
System.out.println("做删除操作后的StringBuffer:" +sb);
//如果index为负数或大于等于length()
//index的值最大可以取到实际存储字符的长度-1
// sb.deleteCharAt(30);
// sb.deleteCharAt(6);
System.out.println("============================================");
//public StringBuffer delete(int start,int end)
//删除此序列的子字符串中的字符
//字串开始于指定start并延伸到字符索引end-1,或如果没有这样的字符存在的序列的结束
//如果start <= index //bigdata // sb.delete(2,5); // sb.delete(2,6); // sb.delete(2,10); // 注意开始位置一定是已经存在的索引,否则报错 // sb.delete(8,10); System.out.println(sb); //需求:删除StringBuffer中的所有字符 sb.delete(0,sb.length()); System.out.println("删除StringBuffer中的所有字符:" + sb); } } --------------------------------------------------------------------------------------------------------------------- StringBuffer替换功能 public StringBuffer replace(int start,int end,String str) 用指定的String中的字符替换此序列的子字符串中的String 子串开始于指定start并延伸到字符索引end-1,或如果没有这样的字符序列存在的序列的结束 第一字串中的字符被去除,然后指定String被插入在start public class StringBufferDemo4{ public static void main(String[] args){ //创建一个String Buffer对象 StringBuffer sb = new StringBuffer(); //往StringBuffer中添加内容 sb.append("java").append("mysql").append("hadoop").append("hive").append("spark").append("flink"); System.out.println(sb); //public StringBuffer repalce(int start,int end,String str) sb.repalce(5,10,"数加学院真好"); System.out.println(sb); } } ------------------------------------------------------------------------------------------------------------------- StringBUffer的反转功能: public StringBuffer reverse() 导致该字符序列被序列的相反代替 如果序列中包含任何替代对,则将他们视为单个字符进行反向操作 public class StringBufferDemo5{ public static void main(String[] args){ StringBuffer sb = new StringBuffer(); sb.append("我爱你中国"); System.out.println("反转之前:" +sb); System.out.println("反转之后:" ); StringBuffer sb2 = sb.reverse();//操作的是同一个StringBuffer对象 System.out.println(sb); System.out.println(sb2); } } ------------------------------------------------------------------------------------------------------------------------ StringBuffer的截取功能: public String substring(int start) 返回一个新的String,其中包含此字符序列中当前包含的字符的子序列 public String substring(int start,int end) 返回一个新的String,其中包含此序列中当前包含的字符串的子序列。子串起始于指定的start,并扩展到索引号为end-1 public class StringBufferDemo6{ public static void main(String[] args){ StringBuffer sb = new StringBuffer(); sb.append("java") .append("mysql") .append("hiva") .append("ETL") .append("spark") System.out.println(sb); //public String substring(int start) //不会改变原来StringBuffer中的数据 //返回值是一个String类型的数据 String s1 = sb.substring(4); System.out.println("截取的内容是:" + s1); System.out.println("StringBuffer的内容为:" + sb); // public String substring(int start,int end)含头不含尾 [start,end) // javamysqlhiveETLspark String s2 = sb.substring(9,13); System.out.println("截取的内容是:" + s2); System.out.println("StringBuffer的内容为:" + sb); } } ----------------------------------------------------------------------------------------------------------------------- 为什么要进行相互转换? A-->B将A转换成B,是为了使用B中特有的功能 B-->A再将B转换成A,可能是引用最终的结果需要的是A类型的数据,所以还得转换回来 String与StringBuffer之间的转换 public class StringBufferDemo7{ public static void main(String[] args){ //String-->StringBuffer String s = "hello"; // StringBuffer sb = s; // java:不兼容的类型:java.lang.String无法转换为java.lang.StringBuffer // StringBuffer sb = "hello"; // 方式一:通过构造方法转换 StringBuffer sb1 = new StringBuffer(s); System.out.println(s); System.out.println(sb1); // 方式二:通过append() StringBuffer sb2 = new StringBuffer(); sb2.append(s); System.out.println(s); System.out.println(sb2); System.out.println("========================================"); // StringBuffer-->String StringBuffer sb3 = new StringBuffer("bigdata"); // 方法一:toString()方法 String s1 = sn3.toString(); System.out.println(sb3); System.out.println(s1); // 方式二:subString String s2 = sb3.substring(0); System.out.println(s2); System.out.println(sb3); // 方式三:String类的构造方法 //String(StringBuffer buffer) //分配一个新的字符串,其中包含当前包含在字符缓冲区参数中的字符序列 String s3 = new String(sb3); System.out.println(s3); System.out.println(sb3); } } ----------------------------------------------------------------------------------------------------------------------- 把数组拼接成一个字符串(用String Buffer实现) public class StringBufferTest1{ public static void main(String[] args){ char[] chars = {'a','b','c','d'}; //创建一个空的StringBuffer对象 StringBuffer sb = new StringBuffer(); //遍历数组得到每个字符 for(int i=0;i sb.append(char[i]); } //将字符缓冲区转换成一个字符串 String s = sb.toString(); System.out.println(s); } } ----------------------------------------------------------------------------------------------------------------------------- 面试题1:String,StringBuffer,StringBuilder之间的区别 a、StringBuffer是线程同步安全的,数据安全效率低 StringBuilder不是线程同步安全的,数据不安全,效率高 b、String的内容是不可改变的,String Buffer和StringBuilder是可变序列 c、StringBuffer中方法上有synchronized关键字 面试题2:String Buffer和数组的区别? 他们都是可以被看作是一个容器,装一些数据 但是,StringBuffer里面的数据都是一个一个字符 数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据 看程序写结果: 探究String作为参数传递与StringBuffert作为参数传递的区别 public class StringBufferDemo8{ public static void main(String[] args){ //创建一个StringBuffer的对象 // StringBuffer stringBuffer = new StringBuffer(); // 创建一个StringBuilder的对象 // StringBuilder stringBuilder = new StringBuilder(); String s1 = "hello"; String s2 = "world"; System.out.println("s1:" + s1 +",s2:" + s2); change(s1,s2); System.out.println("s1:"+ s1+ ",s2:" + s2); Ssytem.out.println("================================================="); StringBuffer sb1 = new StringBuffer("hello"); Stringbuffer sb2 = new StringBuffer("world"); Systm.out.println("sb1:" + sb1 +",sb2" + sb2 );//hello world change(sb1,sb2); System.out.println("sb1:" + sb1 + ",sb2" + sb2);//sb1:hello,sb2:worldworld //当多个StringBuffer作为参数传参的时候,谁发生了操作,谁就会受到影响 } public static void change(StringBuffer sb1 ,StringBuffer sb2){ sb1 = sb2; sb2.append(sb1); System.out.println("sb1:" + sb1 + ",sb2:" + sb2); //sb1:world world sb2:worldworld } public static void change(String s1, String s2){ s1 = s2; s2 = s1 +s2; System.out.println("s1:" + s1+ ",s2:" + s2 ); } } -------------------------------------------------------------------------------------------------------------- 二、Arrays针对于数组做操作的类,该类包含用于操作数组的各种方法(如排序和搜索) public static String toString(int[] a) public static void sort(int[] a) public static int binarySearch(int[] a,int key) import java.util.Arrays; public class ArraysDemo{ public static void main(String[] args){ //定义一个数组 int[] arr = {21,32,44,1,4,89,16}; //public static String toString(int[] a) //将数组转换成一个字符串 //System.out.println(arr); String s = Arrays.toString(arr); System.out.println(s); System.out.println("========================================"); //public static void sort(int[] a) Arrays.sort(arr); System.out.println("排序后的数组为:" + Arrays.toString(arr)); System.out.println("======================================"); //public static int binarySearch(int[] a,int key) //[1,4,16,21,32,44,89] //二分查找的前提是数组本身是排过序的 System.out.println("二分查找32:" + Arrays.binarySearch(arr,32)); System.out.println("二分查找32:" + Arrays.binarySearch(arr,100));//-8 } } ----------------------------------------------------------------------------------------------------------------- 三、Date:日期类 构造方法: Date() 分配一个Date对象,并初始化它,以便它代表它被分配的时间,测量到最近的毫秒 日期格式化:SimpleDateFormat import java.text.SimpleDateFormat; import java.util.Date; public class DateDemo{ public static void main(String[] args){ Date date = new Date(); System.out.println(date);//系统时间 //由于我们经常看到的时间不是这样的,应该是年,月,日,时分秒 //日期的格式化 //SimpleDateFormat(String pattern) //使用给定模式SimpleDateFormat并使用默认的FORMAT语言环境的默认日期格式符号 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd EEE a hh:mm:ss"); String s = simpleDateFormat.format(date); System.out.println(s); } } ---------------------------------------------------------------------------------------------------------------------- 四、Math:Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数 public static int abs(int a) public static double ceil(double a) public static double floor(double a) public static int max(int a,int b) //min public static double pow(double a,double b) public static double random() public static int round(float a)//参数为double public static double sqrt(double a) public class MathDemo{ public static void main(String[] args){ //public static int abs(int a) 绝对值 int num1 = Math.abs(-10); System.out.println(num1); //public static double ceil(double a) double num2 = Math.ceil(12.04); Systenm.out.println(num2); //floor double num3 = Math.floor(12.84); System.out.println(num3); //public static double sqrt(double a) //public static double sqrt(double a)返回double值正确舍入的正平方根 double num4 = Math.sqrt(3); System.out.println(num4); } } ------------------------------------------------------------------------------------------------------------------------------ 五、包装类: 1、需求1:有100这个数据,计算出他的二进制,八进制,十六进制 需求2:如何使用代码求出int类型数据范围 通过观察需求后发现,我们得出原本的基本数据类型无法调用任何方法和属性,怎么办呢? 为了对基本数据类型进行操作,更方便的操作,Java就针对每一个基本数据类型都提供了一个对应的类类型 我们称之为包装类类型 包装类类型: byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean public class PackageClassDemo1{ public static void main(String[] args){ //Integer:Integer类包装一个对象中的原始类型interesting的值 //public static String toBinaryString(int i)在基数2中返回整数参数的字符串表示形式为无符号整数 //求出int数据类型的二进制 String s = Integer.toBinaryString(100); System.out.println("100的二进制为:" + s); //static String toHexString(int i) // 返回整数参数的字符串表示形式,作为16位中的无符号整数 String s1 = Integer.toHexString(100); System.out.println("100的十六进制为:" + s1); //static String toOctalString(int i) //在基数8中返回整数参数的字符串表示形式为无符号整数 String s2 = Integer.toOctalString(100); System.out.println("100的八进制为:" + s2); //如何用代码求出int类型数据范围 //ststic int MAX_VALUE //一个持有最大值的一个int可以有2^31-1 int maxValue = Integer.MAX_VALUE; System.out.println("int类型数据的最大值为:" + maxValue); System.out.println("int类型数据的最小值为:" + minValue); } } 二、包装类一般是用于基本数据类型与字符串之间的转换 int类型的数据与String类型做互相转换 int-----String static String valueOf(int i)返回int参数的字符串int形式 String----Integer----int public static int parseInt(String s)将字符串参数解析为带符号的十进制整数 public class PackageClassDemo2{ public static void main(String[] args){ //int--String int num == 100; //方式一:static String valueOf(int i)返回intt参数的字符串int形式 String s = String.valueOf(num);//100--->"100" System.out.println(s); System.out.println("========================================="); //方式二:int--Integer--String // String string = new String(num); // Integer(int value)构造一个新分配的Integer对象,该对象表示指定的int值 Integer integer = new Integer(num); System.out.println(s1); 方式三:字符串拼接 String s2 = " " +num; System.out.println(s2); 方式四:public static String toString(int i) String s3 = Integer.toString(100); System.out.println("======================================"); //String ---->int String s4 = "200"; // 方式1:String -- Integer--int // Integer(String s) //构造一个新分配Integer对象,表示int由指示值String参数 Integer integer1 = new Integer(s4); System.out.println(integer1); //public int inValue()将Integer的值作为int int number = integer1.inValue(); System.out.println(number); int i = integer1;//在包装类中称之为自动拆箱 integer i2 =300;//在包装类中称之为自动装箱 } } ----------------------------------------------------------------------------------------------------------------------- 三、Java中专门生成随机数的类:Random public Random() public Random(long seed) import java.util.Random; public class RandomDemo{ public static void main(String[] args){ //public Random(); Random random = new Random(); // int i = random.nextInt(); // System.out.println(i); int i = random.nextInt(10) + 1;//0 - 9 System.out.println(i); //public Random(long seed); // Random random1 = new Random(10000000000000L); } }



