Java中常用的不可变类是指一旦被创建,它们的值就不可更改的类。在实际开发中,使用不可变类时可以带来多种优点,比如线程安全、缓存、副本等。下面我们将介绍Java中常见的不可变类:

1.字符串(String)

Java中的String类是不可变的。也就是说,一旦创建了一个字符串对象,该对象就无法更改。因此,如果需要对某个字符进行修改,需要创建一个新的字符串对象。

String s1 = "Hello";
s1 = s1 + " World"; // 创建了一个新的字符串对象

2.基本数据类型的封装类型,如Integer、Float、Boolean等

与String类似,Java中的整型、浮点型和布尔类型也都是不可变的,一旦被创建就不能更改。

Integer i = 5;
i++; // 创建了一个新的Integer对象

3.枚举类型(Enum)

Java中的枚举类型也是不可变的。枚举常量一旦被创建,其值就固定不变,无法通过程序代码进行修改。

enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

4.日期时间类,如LocalDate、LocalTime、Instant等

Java 8引入了新的日期时间API,其中日期时间类、时区等都是不可变的。

LocalDate date = LocalDate.of(2023, 4, 21);
date = date.plusDays(1); // 创建了一个新的LocalDate对象

5.BigDecimal、BigInteger等数值类

Java中的BigDecimal和BigInteger等数值类也都是不可变的。这些类的使用可以避免精度丢失和舍入误差等问题。

BigDecimal d1 = new BigDecimal("0.1");
BigDecimal d2 = new BigDecimal("0.2");
BigDecimal sum = d1.add(d2); // 创建了一个新的BigDecimal对象

解决不可变类的方法

尽管不可变类具有多种优点,但在某些情况下,程序需要对字符串或其他类型进行修改。此时可以使用可变类,例如StringBuilder。StringBuilder类是可变的,它允许在已经初始化的对象上添加、插入、删除字符。

StringBuilder builder = new StringBuilder("Hello");
builder.append(" World!"); // 在原有字符串上添加,不需要创建新的字符串对象
String result = builder.toString(); // 转换为不可变的String对象

另外,由于String和StringBuilder之间的相互转换比较容易,因此可以根据实际需要自由地在两种类型之间切换。

String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.append(" World!");
str = builder.toString();

总之,Java中的不可变类具有许多优点,可以提高程序的性能、可靠性和安全性。在实际开发中,根据需求选择合适的类是非常重要的。