返回

【Java进阶】学好常用类,code省时省力

发布时间:2022-11-29 20:19:32 213
# java# java# 数据# 信息# 工具

一、工具类

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

工具类的设计

工具方法使用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]。


【Java进阶】学好常用类,code省时省力_包装类

三、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 ...)

【Java进阶】学好常用类,code省时省力_工具类_02


  • 线程安全,适合多线程环境
  • StringBuffer(与StringBuilder基本一致)
  • 区别
  • 相同点:都是字符串可变缓冲区,API提供了相同的CRUD操作
  • 不同点:StringBuffer线程安全,效率低,出生于JDK 1.0;StringBuilder线程不安全,效率高,出生于JDK1.5
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Spring Boot 检索&amp;定时任务 2022-11-29 19:48:32