java-jdk-String

62 阅读1分钟

String

final

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    // 修饰的是是数组的引用; 不是值
    // final修饰的值和引用都能通过发射修改(修改引用和修改引用的值)
    private final char value[];
    // 当前str写入字符串常量池
    public native String intern();
}
  1. 修饰类: 不能被extends
  2. 修饰方法: 不能被子类修改
  3. 修饰属性: 必须初始化,后不能被修改(修改值/修改引用的区别)
  • 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

  1. String怎么实现不可变的,通过类反射修改会有什么问题,jvm对字符串有什么特殊处理?
  2. "a" + "c" 和 String("a") + "c"的区别
  3. Integer-cache的实现
  4. 自己实现字符串常量池
  5. 在String 中有许多对字符串进行操作的函数,substring concat replace replaceAll,这些函数是否会修改类中的value域呢=>return new string();
  6. String 类型的最大长度?