StringBuilder
1.StringBuilder是什么?
- Java提供的类 被称之为字符串的缓冲区
2.StringBuilder作用?
- 字符串拼接建议使用StringBuilder
- 提高字符串的操作效率
3.StringBuilder的方法怎么用?
- 先创建对象
- 用对象名.方法名
4.演示StrigBuilder的基本使用
分别使用StringBuilder和String拼接10W次
import java.util.StringJoiner;
/**
* 分别使用StringBuilder和String拼接10W次
*/
public class StringBuilderDemo1 {
public static void main(String[] args) {
//需求: 分别通过这两段代码的执行时间
//获取一下时间
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100000; i++) {
sb.append("什么档次, 跟我写一样的代码?");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuilder拼接10W个字符串用时:"+(endTime-startTime));
startTime = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 100000; i++) {
s +="什么档次, 跟我写一样的代码?";
}
endTime = System.currentTimeMillis();
System.out.println("String拼接10W个字符串用时:"+(endTime-startTime));
}
}
StringBuilder对象的创建
/**
* 演示:
* StringBuilder对象的创建
*/
public class StringBuilderDemo2 {
public static void main(String[] args) {
//public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb = new StringBuilder();
System.out.println(sb); //如果输出语句打印对象名 没有显示地址 那么是因为源码的底层进行了优化
//public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
StringBuilder sb1 = new StringBuilder("abc");
System.out.println(sb1);
}
}
演示StringBuilder常用的方法
/**
* 演示StringBuilder常用的方法
*/
public class StringBuilderDemo3 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//public StringBuilder append(任意类型)添加数据,并返回对象本身
// sb.append("ab");
// sb.append(100);
// System.out.println(sb);
// System.out.println("========================");
// //添加数据之后 取出方法的返回值
// StringBuilder rs = sb.append("ccc");
// System.out.println(rs);
// System.out.println(sb);
//
// System.out.println("========================");
// StringBuilder rs2 = sb.append("ddd");
// System.out.println(rs2);
// System.out.println(rs);
// System.out.println(sb);
//链式编程:
sb.append("a").append("b").append("c");
System.out.println(sb); //abc
//校验一下 append 是否返回自己本身
//StringBuilder rs = sb.append(100);
//System.out.println(rs == sb);
//public StringBuilder reverse() 返回相反的字符序列
sb.reverse();
System.out.println(sb); //cba?
//public int length() 返回长度(字符出现的个数)
int i = sb.length();
System.out.println(i);
//public String toString() 通过toString()就可以实现把StringBuilder转换为String
String s = sb.toString();
System.out.println(s);
}
}
案例一:
package heima.d4_stringbuilder;
import java.util.Scanner;
/**
* 案例一:
*/
public class StringBuilderTest01 {
public static void main(String[] args) {
//创建一个键盘输入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.next(); //"abc aaa"
//调用静态方法 判断 str 是否为对称的字符串
boolean b = StringBuilderTest01.checkString(str);
//需要对方法执行之后产生的结果进行判断
if (b){
System.out.println(str+"是对称的字符串");
}else {
System.out.println(str+"不是对称的字符串");
}
}
/**
* 在测试类定义方法是不是一定要加static??? 可加可不加
* 方法要做的事情: 对字符串进行校验 判断是否为对称的字符串
* 方法的参数: 需要一个字符串 String
* 方法的返回值: 布尔类型
*/
public static boolean checkString(String s){ //"abc"
//要对参数字符串进行反转 --> 谁能反转??? StringBuilder
StringBuilder sb = new StringBuilder();
//通过append方法将参数字符串添加到sb
sb.append(s);
//调用方法对StringBuilder里面的数据进行反转
sb.reverse();
//将StringBuilder里面的数据转换为一个字符串
String newStr = sb.toString(); //"cba"
//判断反转之后得到的新字符串 和 参数字符串进行比较 如果内容一样 就说明是一个对称的字符串 否则是不对称
return newStr.equals(s);
}
}
案例二:
package heima.d4_stringbuilder;
import java.util.StringJoiner;
/**
* 案例二:
*/
public class StringBuilderTest02 {
public static void main(String[] args) {
//准备一个int类型的数组
int[] a = {66, 77, 88, 99};
//StringJoiner sj = new StringJoiner(",","[","]");
//sj.add(a[0]);
String rs = StringBuilderTest02.getArrayData(a);
System.out.println(rs);
}
/**
* 方法要做的事情: 将int类型数组的内容 按照指定的要求进行拼接
* 方法的参数: int类型的数组
* 方法的返回值: String
*/
public static String getArrayData(int[] arr){
//创建一个StringBuilder对象 用于拼接数组的内容
StringBuilder sb = new StringBuilder();
//调用append方法 先添加一个 [
sb.append("[");
//遍历数组
for (int i = 0; i < arr.length; i++) {
//判断数组的元素是否为偶数
if (arr[i] % 2 == 0) {
//判断循环的变量 是否到了 数组的最大索引
if (i == arr.length - 1) {
sb.append(arr[i]);
} else {
//如果不是最后一个元素 直接添加数组的元素 和 逗号以及空格即可
sb.append(arr[i]);
sb.append(", ");
}
}
}
//将StringBuilder里面的数据转成字符串
String s = sb.toString();
//判断一下 拼接的字符串是否以 逗号和空格结尾
if (s.endsWith(", ")){
//如果是以 逗号和空格作为结束的符号 那么就说明数据的格式为: [66, 88,
// 0 1 ...长度-2 长度-1
s = s.substring(0, s.length()-2); //[66, 88
}
return s + "]"; //返回拼接好的字符串
}
}
StringJoiner
1.StringJoiner是什么?
- JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的。
2.StringBuilder好处?
- 不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁
3.演示StrigBuilder的基本使用
演示StringJoiner构造
import java.util.StringJoiner;
/**
* 演示 StringJoiner构造
*/
public class StringJoinerDemo1 {
public static void main(String[] args) {
//public stringJoiner(字符串类型间隔符号)创建一个stringJoiner对象,指定拼接时的间隔符号
//public stringJoiner(字符串类型间隔符号,字符串类型开始符号,字符串类型结束符号)创建一个stringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号
//[元素1, 元素2, ]
StringJoiner sj = new StringJoiner(", ","[","]");
System.out.println(sj);
// public StringJoiner add(添加的内容) 添加数据(数据只能是字符串),并返回对象本身
sj.add("aaa");
sj.add("bbb");
System.out.println(sj);
//public int length ()返回长度(字符出现的个数)
int length = sj.length();
System.out.println(length); //包含前缀和后缀
//public String toString ()返回一个字符串(该字符串就是拼接之后的结果)
String s = sj.toString();
System.out.println(s);
}
}
演示任意数据类型转字符串
/**
* 演示 任意数据类型转字符串
*/
public class StringJoinerDemo2 {
public static void main(String[] args) {
int a = 10;
String s = a + "";
System.out.println(s);
System.out.println("--- 使用String类中的静态方法 valueOf(任意类型) ---");
String s1 = String.valueOf(10);
System.out.println(s1 + 80);
}
}
案例:
import java.util.StringJoiner;
/**
* 案例二:
*/
public class StringJoinerTest01 {
public static void main(String[] args) {
//准备一个int类型的数组
int[] a = {66, 77, 88, 99};
//调用方法 将数组的内容按照指定的格式拼接
String rs = StringJoinerTest01.getArrayData(a);
System.out.println(rs);
}
/**
* 方法要做的事情: 将int类型数组的内容 按照指定的要求进行拼接
* 方法的参数: int类型的数组
* 方法的返回值: String
*/
public static String getArrayData(int[] arr){
//创建一个StringJoiner对象 用于拼接数组的内容 , 且指定分隔符 前缀 和 后缀
StringJoiner sj = new StringJoiner(", ","{", "}");
//遍历数组
for (int i = 0; i < arr.length; i++) {
//判断数组的元素是否为偶数
if (arr[i] % 2 == 0) {
//只能添加字符串
sj.add(arr[i]+"");
}
}
return sj.toString(); //将StringJoiner对象里面的内容转成字符串
}
}
BigDecimal
1.BigDecimal是什么?
用于解决浮点型运算时,结果失真的问题。如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HStVJX5U-1688344366709)(C:\Users\ctx\AppData\Roaming\Typora\typora-user-images\image-20230701214146886.png)]
2.小结一下
1, BigDecimal用于解决浮点型运算时,结果失真的问题
2,创建BigDecimal的对象,构造方法使用参数类型为字符串的。
3,四则运算中的除法,如果除不尽请使用divide的三个参数的方法。
代码示例:
BigDecimal divide = bd1.divide(参与运算的对象, 小数点后精确到多少位, 舍入模式);
参数1 ,表示参与运算的BigDecimal 对象。
参数2 ,表示小数点后面精确到多少位
参数3 ,舍入模式
BigDecimal.ROUND_UP 进一法 BigDecimal.ROUND_FLOOR 去尾法 BigDecimal.ROUND_HALF_UP 四舍五入
思考题
为啥操作字符串建议使用StringBuilder,而不用原来学过的String???
使用StringBuilder而不是String的原因是StringBuilder具有更高的效率和更好的性能。
String是不可变的,这意味着每次对字符串进行修改时,都会创建一个新的字符串对象。这样的操作会导致频繁的内存分配和垃圾回收,对于大量的字符串操作来说,会造成性能上的损失。
而StringBuilder是可变的,它内部使用一个可变的字符数组来存储字符串内容。当对字符串进行修改时,StringBuilder会直接在原有的字符数组上进行操作,避免了频繁的内存分配和垃圾回收,从而提高了性能。
另外,StringBuilder还提供了一些方便的方法来进行字符串的拼接、插入、删除等操作,使得代码更加简洁和易读。
综上所述,对于频繁进行字符串操作的场景,建议使用StringBuilder来代替String,以提高性能和效率。
StringJoiner只能添加字符串, 如果要添加其它数据怎么办?
需要将其它的数据转成字符串。
怎么转?
方式一:+ 一个空串
//任意类型数据转字符串的方式
public class test {
public static void main(String[] args) {
int a = 10;
String s = a + "";
}
}
方式二:使用字符串的静态方法 valueOf(任意类型的数据)
public class test {
public static void main(String[] args) {
int a = 10;
String s = String.valueOf(a);
}
}
果要添加其它数据怎么办?
需要将其它的数据转成字符串。
怎么转?
方式一:+ 一个空串
//任意类型数据转字符串的方式
public class test {
public static void main(String[] args) {
int a = 10;
String s = a + "";
}
}
方式二:使用字符串的静态方法 valueOf(任意类型的数据)
public class test {
public static void main(String[] args) {
int a = 10;
String s = String.valueOf(a);
}
}