JDK9 团队努力帮助我们删除非公共依赖项(使用 jdeps
)。我正在使用Unsafe
类来更快地访问String
的内部char
数组 - 而无需创建新的 char 数组。如果我想放弃对类Unsafe
依赖,我需要动态加载它并使用反射调用Unsafe.getObject
和其他方法。
我想知道表演:现在当我用Unsafe
反射时,这与String.toCharArray
表演如何匹配?继续使用Unsafe
有意义吗?
我假设 JDK>= 7。
编辑
是的,我完全知道每个人都可以使用例如JMH编写这些测试;但是使用不同的输入和不同的VM版本(7,8)进行测量需要花费大量时间。所以我想知道是否有人已经这样做了;因为许多图书馆正在使用Unsafe
.
- 在
- Java 9版本的
String
中,有可能根本没有后备char[]
数组,参见JEP 254。也就是说,toCharArray()
将是你唯一的选择。 - 通常,除非您绝对确定有必要,否则切勿使用
Unsafe
API。但既然你问这个问题,我想你不是。在我的笔记本电脑上,100 个字符的字符串在 25 纳秒内完成toCharArray()
,即我可以每秒调用 4000 万次!你真的有这样的工作量吗? - 如果绝对需要,请使用 MethodHandles,而不是"反射"和"不安全"。MethodHandles与直接字段访问一样快,但与
Unsafe
不同的是,它们是公共的,受支持和安全的API。