美文网首页
Java之String总结

Java之String总结

作者: Jason_Sam | 来源:发表于2019-05-23 19:34 被阅读0次
  1. String类型
  2. 什么是字符串缓存的intern机制
  3. 什么是字符串排重
  4. 什么是intrinsic机制

String类型

类型 特点 线程安全 特点
String 内部结构是final char[]数组。是典型的immutable类 安全 性能低,字符串操作会产生中间对象
StringBuffer 内部结构是char[]数组。继承AbstractStringBuilder 安全 性能较低,操作都采用synchronized进行加锁
StringBuilder 同上 不安全 性能高

那么,String拼接的场景中是否一定要使用StringBuilder或者StringBuffer?

答案:并不是。原因如下:

  1. String的可读性更好一些。

  2. JDK 8 开始,"a"+"b"会默认采用StringBuilder实现。

  3. JDK 9中,提供更统一的字符串操作优化,提供了StringConcatFactory作为统一入口。

intern机制

JDK对intern影响

JDK 6:intern()方法会把首次遇到的字符串实例复制到永久代,返回的也是永久代实例。


//JDK1.6

String s3 = new String("1") + new String("1");

// 1. 将s3(“11”)的复制品,放到永久带中。

s3.intern();

// 2. s4 = s3的复制品

String s4 = "11";

// 3. 一定不相等,结果为false

System.out.println(s3 == s4);

JDK 7:intern()实现不会复制实例,只是在常量池记录首次出现实例的引用。


//JDK1.7

// 生成常量池中的"1"和生成堆空间中的"11"
String s3 = new String("1") + new String("1");

// 1. 将s3(“11”)的引用记录在常量池中。

s3.intern();

// 2. s4 = s3的引用

String s4 = "11";

// 3. 一定相等,结果为true

System.out.println(s3 == s4);

intern的副作用

  1. 需要开发者显式调用,使用不方便
  2. 很难保证效率,因为开发者难以清楚字符串的重复率,最终可能导致代码的污染。

字符串排重

Oracle JDK 8u20后推出了基于G1 GC下的字符串排重。

  • 原理:将相同数据的字符串指向同一份数据。

  • 实现:

    1.开启G1 GC(-XX:+UseG1GC)

    2.开启字符串排重功能(-XX:+UseStringDeduplication)

intrinsic机制

  • 是一种利用native方法,hard-coded(硬编码)的逻辑,
  • 一种特殊的内联(intrinsic-内在的)。
  • 很多优化还是需要直接使用特定的CPU指令。

问题:字符串如何利用Intrinsic机制优化的?

  1. 字符串的特殊操作运行的都是特殊优化的本地代码
  2. 而不是去运行Java代码生成的字节码

相关文章

网友评论

      本文标题:Java之String总结

      本文链接:https://www.haomeiwen.com/subject/watizqtx.html