java6中subString方法其实还是引用调用者的char[],只是修改了offset和count的位置,这导致了public String(String original)方法中加了一个判断:
public String(String original) {
int size = original.count;
char[] originalValue = original.value;
char[] v;
if (originalValue.length > size) {
// The array representing the String is bigger than the new
// String itself. Perhaps this constructor is being called
// in order to trim the baggage, so make a copy of the array.
int off = original.offset;
v = Arrays.copyOfRange(originalValue, off, off+size);
} else {
// The array representing the String is the same
// size as the String, so no point in making a copy.
v = originalValue;
}
this.offset = 0;
this.count = size;
this.value = v;
}
在java7中修改了subString的方法,只要调用subString(),都返回一个新的字符串,于是把public String(String original)中的判断去掉了:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
那么对于String s=new String("hello"),这段代码,在jdk7的环境下,其实只有一个char[]数组吗?在常量池中?使用javap -verbose -c分析了字节码文件,可以肯定调用的就是String(String original)方法。
自顶一下,其实无论在java6还是在java7下,都是只有一个char[],使用new String()这种方式无非是在堆里面有一个新的对象,这个对象持有一个引用指向常量池中的char[]。可以使用java -Xmx16m来限制堆大小,然后使他OOM,一个超过10k的字符串就可以用来测试了。在eclipse中debug的时候,看到直接赋值的方式String s="hello",可以直接看到s的hash值,而且调用s.hashcode(),会直接return,而使用new String()这种方式,调用hashcode()方法的时候,会从char[]最后一个字符开始,一直计算到第一个,然后得到hash值。有兴趣的同学可以试一试,可是在String(String original)方法中,明明将original.hash赋给新对象的hash,为什么还要执行一次计算呢??很是疑惑
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。