|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。
在Java/C#如许基于援用语义处置字符串的言语中,作为不成变对象存在的字符串,假如内容不异,则能够经由过程某种机制完成重用。由于对这类言语来讲,指向内存中两块内存地位分歧内容不异的字符串,与同时指向一个字符串并没有任何区分。出格是对大批利用字符串的XML文件剖析相似场所,如许的优化可以很年夜水平上下降程序的内存占用,如SAX剖析引擎尺度中就专门界说了一个http://xml.org/sax/features/string-interning特征用于字符串重用。
在言语层面,Java/C#中都间接供应了String.Intern的撑持。而对Java来讲,完成上的十分相似。由String.intern办法,将以后字符串之内容为键,对象援用为值,放进一个全局性的哈希表中。
代码:
//
//java/lang/String.java
//
publicfinalclassString
{
//...
publicnativeStringintern();//利用JNI函数完成以保证效力
}
//
//hotspot/src/share/vm/prims/jvm.cpp
//
JVM_ENTRY(jstring,JVM_InternString(JNIEnv*env,jstringstr))
JVMWrapper("JVM_InternString");
if(str==NULL)returnNULL;
oopstring=JNIHandles::resolve_non_null(str);//将援用剖析为外部句柄
oopresult=StringTable::intern(string,CHECK_0);//举行实践的字符串intern操纵
return(jstring)JNIHandles::make_local(env,result);//猎取外部句柄的援用
JVM_END
//
//hotspot/src/share/vm/memory/symbolTable.cpp
//
oopStringTable::intern(oopstring,TRAPS)
{
if(string==NULL)returnNULL;
ResourceMarkrm(THREAD);//回护线程资本地区
intlength;
Handleh_string(THREAD,string);
jchar*chars=java_lang_String::as_unicode_string(string,length);//猎取实践字符串内容
oopresult=intern(h_string,chars,length,CHECK_0);//完成字符串intern操纵
returnresult;
}
oopStringTable::intern(Handlestring_or_null,jchar*name,intlen,TRAPS)
{
inthashValue=hash_string(name,len);//起首依据字符串内容盘算哈希值
stringTableBucket*bucket=bucketFor(hashValue);//依据哈希值猎取方针容器
oopstring=bucket->lookup(name,len);//然后检拆字符串是不是已存在
//Found
if(string!=NULL)returnstring;
//Otherwise,addtosymboltotable
returnbasic_add(string_or_null,name,len,hashValue,CHECK_0);//将字符串放进哈希表
}
<p>
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 |
|