Java中String类型为什么不可变?

news/2024/11/24 5:17:51/

1.源码中String类不可变的原因

String类的源码

public final class String{//用字符数组来存数值private final char value[];}

虽然String是final类型的类,且value也是final类型的数组,但这不是String不可变的根本原因,String不可变是因为value是private,且并没有提供对外的get和set

final关键字修饰作用

修饰类:表明该类不可被继承,类中的所有成员方法都隐式的被指定为final方法

修饰方法:不可被重写,JVM会尝试将其内联,以提高运行效率

修饰变量:不可被改变,修饰引用变量表示引用不可变,引用指向的内容可变

修饰常量:在编译阶段会存入常量池中

2.如何改变String类的内容

String的值是不能被改变的,可能有人看到下面这个会觉得String的内容有被改变。但是实际上在内存中没改变的不是String 的值而是改变了引用的对象。然后将指针指向新的String 对象。所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响。如果要改变字符串的内容,可以用StringBuffer与StringBuilder.

1.第一种

public static void main(String[] args) {String s = "hey";
s=s+" how are you";
System.out.println(s);}//输出的值为   “hey how are you”

2.第二种对于引用类型,会在堆中创建实例,然后对象的具体指只在栈中进行保存。堆种保存的值栈种保存的值栈种对应的引用地址。

String中的value是引用类型,所以可以做到在不改变堆中引用的情况下,改变栈中具体的值即可

代码示例

public class StringModifyTest {public static void main(String[] args) throws Exception{// 1.  mock一个StringString str = "Melodfy";// 2. 通过反射过去对象// 反射获取对象的三种方法// 1. Class.forName("类全限定名")// 2. 类名.class()// 3. 实例.getClass()Class<? extends String> strCls = str.getClass();// 3. 通过反射获取指定参数,得到一个属性对象Field field = strCls.getDeclaredField("value");// 私有属性要设置可访问,否则访问操作时异常filed.setAccessible(true); // 4. 根据属性对象获取参数的具体指char[] result = (char[])field.get(str);// 5. 验证输出结果Systemg,out.println("变更前结果:");for(char c : result) {System.out.print(c);}// 6. 操作变更,然后输出验证System.out.println("变更后结果:");char[2] = 'w';for(char c : result) {System.out.print(c);}}
}

3.不可变的好处和坏处

1)线程安全性(好处)

在并发场景下,多个线程读取同一个资源,是不会引发竞态条件的。只有在对资源进行些操作时才有危险。不可变对象不能被修改,所以是线程安全的。

2)节省空间,提高效率(好处)

String还有字符串常量池的属性,on和two两个变量指向的是同一个地址。在大量使用字符串的情况下,可以节省内存空间,提高效率。

String的不可变条件是必要条件,要是内存中字符串内容能够改来改去,这么做就完全没有意义。

3)修改性能不高(坏处)

由于String 的不可变性,每次对String 类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String对象。

4.总结:

1.保存字符串的数组被final修饰且为私有的,并且String类没有提供/暴露修改这个字符串的方法

2.String类被final修饰导致其不能被继承,进而避免了子类破坏String 不可变


http://www.ppmy.cn/news/210163.html

相关文章

《CDA-LEVEL-II考试大纲》解读--PART 3 标签体系与用户画像

PART 3 标签体系与用户画像 一、标签体系设计原理 【领会】 区分标签和指标的概念; 精准营销与量化风控的概念; 消费者决策进程; 客户、产品、渠道标签的核心内容; 【熟知】 分层标签和分群标签; 马斯洛需求层次理论与精准营销的关系; 1、标签&指标 标签是一种对数据进行…

哪款蓝牙耳机的音质好?四款音质最好的蓝牙耳机测评

蓝牙耳机除了要音质好以外&#xff0c;还得佩戴舒适&#xff0c;这样的蓝牙耳机才能经久实用。最近整理了四款我用过且觉得音质是最好的蓝牙耳机&#xff0c;价格非常实惠&#xff0c;当年还是学生党的我都能轻易入手&#xff0c;而且佩戴感非常舒适&#xff0c;戴着听歌做习题…

在哪里购买铁三角耳机

在哪里购买铁三角耳机   夹式耳机已经与慢跑很受欢迎&#xff0c;但是严重的发烧友耸耸肩它作为一个噱头不是价格现金消费满上。多数的夹式耳机也认为未落具有一流的音频性能廉价物品。铁三角试图改变这种印象与ATH-EW9铁三角耳机。这副耳机的构造像其他夹式耳机&#xff0c;…

.ini配置文件介绍与解析库使用

【前言】 ini 文件是英文"Initialization"的缩写&#xff0c;即初始化文件。它用来配置特定应用软件以实现对程序初始化或进行参数设置。.ini文件由节(section)、键(key)、值(value)三种模块构成。在windows系统/嵌入式软件中有很多XXX.ini文件&#xff0c;例如Syste…

日志框架——Log4j2

日志框架——Log4j2 日志框架Log4j21. 概述2. Log4j2主要由几个重要的组件构成:3.项目中使用3.1 引入相关依赖pom.xml3.2 加入日志配置文件src/main/resources/log4j2.xml3.3 测试 日志框架Log4j2 1. 概述 Apache Log4j2是一个开源的日志记录组件&#xff0c;使用非常的广泛。…

LeetCode知识点总结 - 812

LeetCode 812. Largest Triangle Area 考点难度ArrayEasy 题目 Given an array of points on the X-Y plane points where points[i] [xi, yi], return the area of the largest triangle that can be formed by any three different points. Answers within 10^-5 of the …

沧田 DT812K 打印机驱动

沧田 DT812K 打印机驱动是官方提供的一款打印机驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决打印机与电脑连接不了&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的…

LeetCode: 812. 最大三角形面积

文章目录 一. 题目1. 链接2. 框架3. 描述4. 示例5. 数据范围 二. 解题1. 思路2. 复杂度3. 源码4. 考察 一. 题目 1. 链接 题目链接&#xff1a;LeetCode: 812. 最大三角形面积 2. 框架 c代码框架&#xff1a; class Solution { public:double largestTriangleArea(vector&…