• 【Java进阶】学好常用类,code省时省力(一)


    一、工具类

    所谓工具类,即将完成通用功能的方法分类放到类中,工具类能够被高效地重复使用,使我们的编码快速、高效。

    工具类的设计

    工具方法使用public static修饰,通过工具类名调用工具方法。对于工具类,我们通常都会将构造方法私有化,目的是防止外界创建对象调用静态方法。
    如果工具方法未用static修饰,则需要创建工具类对象调用工具方法,这时我们应考虑将工具类设计为单例模式。
    单例模式(singleton)

    设计模式:谈到单例模式,我们应当想到设计模式,设计模式是一套被反复使用的代码设计经验总结,专门用于解决特定场景的需求。

    所谓单例,即只有一个实例(对象),即保证在整个应用中某个类有且只有一个实例,即类在堆内存中只能创建一个对象。 实例中持有数据,只有一个实例,则多个模块访问该实例的数据都是一样的,可用于共享信息。

    单例模式分类

    • 饿汉式:类加载时创建对象
    • 懒汉式:类加载时只声明对象,只有需要时才创建对象
    • 枚举法:

    在这里插入图片描述

    设计要求

    • 必须在类中创建一个对象
    • 构造器私有化,防止外界创建对象
    • 提供一个公共静态方法,用于返回自身创建的对象(即向外界提供统一的访问方式)

    二、包装类

    所谓包装类,即将基本数据类型封装到一个类中,包装类位于java.lang

    Object
    • Boolean --> boolean

    • Number

      • Byte --> byte
      • Short --> short
      • Integer --> int
      • Long --> long
      • Float --> float
      • Double–> double
    • Character --> char

    Integer
    Integer内部封装了一个int类型的值,并提供了操作该值以及int和String之间转换的方法

    常用方法

    • static Integer valueOf(int i):创建指定int值的Integer对象

    • static Integer valueOf(String s): 创建指定String值的Integer对象

    • static int parseInt(String s)将String转换为int类型

    • static String toString(int i):将int转换为String对象

    • int intValue():将Integer转换为int类型

    • String toString():将Integer转换为String对象

    在这里插入图片描述

    Auto-Boxing 和 Auto-UnBoxing

    装箱和拆箱,装箱即将基本数据类型包装为包装类对象,拆箱即将包装类对象转换为基本数据类型。
    自动装箱和自动拆箱,其实跟装箱和拆箱差不多的,只是不需要我们手动去转换,但底层依然是手动装箱和拆箱。
    自动装箱:Integer num = 20;
    自动拆箱:int val = num;

    缓存设计

    从性能上考虑,将常用数据存储到缓存区域,使用时则不需要创建对象,从而提高性能。
    缓存范围:对于Byte、Short、Integer、Long,范围为[-128, 127];对于Character,范围为[0, 127]。
    在这里插入图片描述

    三、BigDecimal类

    位于java.math,用于处理高精度数据和金融领域

    构造方法:
    BigDecimal(type val):type可以为int、long、double、String
    例如:BigDecimal num = new BigDecimal(0.09);

    成员方法:

    • add()
    • subtract()
    • multiply()
    • divide()

    除不尽问题:java.lang.ArithmeticException
    Non-terminating decimal expansion; no exact representable decimal result.

    • setScale()

    保留位数, 精度控制
    RoundingMode.HALF_UP 四舍五入
    RoundingMode.HALF_DOWN 四舍五入

    四、String类

    位于java.lang,String为字符串(字符序列)

    分类

    • 根据同一个对象, 内容能不能修改区分

    • 不可变字符串:String

    • 创建完毕,内容将不能修改,若改变其内容,其实是创建新对象

    • 在内存中以字符数组的形式存在

    • 创建方式

    • String str = “Hello”; 存储在方法区的常量池,节约内存

    • String str = new String(“Hello”);

    • str1先指向常量池中的hello,之后str2也指向了常量池的hello

    • “空”值

    • String str = null; 没有初始化,没有分配空间

    • String str = “”; 完成初始化,分配了空间,但没内容

    • 常用方法

    • int length():返回字符串的字符个数(长度)(包含空格)

    • char charAt(int index):返回指定索引位置的字符(从0开始)

    • int indexOf(String str):返回指定字符串在此字符串中从左向右第一次出现的索引(比如获取文件名“.”的位置)

    • boolean equals(Object anObject):比较内容是否相同

    • boolean equalsIgnoreCase(String anotherString):比较内容是否相同(忽略虑大小写)(比如验证码判断)

    • String toUpperCase():将字符串所有字符转为大写

    • String toLowerCase():把字符串所有字符转换为小写

    • String substring(int beginIndex):从指定位置开始截取字符串(从0开始)

    • String substring(int beginIndex, int endIndex):截取指定区域的字符串(从0开始,左闭右开)(比如截取文件的文件名部分)

    • boolean startsWith():判断字符串是否以指定前缀结束

    • boolean endsWith():判断字符串是否以指定后缀结束(比如判断文件为何种类型)

    • String trim():清除字符串头部尾部空白

    • boolean isEmpty():判断字符串是否为空

    • String concat(String str):拼接字符串

    • byte[] getBytes():将字符串转为byte序列

    • int hashCode():取字符串的哈希码

    • String replace(char oldChar, char newChar):将字符串中的某个字符替换为另一个字符

    • String[] split(String regex):拆分字符串

    • 可变字符串:StringBuilder/StringBuffer

    创建完毕内容可以修改,内容发生修改,对象保持不变

    • StringBuffer

    • 封装的数组默认空间是16个字符,当容量不够时,会自动扩容
      构造方法

    • StringBuffer():创建默认容量的字符串缓冲区

    • StringBuffer(int capacity):创建指定容量的字符串缓冲区

    • 常用方法

    • append()

    • insert()

    • delete()

    • setCharAt():只能在有数据的位置修改

    • replace(start, end, str):可以替换为空、变长、变短

    • length():返回字符个数

    • capacity():返回字符缓冲区的容量

    扩容原理

    • 当向字符数组添加元素发现容量不够时,利用value << 1 + 2(乘二加二)计算出扩容后新字符数组的容量,若新容量仍不满足要求,则直接将字符串长度作为容量进行扩容,然后利用数组复制的方式将旧字符数组复制到新字符数组,最后将新字符数组的地址赋值给包装类StringBuffer的value属性。(16 --> 34 --> 70 --> 142 …)

    在这里插入图片描述
    在这里插入图片描述

    • 线程安全,适合多线程环境

    • StringBuffer(与StringBuilder基本一致)
      区别

    • 相同点:都是字符串可变缓冲区,API提供了相同的CRUD操作

    • 不同点:StringBuffer线程安全,效率低,出生于JDK 1.0;StringBuilder线程不安全,效率高,出生于JDK1.5

    有不懂不明白之处可以在下方留言

    源码附件已经打包好上传到百度云了,大家自行下载即可~

    链接: https://pan.baidu.com/s/14G-bpVthImHD4eosZUNSFA?pwd=yu27
    提取码: yu27
    百度云链接不稳定,随时可能会失效,大家抓紧保存哈。

    如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~

    GIT 项目推荐:包含多端免授权可商用

    附件地址:http://github.crmeb.net/u/defu

  • 相关阅读:
    【算法 | 模拟No.1】leetcode1576. 替换所有的问号
    笔记·Pandas几类数据读写方法对比
    【视频处理】通过调用图像来重建新影片及计算颜色通道的平均灰度值,并检测帧与前一帧之间的差异(Matlab代码实现)
    消息队列(中间件)
    linux 学习 day09 多路转接select、poll、epoll
    Python自动处理pptx:新建、另存、添加幻灯片、添加标题、插入文本图片图形、提取文本
    mybatis在实际项目中常见的排坑配置
    Linux项目自动化构建工具 -make/makefile
    Spring Boot 集成 zxing 生成条形码与二维码
    R语言计算时间序列数据的逐次差分(successive differences):使用diff函数计算时间序列数据的逐次差分值
  • 原文地址:https://blog.csdn.net/qq_39221436/article/details/126411045