首页
首页 教程 派聪明
  • 首页
  • 教程
  • 派聪明
  • 登录
登录技术派畅享更多权益

用户名密码登录

其他登录:
icon_GitHubCreated with sketchtool.
绑定星球,畅享VIP服务

微信扫码/长按识别登录

输入验证码
有效期五分钟 👉 手动刷新

登录即同意 用户协议 和 隐私政策

绑定二哥编程星球,畅享 VIP 尊享服务!

戳我了解如何获取星球编号,新窗口打开

添加二哥微信 itwanger 审核更快

记得备注 星球编号
我会根据星球编号进行审核
1
教程简介
更新时间: 2023年02月22日
限免
2
Java简介,什么是 Java?
更新时间: 2023年02月22日
限免
3
安装Java开发工具包JDK
更新时间: 2023年02月22日
限免
4
安装集成开发环境Intellij IDEA
更新时间: 2023年02月22日
限免
5
编写第一个Java程序:Hello World
更新时间: 2023年02月22日
限免
6
关键字和保留字
更新时间: 2023年04月23日
限免
7
Java 注释
更新时间: 2023年04月23日
限免
8
Java 数据类型
更新时间: 2023年04月24日
限免
9
Java 数据类型转换
更新时间: 2023年04月24日
限免
10
Java 基本数据类型缓存池
更新时间: 2023年04月24日
限免
11
Java 运算符
更新时间: 2023年04月24日
限免
12
Java 流程控制语句
更新时间: 2023年04月24日
限免
13
掌握 Java 数组
更新时间: 2023年04月25日
限免
14
掌握 Java 二维数组
更新时间: 2023年04月25日
限免
15
打印 Java 数组
更新时间: 2023年04月25日
限免
16
解读 String 源码
更新时间: 2023年04月25日
限免
17
String 为什么不可变
更新时间: 2023年04月25日
限免
18
深入理解 Java 字符串常量池
更新时间: 2023年04月25日
限免
19
详解 String.intern 方法
更新时间: 2023年04月25日
限免
20
StringBuilder 和 StringBuffer
更新时间: 2023年04月25日
限免
21
判断字符串相等
更新时间: 2023年04月25日
限免
22
字符串拼接
更新时间: 2023年04月25日
限免
23
字符串拆分
更新时间: 2023年04月25日
限免
关注公众号
原创
为什么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 对象中的用户名和密码保持不变。这证明了字

登录之后即可阅读全文
该文档仅「二哥编程星球」的VIP用户可见

二哥的编程星球内容包括:

1. 付费文档: 技术派、MYDB 等项目配套的 120+篇教程查看权限

2. 面试指南: 校招、社招的 40 万+字面试求职攻略

3. 智能助手: 无限期使用派聪明 AI 助手,已对接讯飞星火和 ChatGPT双通道,不用花 1 分钱

4. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等

5. 简历修改: 提供简历修改服务,附赠星球 100+优质简历模板可供参考

6. 学习环境: 打造一个沉浸式的学习环境,有一种高考冲刺、大学考研的氛围


二哥的星球

》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮

》步骤②:访问星球置顶帖球友必看: https://t.zsxq.com/11rEo9Pdu,获取项目配套文档的语雀访问地址和密码

已加入星球,绑定星球编号
删除提醒

确定删除《为什么Java字符串String是不可变的?》吗

1人已点赞

回复