开发者社区> 问答> 正文

走火入魔了,求解救,java String

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)方法。

展开
收起
爵霸 2016-06-08 08:10:55 2178 0
1 条回答
写回答
取消 提交回答
  • 自顶一下,其实无论在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,为什么还要执行一次计算呢??很是疑惑

    2019-07-17 19:31:04
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载