Java字符串是否根据其构造方式不同地存储在堆中?

时间:2018-07-30 05:50:37

标签: java string jvm java-10 jnienv

我正在使用JNI技术对本机方法进行建模的代码库上。

这是用于java.lang.String#equals(Object)

的本机对等方法的片段
@MJI
public boolean equals__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int argRef) {

    ElementInfo s1 = heap.get(objRef); // this
    ElementInfo s2 = heap.get(argRef);

    Fields f1 = heap.get(s1.getField("value")).getFields();
    Fields f2 = heap.get(s2.getField("value")).getFields();

    char[] c1 = ((CharArrayFields) f1).asCharArray();
    char[] c2 = ((CharArrayFields) f2).asCharArray();

这在Java 8上工作正常。但是在Java 9及更高版本中,为字符串的value字段返回的值是char[]byte[]

由于JEP 254: Compact Strings

中的更改,我希望它返回一个byte []数组。

例如:

char[] chars = new char[] {'a','b','c', 'd'};
String str1 = new String(chars))
"str2".equals(str1);

这里,在对等方法中,我得到了str1的char数组和"str2"的字节数组。这是因为字符串在堆中的存储方式不同吗?


仅供参考:

这是我实际上正在处理的代码。我正在尝试使其与Java 9及更高版本兼容:

jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_lang_String.java#L166-L200

您可能会看到valueField被强制转换为CharArrayFields。但是当在Java“ 10.0.1”上运行时,valueField有时是一个CharArrayFields,有时是一个ByteArrayFields。

0 个答案:

没有答案