none
String.SubString()效率的问题 RRS feed

  • 问题

  • 我们知道String类型在内存中是永远不会变的,这样做对很多情况下都有优化,请问String.SubString()是不是也有这样的优化,即SubString()直接改变低层的指针,而不会重新分配一个新的内存?
    2011年6月3日 1:52

答案

  • 如果subString的内容就是完整的原字符串,那么返回原String对象;否则,就会创建一个新的 String对象,但是这个String对象貌似使用了原String对象的char[]。我们通过String的构造函数确认这一点: 这里用到的String的构造函数是private的

    private String(int offset, int count, char value[])

    { this.value = value;

    this.offset = offset;

    this.count = count; }

    为了避免内存拷贝、加快速度,Sun JDK直接复用了原String对象的char[],偏移量和长度来标识不同的字符串内容。也就是说,subString出的来String小对象仍然会指向原String大对象的char[]


    Ellis_Wong
    • 已标记为答案 Flysha 2011年6月7日 1:55
    2011年6月3日 2:36
  • 会创建一个新的字符串对象。看字符串池的概念。
    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    • 已标记为答案 Flysha 2011年6月7日 1:55
    2011年6月6日 0:13
    版主

全部回复

  • 如果subString的内容就是完整的原字符串,那么返回原String对象;否则,就会创建一个新的 String对象,但是这个String对象貌似使用了原String对象的char[]。我们通过String的构造函数确认这一点: 这里用到的String的构造函数是private的

    private String(int offset, int count, char value[])

    { this.value = value;

    this.offset = offset;

    this.count = count; }

    为了避免内存拷贝、加快速度,Sun JDK直接复用了原String对象的char[],偏移量和长度来标识不同的字符串内容。也就是说,subString出的来String小对象仍然会指向原String大对象的char[]


    Ellis_Wong
    • 已标记为答案 Flysha 2011年6月7日 1:55
    2011年6月3日 2:36
  • 谢谢!我也是这样想的,不过这里是使用的.NET,您为什么又提到Sun JDK呢?
    2011年6月5日 10:20
  • 会创建一个新的字符串对象。看字符串池的概念。
    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    • 已标记为答案 Flysha 2011年6月7日 1:55
    2011年6月6日 0:13
    版主