前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中String部分源码解析

Java中String部分源码解析

作者头像
宇宙之一粟
发布2020-10-26 10:28:16
3320
发布2020-10-26 10:28:16
举报
文章被收录于专栏:宇宙之_一粟

String源码解析和面试题

String

不变性

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

代码语言:javascript
复制
String s = "Hello";
s = "你好";

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

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

我们来看一下源码:

代码语言:javascript
复制
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
复制
String str = “Hello world!”;
str = str.replace("world", "World...");

String真的不可变吗?

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

通过反射来改变String:

代码语言:javascript
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • String源码解析和面试题
    • String
      • 不变性
      • String的其他方法是怎么回事?
      • String真的不可变吗?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档