String
final
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
// 修饰的是是数组的引用; 不是值
// final修饰的值和引用都能通过发射修改(修改引用和修改引用的值)
private final char value[];
// 当前str写入字符串常量池
public native String intern();
}
- 修饰类: 不能被extends
- 修饰方法: 不能被子类修改
- 修饰属性: 必须初始化,后不能被修改(修改值/修改引用的区别)
- final 支持底层常量池的技术
- final 支持Map.Key
String-pool
String-pool内存模型
通过特殊的Map结构(弱引用)管理heap中的String对象;private static final WeakHashMap<String, WeakReference<String>> stringPool = new WeakHashMap<>();;
Heap中不会出现重复值的String(jvm-heap中,节省内存空间,同时GC删除比较快); 可以看成是一种优化内存使用的技术
对比
- ThreadLocal
- StringPool
- IntegerPool
通过反射修改String存在的问题
String长度
// 1. 从函数定义(int)角度看
// String => 2^32-1(4Byte);
int length();
// 2. 从底层实现看
// 字符串常量池; 底层cpp实现
CONSTANT_Utf8_info{
u1 tag,
u2 length; // 2^16-1(2Byte)
u1 bytes[length];
}
java中所有的String都是通过"字符串常量操作"; 所以2Byte
interview
- String怎么实现不可变的,通过类反射修改会有什么问题,jvm对字符串有什么特殊处理?
- "a" + "c" 和 String("a") + "c"的区别
- Integer-cache的实现
- 自己实现字符串常量池
- 在String 中有许多对字符串进行操作的函数,
substring concat replace replaceAll,这些函数是否会修改类中的value域呢=>return new string(); - String 类型的最大长度?