为什么Java字符串String是不可变的?
4.5 String为什么不可变
String 可能是 Java 中使用频率最高的引用类型了,因此 String 类的设计者可以说是用心良苦。
比如说 String 的不可变性。
- String 类被 final 关键字修饰,所以它不会有子类,这就意味着没有子类可以重写它的方法,改变它的行为。
- String 类的数据存储在
char[]
数组中,而这个数组也被 final 关键字修饰了,这就表示 String 对象是没法被修改的,只要初始化一次,值就确定了。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
“哥,为什么要这样设计呢?”三妹有些不解。
“我先简单来说下,三妹,能懂最好,不能懂后面再细说。”
第一,可以保证 String 对象的安全性,避免被篡改,毕竟像密码这种隐私信息一般就是用字符串存储的。
以下是一个简单的 Java 示例,演示了字符串的不可变性如何有助于保证 String 对象的安全性。在本例中,我们创建了一个简单的 User 类,该类使用 String 类型的字段存储用户名和密码。同时,我们使用一个静态方法 getUserCredentials 从外部获取用户凭据。
class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
public class StringSecurityExample {
public static void main(String[] args) {
String username = "沉默王二";
String password = "123456";
User user = new User(username, password);
// 获取用户凭据
String[] credentials = getUserCredentials(user);
// 尝试修改从 getUserCredentials 返回的用户名和密码字符串
credentials[0] = "陈清扬";
credentials[1] = "612311";
// 输出原始 User 对象中的用户名和密码
System.out.println("原始用户名: " + user.getUsername());
System.out.println("原始密码: " + user.getPassword());
}
public static String[] getUserCredentials(User user) {
String[] credentials = new String[2];
credentials[0] = user.getUsername();
credentials[1] = user.getPassword();
return credentials;
}
}
在这个示例中,尽管我们尝试修改 getUserCredentials 返回的字符串数组(即用户名和密码),但原始 User 对象中的用户名和密码保持不变。这证明了字
回复