Java字符串是否根据它们的构造方式以不同方式存储在堆中?

Gay*_*tti 5 java string jvm jnienv java-10

我正在开发一个代码库,它使用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();
Run Code Online (Sandbox Code Playgroud)

这在Java 8上运行良好.但是在Java 9及更高版本中,valueString字段返回的值是char[]或者byte[]

我希望它返回一个byte []数组,因为在JEP 254:Compact Strings中进行了更改


例如:

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

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


供参考:

这是我正在实际工作的代码.我正在尝试使用Java 9及更高版本:

JPF核/ SRC /对等方/ GOV/NASA/JPF/VM/JPF_java_lang_String.java#L166-L200

正如你可能看到的那样,valueField有人向CharArrayFields施展.但是当在Java"10.0.1"上运行时,valueField有时是CharArrayFields,有时候是ByteArrayFields.