【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
- 可变字符串: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