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编辑

    目录
    相关文章
    |
    12天前
    |
    Java 程序员 容器
    Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
    在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
    |
    9天前
    |
    监控 Java 应用服务中间件
    高级java面试---spring.factories文件的解析源码API机制
    【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
    34 2
    |
    1月前
    |
    算法 Java 数据处理
    从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
    从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
    40 6
    |
    1月前
    |
    存储 Java API
    深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
    【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
    93 3
    |
    14天前
    |
    存储 算法 Java
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    |
    19天前
    |
    存储 缓存 Oracle
    Java I/O流面试之道
    NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
    Java I/O流面试之道
    |
    13天前
    |
    存储 缓存 安全
    在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
    在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
    33 2
    |
    13天前
    |
    Java
    Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
    Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
    23 2
    |
    16天前
    |
    存储 缓存 Java
    大厂面试必看!Java基本数据类型和包装类的那些坑
    本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
    41 4
    |
    16天前
    |
    存储 Java 程序员
    Java基础的灵魂——Object类方法详解(社招面试不踩坑)
    本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
    57 4
    下一篇
    无影云桌面