Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中String部分源码解析

Java中String部分源码解析

作者头像
宇宙之一粟
发布于 2020-10-26 02:28:16
发布于 2020-10-26 02:28:16
34200
代码可运行
举报
文章被收录于专栏:宇宙之_一粟宇宙之_一粟
运行总次数:0
代码可运行

String源码解析和面试题

String

不变性

一旦被初始化,就不能再被改变;即使修改,也是新的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String s = "Hello";
s = "你好";

为了满足不可变对象,Java语言要求遵守以下5条原则:

  1. 类内部所有的字段都是final修饰的
  2. 类内部所有的字段都是私有的,也就是private修饰
  3. 类不能够被集合和拓展
  4. 类不能对外提供那些能够修改内部状态的方法,setter方法也不行
  5. 类内部的字段如果是引用,也就是说可以指向可变对象,但我们不能获取这个对象

我们来看一下源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
  
    /** Cache the hash code for the string */
    private int hash; // Default to 0
}  

从源码可以看出,String满足不可变对象的5条原则,源码解析:

  1. String类被final修饰,说明String类绝不可能被继承了,——也就是任何对String的操作方法,都不会被继承覆写。
  2. String 中保存数据的是一个char的数组value,同样也是被final修饰,——也就是value一旦被赋值,内存地址是绝对无法修改的
  3. value的权限是私有的,外部绝对访问不到
  4. String也没有开放出可以对value进行赋值的方法

综上,value一旦产生,内存地址就根本无法被修改。

String的其他方法是怎么回事?

既然String是不可变的,好像内部还有很多substring, replace, replaceAll这些操作的方法。好像都是对String对象改变了,解释起来也很简单,我们每次的replace这些操作,其实就是在堆内存中创建了一个新的对象。然后我们的value指向不同的对象罢了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = “Hello world!”;
str = str.replace("world", "World...");

String真的不可变吗?

真的不能改变String吗?别忘了反射机制,在通常情况下,他可以做出一些违反语言设计原则的事情。

通过反射来改变String:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StringDemo {
    public static void main(String[] args) {
        String str = "Hello";
        System.out.println(str);
        try {
            // 通过反射获取内部的value字符数组
            Field field = String.class.getDeclaredField("value");
            field.setAccessible(true);
            char[] value;
            value = (char[]) field.get(str);
            // 把字符串第一个字符H变成小写
            value[0] = 'h';
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
细读源码之Java String
Java中的String类绝对是使用最广泛的类,本文就带着大家细读一下JDK8下的String源码,主要包含以下几个方面的内容:
小马哥学JAVA
2022/12/13
2920
【Java】String 类详解:字符串操作的必备知识
🔥 常量池(了解):由于String 类型描述的字符串内容是常量不可改变,因此 Java 虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能
IsLand1314
2024/10/15
4820
【Java】String 类详解:字符串操作的必备知识
为什么Java里面String类是不可变的
在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。
我是攻城师
2019/03/06
7500
为什么Java里面String类是不可变的
【Java 面试题系列 04】Final 与 String
HashMap 的 key 建议使用不可变类,什么叫不可变类呢?这里说的不可变指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类。
方才编程_公众号同名
2020/11/13
3930
【Java 面试题系列 04】Final 与 String
Java基础类String了解一下
当你路过一些商场或者地铁口的时候,有没有被千篇一律的"xx健身,了解一下" 所烦到。
我是攻城师
2018/05/25
5453
Java基础类String了解一下
Java 中的 String 为什么是不可变的?
本文主要探讨了Java中的String类的不可变性,从字符串字面量、字符串常量、String类的构造函数、String类的setXXX方法、以及String类的不可变子类Character等几个方面,说明了Java中的字符串底层实现以及其不可变性。同时,也通过代码示例阐述了String对象在Java中的使用方式,包括字符串字面量、字符串常量、String类的构造函数、setXXX方法以及不可变子类Character等。
Java后端工程师
2017/12/18
1.9K0
Java 中的 String 为什么是不可变的?
Java不可变类机制
不可变类(Immutable Class):所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
用户7886150
2021/02/26
9720
震惊,99.9% 的同学没有真正理解字符串的不可变性
稍有些基础的同学都知道 Java 中 String 字符串是“不可变”的,想要使用“可变字符串”可以使用 StringBuilder 和 StringBuffer 。
明明如月学长
2022/09/17
2610
震惊,99.9% 的同学没有真正理解字符串的不可变性
必知必会:String不可变的3个好处
大家好,欢迎来到程序视点!我是小二哥。今天我们来来聊聊String类型对象不可变的问题。
程序视点
2023/11/03
3730
必知必会:String不可变的3个好处
走进 JDK 之 String
贯穿全文,你需要始终记住这句话,String 是不可变类 。其实前面说过的所有基本数据类型包装类都是不可变类,但是在 String 的源码中,不可变类 的概念体现的更加淋漓尽致。所以,在阅读 String 源码的同时,抽丝剥茧,你会对不可变类有更深的理解。
路遥TM
2021/08/31
3110
Java 基础 - String源码解读
想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:
郭顺发
2021/12/17
3560
Java 基础 - String源码解读
String 的不可变真的是因为 final 吗?
String 为啥不可变?因为 String 中的 char 数组被 final 修饰。这套回答相信各位已经背烂了,But 这并不正确!
飞天小牛肉
2021/04/09
5970
String 的不可变真的是因为 final 吗?
String类的不可变性
来源 | 简书| 作者 | 指尖上的榴莲 一.原理(为什么说String类是不可变的) 1.什么是不可变对象 如果一个对象在创建之后就不能再改变它的状态,那么这个对象是不可变的(Immutable)。
Tanyboye
2018/07/02
6140
在java中String类为什么要设计成final?Java面试常见问题
其实在Java中,String类被final修饰,主要是为了保证字符串的不可变性,进而保证了它的安全性。那么final到底是怎么保证字符串安全性的呢?接下来就让我们一起来看看吧。
IT千锋教育
2023/05/24
4360
在java中String类为什么要设计成final?Java面试常见问题
夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/25
7000
Java的String类
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/06/04
1050
Java的String类
工作三年,小胖连 String 源码都没读过?真的菜!
String 类相信大家都不陌生,它是引用类型,同时也是工作中用的最多的一个类。那它到底是怎么实现的呢?我们看源码:
JavaFish
2021/02/03
4940
工作三年,小胖连 String 源码都没读过?真的菜!
String类不可变分析以及普通不可变类
要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。
名字是乱打的
2021/12/22
6560
String类不可变分析以及普通不可变类
JAVA不可变类(immutable)机制与String的不可变性
不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。 可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。
lyb-geek
2018/12/26
1.7K0
Java基础
JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。反射机制指的是程序在运行时能够获取自身的信息。在JAVA中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。Java
花落花相惜
2021/11/24
1.4K0
相关推荐
细读源码之Java String
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验