首页 > 编程语言 >[Java基础]String 为什么是不可变的?

[Java基础]String 为什么是不可变的?

时间:2024-07-29 22:39:23浏览次数:13  
标签:Java String 不可 value public MyString myString final

关于这个问题,网上有人说,是因为String类被写成final或者String中的成员变量value数组被写成final,但其实并不是,下面做一个实验

public final class MyString {
    public final char[] value = {'z'};
}

首先我们定义了一个类Mystring,并且类和成员变量都被设置成final

public class Main {
    public static void main(String[] args) {
        MyString myString = new MyString();
        System.out.println(myString.value);
        myString.value[0] = 'a';
        System.out.println(myString.value);
        myString.value[0] = 'b';
        System.out.println(myString.value);
    }
}

执行结果

z
a
b

这说明仅仅把类和成员变量设置成final无法实现不可变,为了实现不可变我们还需要把这个成员变量设置成private不可见。

继续我们的实验

public final class MyString {
    private final char[] value = {'z'};
}

这时再去执行上面的main函数,有如下结果,

E:\MIT6.830\Test_7\src\Main.java:12:36
java: value 在 MyString 中是 private 访问控制

这时候我们无法直接修改value的值,但是这就可以了吗?当然还没有

为了保证string的不可变我们还要继续做到以下几点

  • 首先设置内部成员变量的访问修饰符为private,这样就无法在类的外部直接访问到这个成员变量
  • 其次我们必须保证String类不提供成员方法去修改value,String的成员方法不是直接修改value而是通过新建一个String,并且把旧的string中的值复制到新的string对象中去。
  • 在value上加final保证这个数组的引用不会被修改而指向另一个数组
  • 在String上加final保证String没有子类,因为子类可能提供方法去修改value,子类可以赋值给父类引用进而破坏String的不可变特性

保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。

标签:Java,String,不可,value,public,MyString,myString,final
From: https://www.cnblogs.com/DCFV/p/18331239

相关文章

  • Java编写:给 20 块钱买可乐,每瓶可乐 3 块钱,喝完之后退瓶子可以换回 1 块钱, 问最多可以
    代码如下:注意while和count一般连用,如果是i只会循环执行一次!importjava.util.Scanner;publicclasstest16{publicstaticvoidmain(String[]args){//给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐//......
  • JavaEE 初阶(11)——多线程9之“阻塞队列”
    目录一.什么是“阻塞队列”二.生产者消费者模型2.1概念2.2 组件 2.3实际应用2.4优点 a.实现“解耦合” b.流量控制——“削峰填谷”2.5代价a. 更多的机器b.通信时间延长三.阻塞队列的实现 3.1简述  3.2ArrayBlockingQueue的使用3.3实现MyA......
  • 编写java程序,自动监控程度,dump内存文件
    步骤1:编写Java程序首先,编写一个Java程序,当内存使用达到11GB时生成heapdump文件,并以日期命名。将以下代码保存为MemoryMonitor.java文件:importcom.sun.management.HotSpotDiagnosticMXBean;importjavax.management.MBeanServer;importjava.lang.managemen......
  • 2024年华为OD机试真题-找出作弊的人-(C++/Java/python)-OD统一考试(C卷D卷)
    2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】  题目描述公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,......
  • 【Java】韩顺平Java学习笔记 第19章 IO流
    文章目录文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream&BufferedOutputStream对象流:Obje......
  • html中javascript点击事件后显示或隐藏某些元素时需要点击两次才生效的原因分析和优化
    html中javascript点击事件后显示或隐藏某些元素时需要点击两次才生效的原因分析和优化。原来的代码如下:<divclass="cardcardcol-sm-6col-md-4col-xl-2col-lg-2justify-content-centerbg-secondary-subtle"id="tools-trigger"><ahref="javascript:vo......
  • java基础知识汇总(一)
    PART1:Java基础知识概述与Java的下载安装1)Java语言概述:①Java的发展史:詹姆斯·高斯林(JamesGosling)1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第一代工作站NeWS系统,但不受重视。后来转至S......
  • Java 关键字、标识符、注释、常量
    关键字:被Java语言赋予特殊含义的单词,一般是使用小写字母构成。如何区分关键字?idea对关键字具有高亮的效果。但goto和const作为保留字存在。标识符:给类、接口、方法、变量等起名字时使用的字符序列起名字时的规则:1、英文大小写字母2、数字字符3、$和_起名字时的规范:1......
  • JAVA毕业设计|springboot房屋租赁系统包含文档代码讲解
     收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven 编号:springboot008一、系统展示二、万字文档展示第5章系统详细设计5.1管理员功能模......
  • JAVA毕业设计|springboot在线宠物用品交易网站的设计与实现包含文档代码讲解
    收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven 编号:springboot082一、系统展示二、万字文档展示第5章系统详细设计5.1管理员模块的......