Java中的可变类型与不可变类型

一、可变类型

可变类型的对象在创建后,其状态(字段值)可以发生变化。这意味着,对象的属性可以在对象创建后被修改

1.1 特点:

  • 对象的字段值可以通过方法或直接访问进行修改。
  • 可以通过 setter 方法或其他手段修改对象的状态。
  • 可变类型的对象通常不具备线程安全性,特别是当多个线程访问同一个对象时,需要额外的同步措施。

1.2 示例

可变类型:

public class Person {
    // 可变字段
    private String name;
    private int age;
    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name; // 可以修改对象的状态
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age; // 可以修改对象的状态
    }
}

使用可变类型:

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);
        System.out.println(person.getName() + " " + person.getAge());
       // 修改对象的状态
        person.setName("Alice");
        person.setAge(30);
        System.out.println(person.getName() + " " + person.getAge());
    }
}

输出:

John 25
Alice 30

1.3可变类型的应用场景:

  • 需要修改对象的状态:比如用户的账号信息、订单的状态等。
  • 性能要求较高时,允许直接修改字段。

二、不可变类型

1.1 定义

不可变类型的对象在创建后,其状态无法改变。这意味着,一旦对象创建,其内部的字段值就不可再修改。常见的不可变类型有String、Integer、localDate

1.2 特点:

  • 对象的字段只能在构造时进行初始化,且之后无法更改。
  • 不可变类型的对象具有线程安全性,因为其状态不可变,多个线程访问时不会发生数据竞争。
  • 通常不可变类型会提供 只读字段无 setter 方法

1.3 示例:

public final class Person {
    private final String name; // final 字段,无法修改
    private final int age; // final 字段,无法修改

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter 方法(没有 Setter 方法,无法修改对象的状态)
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

使用不可变类型:

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John", 25);
        System.out.println(person.getName() + " " + person.getAge());

        // person.setName("Alice");  // 编译错误,无法修改对象的状态
        // person.setAge(30);  // 编译错误,无法修改对象的状态
    }
}

1.4 String

String 是 Java 中最经典的不可变类。String 类的实例一旦创建后,其值就不能修改。每当对字符串进行修改时,实际上是创建了一个新的 String 对象,而原始字符串对象保持不变。

1.4.1 为什么说它是不可变类型
  • 类是被final修饰
  • 存储数据的数组也是被final修饰
  • 类内没有任何方法对数组内的内容做修改

“共享带来的便利>随意修改带来的便利”

1.4.2 示例
public class Main {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = str1.toUpperCase();  // 转换为大写,但不会修改原始字符串
        
        System.out.println("Original String: " + str1);  // 输出 "Hello"
        System.out.println("Modified String: " + str2);  // 输出 "HELLO"
    }
}

输出:

Original String: Hello
Modified String: HELLO

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值