Java类库StrringBuffer类、Math、SimpleDateFormat、Random随机数、大数字处理类和UUID 无重复数据(附带面试题)

简介: 1.StrringBuffer类 CharConsequnse接口,2.Math数学计算,3.Date日期处理类与SimpleDateFormat、4.Random随机数、5.大数字处理类、6.UUID 无重复数据


1.StrringBuffer类 CharConsequnse接口

虽然一般对String的操作都是通过String类内部的方法,但是当一个String类进行频繁的修改则最好还是用StringBuffer类,以下是StringBuffer类的常用方法:

方法 描述
append() 将指定的字符串、字符、布尔值、整数等追加到当前StringBuffer对象的末尾
insert() 在指定位置插入指定的字符串、字符、布尔值、整数等
delete() 删除指定范围内的字符
deleteCharAt() 删除指定位置的字符
replace() 用指定字符串替换指定范围内的字符
reverse() 反转当前字符串
substring() 返回指定范围内的子字符串
length() 返回字符串的长度
capacity() 返回StringBuffer对象的容量
charAt() 返回指定索引位置的字符
setCharAt() 将指定索引位置的字符设置为指定字符
indexOf() 返回指定字符或字符串第一次出现的索引
lastIndexOf() 返回指定字符或字符串最后一次出现的索引
toString() StringBuffer对象转换为字符串

StringBuffer与String的不同

    1. 可变性:String 是不可变的,一旦创建就无法修改,任何对 String 的操作都会返回一个新的 String 对象。而 StringBuffer 是可变的,可以在已有对象上进行修改,避免频繁创建新对象。
    2. 线程安全性:StringBuffer 是线程安全的,多个线程可以同时访问和修改同一个 StringBuffer 对象,保证线程安全。而 String 是不可变的,因此天生具有线程安全性。
    3. 性能:由于 String 是不可变的,每次对 String 进行修改操作(如连接、替换等),都需要创建一个新的 String 对象,导致内存消耗和性能开销较大。而 StringBuffer 可以在原有对象上进行修改,避免了频繁的对象创建和销毁,提高了性能。
    4. API 功能:String 类提供了丰富的字符串操作方法,例如字符串分割、查找、替换等操作。而 StringBuffer 除了提供了 String 的大部分方法外,还提供了插入、删除、反转等针对可变字符串的操作。

    常用方法案例代码1:

    package Example1501;
    public class javaDemo {
        public static void main(String[] args) {
            StringBuffer str = new StringBuffer();
    //        字符串连接
            str.append("大家好啊").append("我是电棍");
            System.out.println(str);
    //        字符串反转
            str.reverse();
            System.out.println(str);
            StringBuffer str1 = new StringBuffer();
            str1.append("塔菲喵");
    //        字符串插入
            str1.insert(0,"关注");
            System.out.println(str1);
            StringBuffer str3 = new StringBuffer();
            str3.append("不要断章取义");
    //        字符串删除
            str3.delete(0,1);
            System.out.println(str3);
        }
    }

    image.gif

    image.gif编辑

    CharConsequense 接口:

    该接口有三个子类:StringBuffer String 与StringBuilder

    接口提供的方法:

    方法 描述
    charAt(int index) 返回指定索引位置的字符
    length() 返回字符序列的长度
    subSequence(int start, int end) 返回特定开始索引(包括)到结束索引(不包括)之间的子序列
    package Example1502;
    public class javaDemo {
        public static void main(String[] args) {
            CharSequence str = "千万不能断章取义啊";
    //        截取字符串
            CharSequence sub = str.subSequence(3,9);
            System.out.println(sub);
        }
    }

    image.gif

    image.gif编辑

    *面试题java 中操作字符串都有哪些类?它们之间有什么区别?

    (1)String

    String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

    (2)StringBuilder

    线程不安全,效率高,多用于单线程。

    (3)StringBuffer

    线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

    不频繁的字符串操作使用String,操作频繁的情况不建议使用String。

    StringBuilder > StringBuffer > String。


    2.Math数学计算

    由于经常会遇到数据计算,所以学好Math非常重要,以下是开发中Math常用的方法:

    方法 描述
    abs(x) 获取参数的绝对值
    ceil(x) 向上取整,返回不小于参数的最小整数
    floor(x) 向下取整,返回不大于参数的最大整数
    round(x) 四舍五入,将参数舍入为最接近的整数
    max(x, y) 返回两个参数中的较大值
    min(x, y) 返回两个参数中的较小值
    sqrt(x) 计算参数的平方根
    pow(x, y) 计算 x 的 y 次幂
    exp(x) 计算 e 的 x 次幂
    log(x) 计算参数的自然对数(以 e 为底)

    案例代码:

    package Example1503;
    public class javaDemo {
        public static void main(String[] args) {
             int i = -114514;
    //        取绝对值
            System.out.println(Math.abs(i));
    //        取最大值
            System.out.println(Math.max(1,112));
    //        开根号
            System.out.println(Math.sqrt(4));
    //        乘方
            System.out.println(Math.pow(2,2));
        }
    }

    image.gif

    image.gif编辑

    *面试题java 中的 Math.round(-1.5) 等于多少?

    -2

    Math提供了三个与取整有关的方法:ceil、floor、round

    (1)ceil:向上取整;

    Math.ceil(11.3) = 12;

    Math.ceil(-11.3) = 11;

    (2)floor:向下取整;

    Math.floor(11.3) = 11;

    Math.floor(-11.3) = -12;

    (3)round:四舍五入;

    加0.5然后向下取整。

    Math.round(11.3) = 11;

    Math.round(11.8) = 12;

    Math.round(-11.3) = -11;

    Math.round(-11.8) = -12;

    *面试题: 如何将字符串反转?

    添加到StringBuilder中,然后调用reverse()。


    3.Date日期处理类与SimpleDateFormat

    日期处理类一般是获取当前的时间。以下是日期处理类的常用的方法:

    方法 描述
    Date() 使用当前日期和时间创建一个 Date 对象
    Date(long time) 使用指定的时间值(以毫秒为单位)创建一个 Date 对象
    getTime() 返回 Date 对象表示的时间值(以毫秒为单位)

    案例代码:

    package Example1504;
    import java.util.Date;
    public class javaDemo {
        public static void main(String[] args) {
    //        获取当前时间
            Date date = new Date();
            System.out.println("有效期起始时间:"+date);
            long time  =  date.getTime();
    //        时间加上10天后的毫秒数
            time+=846000*1000;
            System.out.println("有效期结束:"+new Date(time));
        }
    }

    image.gif

    image.gif编辑

    虽然通过Date可以获取当前的日期,但是并不能输出我们想要的格式所以引入Simple日期格式化

    SimpleDataFormat日期格式化

    要了解日期格式化首先要了解日期格式化模板标记

    G Era 标记,例如 AD
    y 年份,例如 2023
    M 月份,如 7
    d 月中的天数,如 26
    h 小时(1-12小时制),如 10
    H 小时(0-23小时制),如 22
    m 分钟,如 56
    s 秒钟,如 30
    S 毫秒,如 123
    E 星期几的缩写,如 Mon
    EEEE 星期几的完整拼写,如 Monday
    z 时区,如 GMT+08:00
    Z 时区偏移量,如 +0800
    a 上午/下午标记,如 AM/PM

    SimpleDatefomat常用的方法:

    方法 描述
    format(Date date) 将指定的Date对象格式化为字符串,使用SimpleDateFormat对象的模式。
    parse(String source) 将给定的字符串解析为Date对象,根据SimpleDateFormat对象的模式进行解析。
    SimpleDateFormat(String pattern) 使用给定的模式创建一个SimpleDateFormat对象。

    案例代码:

    package Example1505;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class javaDemo {
        public static void main(String[] args)throws Exception {
    //        将date对象通过format函数转为str字符串
           Date date = new Date();
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
           String str = sdf.format(date);
           System.out.println(str);
    //       将字符串转为date对象
           String birthday = "2023-7-26";
           SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-mm-dd");
           Date date1 = sdf2.parse(birthday);
            System.out.println(date1);
        }
    }

    image.gif


    4.Random随机数

    生产中需要用到随机的事件非常多,比如抽奖,或者随机选择一个幸运儿的号码。而随机数也分两种一种是可以重复的随机数,一种是不可重复的随机数以下是Random的常用方法以及实现这两种情况的方法

    Random的常用方法

    方法 描述
    nextInt(int bound) 生成一个介于0(含)和指定边界值(不含)之间的随机整数。
    nextDouble() 生成一个介于0.0(含)和1.0(不含)之间的随机双精度浮点数。
    nextLong() 生成一个随机的长整型数。
    nextBoolean() 随机生成一个布尔值,true或false。
    nextFloat() 生成一个介于0.0(含)和1.0(不含)之间的随机单精度浮点数。
    nextGaussian() 生成一个符合高斯分布的随机双精度浮点数。
    setSeed(long seed) 使用指定的种子设置随机数生成器的种子值。
    nextInt() 生成一个随机整数。
    nextBytes(byte[] bytes) 生成随机字节数组,并将其存储到指定的字节数组中。

    1.可重复情况

    package Example1506;
    import java.util.Random;
    public class javaDemo {
        public static void main(String[] args) {
            Random random = new Random();
    //        一个班级有62号人数那么将在62号人中抽取一个人回答问题
            System.out.println("恭喜"+random.nextInt(62)+"号,同学被抽中回答问题");
    //可重复抽取的情况
             for (int  i =0;i<3;i++){
                 System.out.println(random.nextInt(3));
            }
        }
    }

    image.gif

    image.gif编辑

    2.不可重复情况

    36个人中需要抽取7个去搬运书籍:

    package Example1507;
    import java.util.Random;
    public class javaDemo {
        public static void main(String[] args) {
            int array[] =  new int[7];
            Random random =new Random();
            int randomNumber = random.nextInt(36);
            for (int i=0;i<7;i++){
                while (isUse(randomNumber,array)){
                    randomNumber = random.nextInt(36);
                }
                array[i] = randomNumber;
            }
            printArray(array);
        }
        public static boolean isUse(int data,int array[]){
            for (int i = 0;i<7;i++){
                if (array[i]==data){
                    return true;
                }
            }
            return false;
        }
        public static void printArray(int array[]){
            for (int i=0;i<array.length;i++){
                System.out.println(array[i]);
            }
        }
    }

    image.gif

    image.gif编辑


    5.大数字处理类

    由于有些数字太过于巨大以至于int这种数据类型无法进行接收,比如游戏中可能出现战力膨胀可能数字需要几百几千亿的攻击力而生命值也有几千万亿,那么这两个数字没办法接收也就没办法去计算了,所以这时候就需要用到大数字处理类

    在 Java 中,int 是一个有符号的 32 位整数类型。它的取值范围为 -2,147,483,648(-2^31)到 2,147,483,647(2^31-1)之间,即 -2 的 31 次方到 2 的 31 次方减一。超出这个范围的整数值将导致溢出。

    大数字有两类BigInteger类与BigDecimal类,顾名思义一个是整数类,一个是小数类

    以下是BigInteger类常用的方法:

    add(BigInteger val) 将当前BigInteger与指定的BigInteger相加。
    subtract(BigInteger val) 从当前BigInteger中减去指定的BigInteger。
    multiply(BigInteger val) 将当前BigInteger与指定的BigInteger相乘。
    divide(BigInteger val) 将当前BigInteger除以指定的BigInteger。
    mod(BigInteger val) 返回当前BigInteger除以指定BigInteger的余数。
    pow(int exponent) 返回当前BigInteger的指定幂次方。
    compareTo(BigInteger val) 比较当前BigInteger与指定的BigInteger的大小关系。
    equals(Object obj) 判断当前BigInteger是否与指定对象相等。
    toString() 将当前BigInteger转换为字符串表示形式。
    valueOf(long val) 返回具有指定值的BigInteger实例。
    isProbablePrime(int certainty) 测试当前BigInteger是否可能为素数。

    以下是BigDecimal类常用的方法:

    方法 描述
    add(BigDecimal augend) 将当前BigDecimal与指定的BigDecimal相加。
    subtract(BigDecimal subtrahend) 从当前BigDecimal中减去指定的BigDecimal。
    multiply(BigDecimal multiplicand) 将当前BigDecimal与指定的BigDecimal相乘。
    divide(BigDecimal divisor) 将当前BigDecimal除以指定的BigDecimal。
    remainder(BigDecimal divisor) 返回当前BigDecimal除以指定BigDecimal的余数。
    pow(int exponent) 返回当前BigDecimal的指定幂次方。
    setScale(int newScale, RoundingMode roundingMode) 设置当前BigDecimal的小数位数和舍入模式。
    compareTo(BigDecimal val) 比较当前BigDecimal与指定的BigDecimal的大小关系。
    equals(Object obj) 判断当前BigDecimal是否与指定对象相等。
    toString() 将当前BigDecimal转换为字符串表示形式。
    valueOf(long val) 返回具有指定值的BigDecimal实例。
    stripTrailingZeros() 返回一个去除尾部零的BigDecimal。

    使用的案例代码:

    package Example1508;
    import java.math.BigInteger;
    public class javaDemo {
        public static void main(String[] args) {
            BigInteger dead = new BigInteger("0");
    //        boss血量
            BigInteger bossLife = new BigInteger("10000000000");
    //        攻击力
            BigInteger attackValue = new BigInteger("5000000000");
            System.out.println("打Boss啦");
            while (bossLife.compareTo(dead)==1){
                System.out.println("勇者发动了攻击造成50000000伤害");
                bossLife = bossLife.subtract(attackValue);
                System.out.println("boss受伤了还剩余"+bossLife+"的血量");
            }
            System.out.println("大boss死了啦");
        }
    }

    image.gif

    image.gif编辑


    6.UUID 无重复数据

    由于卖的笔记本电脑,手机等等这些贵重的物品需要每一个都要有各自的编号并且不能重复,如果用排序的方法可能哪一天电脑抽抽了就不知道该从第几个序号开始才能确保唯一性,那么该如何保证id能够唯一呢?java中提供了UUID(universally unique id)

    方法:randomUUID();

    具体使用:

    package Example1509;
    import java.util.UUID;
    public class javaDemo {
        public static void main(String[] args) {
            UUID id =  UUID.randomUUID();
            System.out.println(id);
        }
    }

    image.gif

    image.gif编辑

    目录
    相关文章
    |
    6天前
    |
    Java 关系型数据库 MySQL
    Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
    【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
    34 3
    |
    2天前
    |
    人工智能 安全 Java
    Java8 - LocalDateTime时间日期类使用详解
    Java8 - LocalDateTime时间日期类使用详解
    |
    4天前
    |
    安全 Java 程序员
    |
    4天前
    |
    Java
    Java Class类
    Java Class类
    8 0
    |
    11天前
    |
    Java 编译器
    Java Character 类
    4月更文挑战第13天
    |
    12天前
    |
    存储 Java
    Java基础教程(7)-Java中的面向对象和类
    【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
    |
    15天前
    |
    Java Shell
    Java 21颠覆传统:未命名类与实例Main方法的编码变革
    Java 21颠覆传统:未命名类与实例Main方法的编码变革
    14 0
    |
    15天前
    |
    Java
    Java 15 神秘登场:隐藏类解析未知领域
    Java 15 神秘登场:隐藏类解析未知领域
    18 0
    |
    17天前
    |
    安全 Java
    append在Java中是哪个类下的方法
    append在Java中是哪个类下的方法
    23 9
    |
    18天前
    |
    JavaScript Java 测试技术
    基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
    基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)
    30 0
    基于Java的网络类课程思政学习系统的设计与实现(源码+lw+部署文档+讲解等)