常用API:StringBuilder、StringJoiner和BigDecimal(学习笔记)

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值