Javadoc说:
String类表示字符串。 Java程序中的所有字符串文字,例如" abc",都是作为此类的实例实现的。
我们知道String
类有两个属性:value[]
和hash
,字符串文字存储在字符串池中。
但是在放入该池之前,我无法找出如何初始化字符串文字。就像我稍后调试字符串文字一样,我可以看到value[]
和hash
以某种方式填充。
JVM是否会调用特殊指令?
答案 0 :(得分:4)
JVM在constant pool resolution期间创建一个新的字符串文字对象,如果在String.intern
调用之前尚未将相同的字符串放入字符串表中。
没有指定JVM如何创建和初始化此类字符串,因此只要结果对象是可以从应用程序代码访问的常规java.lang.String
实例,JVM就可以执行任何操作。
对于HotSpot JVM,它不调用任何String
构造函数,它只是在Heap中分配一个新对象并填写C ++代码中的字段,请参阅java_lang_String::basic_create
:
Handle java_lang_String::basic_create(int length, TRAPS) {
assert(initialized, "Must be initialized");
// Create the String object first, so there's a chance that the String
// and the char array it points to end up in the same cache line.
oop obj;
obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
// Create the char array. The String object must be handlized here
// because GC can happen as a result of the allocation attempt.
Handle h_obj(THREAD, obj);
typeArrayOop buffer;
buffer = oopFactory::new_charArray(length, CHECK_NH);
// Point the String at the char array
obj = h_obj();
set_value(obj, buffer);
// No need to zero the offset, allocation zero'ed the entire String object
assert(offset(obj) == 0, "initial String offset should be zero");
//set_offset(obj, 0);
set_count(obj, length);
return h_obj;
}
此新对象的 hash
字段初始化为零。正确的哈希码将在第一次调用String.hashCode
时计算。
答案 1 :(得分:0)
JVM是否会调用特殊指令?
没有。没有“特殊”JVM指令可以做到这一点。
类加载基础结构很可能是使用String
构造函数之一创建与文字对应的String对象;例如String(char[])
或String(byte[])
。它将从“.class”文件中的“常量池”区域获取字符或字节。
答案 2 :(得分:-2)
关注public String(char value[])
班级String
的断点。
修改:无论是谁投票:
首先,你是否按照答案尝试?我试过了,它完全停止在那个方法中。我尝试过两种不同的IDE。
其次,在该方法中分配value
成员(如OP中所指)。如果你真的尝试过,那你就得到了。第三,hash
成员(如OP中所指)在hashCode()
的调用中被分配了一个值,并且hash
成员被赋予了一个值。
1)如何初始化String文字
和
2)......以某种方式填充