线程
不安全,就是存在同步操作同一数据的行为,效率高。
安全的时候,没有同步操作,效率低。
StringBuffer
StringBuffer的特点:StringBuffer是一个线程安全的可变序列。
StringBuffer与String区别:
1、StringBuffer的长度和内容都可以发生改变,String却不行
2、String每创建一个新的字符串都会开辟一个新的常量池区域
StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新弄开辟空间
StringBuffer的构造方法:
public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
package com.shujia.wyh.day15;
public class StringBufferDemo1 {
public static void main(String[] args) {
//public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer sb1 = new StringBuffer();
System.out.println("sb1:" + sb1);
//如何获取StringBuffer的容量
//public int capacity()返回当前容量。
System.out.println("当前StringBuffer的容量为:" + sb1.capacity());
//public int length()返回长度(字符数)。
System.out.println("StringBuffer中字符串的长度为:" + sb1.length());
System.out.println("===================================================");
//public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer sb2 = new StringBuffer(50);
System.out.println("sb2:" + sb2);
System.out.println("当前StringBuffer的容量为:" + sb2.capacity());
System.out.println("StringBuffer中字符串的长度为:" + sb2.length());
System.out.println("===================================================");
//public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb3 = new StringBuffer("hello");
System.out.println("sb3:" + sb3);
System.out.println("当前StringBuffer的容量为:" + sb3.capacity()); // 21 = 16 + 5
System.out.println("StringBuffer中字符串的长度为:" + sb3.length()); // 5
}
}
StringBuffer的添加功能 apppend方法可以是任意数据类型的追加到StringBuffer中,无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串
public StringBuffer append(String str) 追加一个字符串
public StringBuffer insert(int index,String str) 将字符串插入到此字符序列中。返回的是字符串缓冲区本身
package com.shujia.wyh.day15;
public class StringBufferDemo2 {
public static void main(String[] args) {
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer();
//public StringBuffer append(String str)
StringBuffer stringBuffer = sb.append("hello");
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("===============================================");
//public StringBuffer insert(int offset,String str)
// 将字符串插入到此字符序列中。返回的是字符串缓冲区本身
sb.insert(5, "hadoop");
System.out.println(sb);
// 如果str是null ,则四个字符"null"被插入到该序列中。
Object o = null;
sb.insert(5, o);
System.out.println(sb);
}
}
StringBuffer的删除功能
public StringBuffer deleteCharAt(int index) 删除指定索引处的字符。该序列缩短了一个char
public StringBuffer delete(int start,int end) 删除此序列的子字符串中的字符。子串开始于指定start并延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束(注意开始位置一定是已经存在的索引,否则报错。如果start等于end ,则不作任何更改)
package com.shujia.wyh.day15;
public class StringBufferDemo3 {
public static void main(String[] args) {
//使用带参数的构造方法创建StringBuffer对象
StringBuffer sb = new StringBuffer("bigdata");
System.out.println("未做删除操作之前的StringBuffer:" + sb);
//public StringBuffer deleteCharAt(int index)
sb.deleteCharAt(3);
System.out.println("做删除操作之后的StringBuffer:" + sb);
//如果 index为负数或大于或等于length() 。
//index的值最大可以取到实际存储字符串的长度-1
System.out.println("===============================================");
//public StringBuffer delete(int start,int end)
//删除此序列的子字符串中的字符。
// 子串开始于指定start并延伸到字符索引end - 1 ,或如果没有这样的字符存在的序列的结束。
// 如果start等于end ,则不作任何更改。
// start<=index<end
sb.delete(2,5);//bigta
sb.delete(2,6);//bita
sb.delete(2,10);//bi
//注意开始位置一定是已经存在的索引,否则报错
// 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 ,或如果没有这样的字符存在的序列的结束。
package com.shujia.wyh.day15;
public class StringBufferDemo4 {
public static void main(String[] args) {
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer();
//往StringBuffer中添加一些内容
sb.append("java").append("mysql").append("hadoop").append("hive").append("spark").append("flink");
System.out.println(sb);
//public StringBuffer replace(int start,int end,String str)
sb.replace(5,10,"真好");
System.out.println(sb);
}
}
StringBuffer的反转功能
public StringBuffer reverse()
导致该字符序列被序列的相反代替。
package com.shujia.wyh.day15;
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的截取功能 (返回值类型是String类型,本身没有发生改变)
public String substring(int start)
返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。
public String substring(int start,int end)
返回一个新的String ,其中包含此序列中当前包含的字符的子序列。 子串起始于指定的start ,并扩展到索引号为end - 1 。
package com.shujia.wyh.day15;
public class StringBufferDemo6 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("java")
.append("mysql")
.append("hive")
.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)
String s2 = sb.substring(9, 13);
System.out.println("截取的内容是:"+s2);
System.out.println("StringBuffer的内容为:"+sb);
}
}
String与StringBuffer之间的转换
package com.shujia.wyh.day15;
public class StringBufferDemo7 {
public static void main(String[] args) {
//String --> StringBuffer
String s = "hello";
//方式1:通过构造方法转换
StringBuffer sb1 = new StringBuffer(s);
System.out.println(s);
System.out.println(sb1);
//方式2:通过append()
StringBuffer sb2 = new StringBuffer();
sb2.append(s);//无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串
System.out.println(s);
System.out.println(sb2);
System.out.println("==============================================");
//StringBuffer --> String
StringBuffer sb3 = new StringBuffer("bigdata");
//方式1:toString()方法
String s1 = sb3.toString();
System.out.println(sb3);
System.out.println(s1);
//方式2:subString
String s2 = sb3.substring(0);//返回值类型是String类型
System.out.println(s2);
System.out.println(sb3);
//方式3:String类的构造方法
//String(StringBuffer buffer)
String s3 = new String(sb3);
System.out.println(s3);
System.out.println(sb3);
}
}
例1:String,StringBuffer,StringBuilder之间的区别
1、StringBuffer是线程同步安全的,数据安全,效率低。
StringBuilder不是线程同步安全的,数据不安全,效率高。
2、String的内容是不可改变的,StringBuffer和StringBuilder是可变序列。
3、StringBuffer中方法上有synchronized关键字。
2:StringBuffer和数组的区别?
它们都可以被看作是一个容器,装一些数据。
但是,StringBuffer里面的数据都是一个一个字符
数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据。
String作为参数传递与StringBuffer作为参数传递的区别
package com.shujia.wyh.day15;
public class StringBufferDemo8 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println("s1: " + s1 + ",s2: " + s2); // hello world
change(s1, s2);//变量相加重新开辟地址不影响之前的值
System.out.println("s1: " + s1 + ",s2: " + s2); // hello world
System.out.println("========================================");
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // hello world
change(sb1, sb2);//sb1的值在方法中没改变
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: worldworld,sb2: worldworld
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
System.out.println("s1: " + s1 + ",s2: " + s2);
//sb1: world,sb2: worldworld
}
}
Arrays
Arrays类概述 1、针对数组进行操作的工具类。 2、提供了排序,查找等功能。
Arrays的构造方法:
public static String toString(int[] a) 将数组转换成一个字符串
public static void sort(int[] a) 自然排序
public static int binarySearch(int[] a,int key) 二分查找(当key超过a[high-1],输出-(high+ 1))
package com.shujia.wyh.day15;
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)
//将数组转换成一个字符串
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)
//二分查找的前提是数组本身是排过序的
System.out.println("二分查找32:" + Arrays.binarySearch(arr, 32));
//-(high+1)
System.out.println("二分查找32:" + Arrays.binarySearch(arr, 100)); // -8
}
}
包装类:
包装类类型:
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
需求1:有100这个数据,计算处它的二进制,八进制,十六进制
需求2:如何使用代码求出int类型数据范围
package com.shujia.wyh.day15;
import javax.swing.*;
public class PackageClassDemo1 {
public static void main(String[] args) {
//Integer: Integer类包装一个对象中的原始类型int的值。
//public static String toBinaryString(int i)
//返回二进制数
String s = Integer.toBinaryString(100);
System.out.println("100的二进制为:" + s);
//static String toHexString(int i)
//返回十六进制数
String s1 = Integer.toHexString(100);
System.out.println("100的十六进制为:" + s1);
//static String toOctalString(int i)
//返回八进制数
String s2 = Integer.toOctalString(100);
System.out.println("100的八进制为:" + s2);
//如何使用代码求出int类型数据范围
//static int MAX_VALUE
//最大值
int maxValue = Integer.MAX_VALUE;
//static int MIN_VALUE
//最小值
int minValue = Integer.MIN_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)将字符串参数解析为带符号的十进制整数。
package com.shujia.wyh.day15;
public class PackageClassDemo2 {
public static void main(String[] args) {
//int -- String
int num = 100;
//方式1:static String valueOf(int i) 返回 int参数的字符串 int形式。
String s = String.valueOf(num); // 100 -->"100"
System.out.println(s);
//方式2:int -- Integer -- String
//Integer(int value) 构造一个新分配的 Integer对象,该对象表示指定的 int值。
Integer integer = new Integer(num);
String s1 = integer.toString();
System.out.println(s1);
//方式3:字符串拼接
String s2 = ""+num;
System.out.println(s2);
//方式4:public static String toString(int i)
String s3 = Integer.toString(100);
System.out.println(s3);
System.out.println("==========================");
//String-->int
String s4 = "200";
//String--Integer--int
//方式1:Integer(String s)
//构造一个新分配 Integer对象,表示 int由指示值 String参数。
Integer integer1 = new Integer(s4);
//public int intValue()将 Integer的值作为 int 。
int number = integer1.intValue();
System.out.println(number);
//方式2:public static int parseInt(String s)将字符串参数解析为带符号的十进制整数
int number2 = Integer.parseInt(s4);
System.out.println(number2);
}
}
装箱&拆箱
Integer x = new Integer(4);可以直接写成 Integer x = 4;//自动装箱。 int x = x;//自动拆箱。
Math
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) 取大
public static double pow(double a,double b) 将第一个参数的值返回到第二个参数的幂。a底数b指数
public static double random() 返回随机数0.0-0.1
public static int round(float a) 四舍五入取整
public static double sqrt(double a) 返回double值正确舍入的正平方根