Java中String部分源码解析
时间:2022-07-28
本文章向大家介绍Java中String部分源码解析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
String源码解析和面试题
String
不变性
一旦被初始化,就不能再被改变;即使修改,也是新的对象
String s = "Hello";
s = "你好";
为了满足不可变对象,Java语言要求遵守以下5条原则:
- 类内部所有的字段都是final修饰的
- 类内部所有的字段都是私有的,也就是private修饰
- 类不能够被集合和拓展
- 类不能对外提供那些能够修改内部状态的方法,setter方法也不行
- 类内部的字段如果是引用,也就是说可以指向可变对象,但我们不能获取这个对象
我们来看一下源码:
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条原则,源码解析:
- String类被final修饰,说明String类绝不可能被继承了,——也就是任何对String的操作方法,都不会被继承覆写。
- String 中保存数据的是一个char的数组value,同样也是被final修饰,——也就是value一旦被赋值,内存地址是绝对无法修改的
- value的权限是私有的,外部绝对访问不到
- String也没有开放出可以对value进行赋值的方法
综上,value一旦产生,内存地址就根本无法被修改。
String的其他方法是怎么回事?
既然String是不可变的,好像内部还有很多substring, replace, replaceAll这些操作的方法。好像都是对String对象改变了,解释起来也很简单,我们每次的replace这些操作,其实就是在堆内存中创建了一个新的对象。然后我们的value指向不同的对象罢了。
String str = “Hello world!”;
str = str.replace("world", "World...");
String真的不可变吗?
真的不能改变String吗?别忘了反射机制,在通常情况下,他可以做出一些违反语言设计原则的事情。
通过反射来改变String:
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();
}
}
}
- Hadoop数据分析平台实战——080HBase介绍和安装离线数据分析平台实战——080HBase介绍和安装
- Hadoop数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)
- ECJTUACM16 Winter vacation training #4 题解&源码
- Hadoop数据分析平台实战——090HBase shell客户端和Java Api介绍离线数据分析平台实战——090HBase shell客户端和Java Api介绍
- Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解
- 深入理解树状数组
- Codeforces 712C Memory and De-Evolution
- Codeforces 712B Memory and Trident
- Hadoop数据分析平台实战——110Hive介绍和Hive环境搭建离线数据分析平台实战——110Hive介绍和Hive环境搭建
- 干货|普通反爬虫机制的应对策略
- python基础-字符串与编码
- Codeforces 708A Letters Cyclic Shift
- Codeforce 712A Memory and Crow
- 每日一水之strcmp用法
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android Studio获取网络JSON数据并处理的方法
- Android使用ViewPager快速切换Fragment时卡顿的优化方案
- 在Android打包中区分测试和正式环境浅析
- django 多数据库及分库实现方式
- Python气泡提示与标签的实现
- Django之choices选项和富文本编辑器的使用详解
- Android使用RSA加密和解密的示例代码
- Android布局之帧布局FrameLayout详解
- Okhttp3实现爬取验证码及获取Cookie的示例
- Android监听系统来电并弹出提示窗口
- 你该知道的Gradle配置知识总结
- Android布局之绝对布局AbsoluteLayout详解
- django实现模型字段动态choice的操作
- 详解ASP.NET Core 处理 404 Not Found
- Python AutoCAD 系统设置的实现方法