程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> String構造器中originalValue.length)size 發生的情況

String構造器中originalValue.length)size 發生的情況

編輯:C++入門知識

最近在看Jdk6中String的源碼的時候發現String的有個這樣的構造方法,源代碼內容如下:

public String(String original) {
	int size = original.count;
	char[] originalValue = original.value;
	char[] v;
  	if (originalValue.length > size) {
            int off = original.offset;
            v = Arrays.copyOfRange(originalValue, off, off+size);
 	} else {
	    v = originalValue;
 	}
	this.offset = 0;
	this.count = size;
	this.value = v;
    }

這時就對originalValue.length > size這個不解啊。故網上搜尋原因。發現在stackoverflow上有人提到這個問題。還有個國內的文章也說了這個問題。

1 http://stackoverflow.com/questions/12907986/how-could-originalvalue-length-size-happen-in-the-string-constructor

2 http://www.kankanews.com/ICkengine/archives/99041.shtml

看了上面的兩篇文章的說明,我徹底的明白了。原來是這樣啊。來看看jdk6中String的subString方法。

public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }

// Package private constructor which shares value array for speed.
    String(int offset, int count, char value[]) {
	this.value = value;
	this.offset = offset;
	this.count = count;
    }

看看上面的源碼,發現使用substring方法後新的String對象的字符數組還是原來對象的字符數組。這樣就出現了originalValue.length > size這個問題。如

  String s1="hello world";
  String s2=s1.substring(6);
  String s3=new String(s2);
        
分析上面的代碼 s2的屬性char[] value任然是原來s1的屬性char[] value={'h','e','l','l','o',' ','w','o','r','l','d'}。s2的屬性offset為6,count為5.在new String(s2)時originalValue.length=11>count=5。故我們可知在這樣的情況下會出現本文討論的問題。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved