一、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<end
//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<char.length;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语言环境的默认日期格式符号
/*
yyy:年
MM:月
dd:日
HH:24小时制度
hh:12小时制度
mm:表示分钟
ss:表示秒
*/
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);
}
}