c 做网站加载多个图片,图片直链在线生成网站,wordpress后台添加自定义输入框,英文网站怎么做文章目录 1. String 的基本特性2. 字符串拼接操作3. intern()的使用4. StringTable 的垃圾回收 1. String 的基本特性
String 声明为 final 的#xff0c;不可被继承String 实现了 Serializable 接口#xff1a;表示字符串是支持序列化的。String 实现了 Comparable 接口不可被继承String 实现了 Serializable 接口表示字符串是支持序列化的。String 实现了 Comparable 接口表示 string 可以比较大小String 在 jdk8 及以前内部定义了 final char[] value 用于存储字符串数据。JDK9 时改为 byte[]
String 的 String Pool 是一个固定大小的 Hashtable
2. 字符串拼接操作
常量与常量的拼接结果在常量池原理是编译期优化只要其中有一个是变量结果就在堆中。变量拼接的原理是 StringBuilder如果拼接的结果调用 intern()方法则主动将常量池中还没有的字符串对象放入池中并返回此对象地址(将堆中字符串的地址写到字符串常量池这个位置字符串常量池中存的是堆中对象的引用)
常量与常量拼接编译期优化 只要有一个变量就是在堆中用string builder拼接最后返回.tostring变为字符串 不使用 final 修饰即为变量。如 s3 行的 s1 和 s2会通过 new StringBuilder 进行拼接 使用 final 修饰即为常量。会在编译器进行代码优化。在实际开发中能够使用 final 的尽量使用 3. intern()的使用
DK1.7 起将这个字符串对象尝试放入串池。
如果串池中有则并不会放入。返回已有的串池中的对象的地址如果没有则会把对象的引用地址(就是将堆中这个对象的地址)复制一份放入串池并返回串池中的引用地址
4. StringTable 的垃圾回收
许多大规模的 Java 应用的瓶颈在于内存测试表明在这些类型的应用里面Java 堆中存活的数据集合差不多 25%是 String 对象。更进一步这里面差不多一半 string 对象是重复的重复的意思是说 stringl.equals(string2) true。堆上存在重复的 String 对象必然是一种内存的浪费。这个项目将在 G1 垃圾收集器中实现自动持续对重复的 string 对象进行去重这样就能避免浪费内存。
实现
当垃圾收集器工作的时候会访问堆上存活的对象。对每一个访问的对象都会检查是否是候选的要去重的 String 对象如果是把这个对象的一个引用插入到队列中等待后续的处理。一个去重的线程在后台运行处理这个队列。处理队列的一个元素意味着从队列删除这个元素然后尝试去重它引用的 string 对象。使用一个 hashtable 来记录所有的被 String 对象使用的不重复的 char 数组。当去重的时候会查这个 hashtable来看堆上是否已经存在一个一模一样的 char 数组。如果存在String 对象会被调整引用那个数组释放对原来的数组的引用最终会被垃圾收集器回收掉。如果查找失败char 数组会被插入到 hashtable这样以后的时候就可以共享这个数组了。