JDK 소스 코드 분석:java.lang.String

최근 에 JDK 소스 코드 를 보기 시 작 했 는데 너무 게 으 르 면 안 돼 요~주석 이 상세 하고(영어 지만)일부 코드 도 복잡 하지 않 아 요.간단하게 골 라 봐.버 티 기 위해 블 로그 에 기록 을 쓰 는 것 은 기억 을 위 한 것 이 고,다른 하 나 는 자신 에 게 버 티 는 이 유 를 주 는 것 입 니 다~와 찰 칵,영어 가 좋 은 편 은 아 닙 니 다.그럼 중국어 API 를 보고 같이 보 세 요.
String 구조
이런 종류의 구 조 는 매우 간단 하 다.
/** The value is used for character storage. */
    private final char value[];
 
    /** The offset is the first index of the storage that is used. */
    private final int offset;
 
    /** The count is the number of characters in the String. */
    private final int count;

char 배열 로 문 자 를 저장 한 다음 offset 은 오프셋 입 니 다.count 는 String 의 길이 입 니 다.String 클래스 가 final 인 것 을 알 고 계승 할 수 없 으 며 private final char value[];한 번 만 할당 할 수 있 습 니 다.할당 후 변경 할 수 없습니다.String 대상 을 새로 만 듭 니 다.
public String concat(String str)
    public String concat(String str) {
	int otherLen = str.length();
	if (otherLen == 0) {
	    return this;
	}
	char buf[] = new char[count + otherLen];
	getChars(0, count, buf, 0);
	str.getChars(0, otherLen, buf, count);
	return new String(0, count + otherLen, buf);
    }

이 코드 는 두 개의 String 을 연결 하 는 것 입 니 다.먼저 char 배열 을 용기 로 하고 this 와 str 에서 각각 char 를 꺼 내 buf 에 넣 습 니 다.getChars 방법의 네 번 째 매개 변 수 를 주의 하 십시오.이것 은 buf 가 count 개 부터 복사 한 다 는 것 입 니 다.즉,두 string 의 char 를 하나의 char 배열 에 넣 고 새로운 String 대상 을 되 돌려 주 는 것 이다.(이전의 String 은 바 꿀 수 없 기 때 문)
public int indexOf(String str, int fromIndex)
 public int indexOf(String str, int fromIndex) {
        return indexOf(value, offset, count,
                       str.value, str.offset, str.count, fromIndex);
    }
 
    //source   ,sourceOffset   ,sourceCount   
    //target      ...
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
                       char[] target, int targetOffset, int targetCount,
                       int fromIndex) {
        //  fromIndex      ( 0  ),          0,          ,    -1
	if (fromIndex >= sourceCount) {
            return (targetCount == 0 ? sourceCount : -1);
	}
    	if (fromIndex < 0) {
    	    fromIndex = 0;
    	}
        //  fromIndex     ,        0,    fromIndex
	if (targetCount == 0) {
	    return fromIndex;
	}
 
        //        
        char first  = target[targetOffset];
        int max = sourceOffset + (sourceCount - targetCount);
 
        //       
        for (int i = sourceOffset + fromIndex; i <= max; i++) {
            /*           */
            if (source[i] != first) {
                while (++i <= max && source[i] != first);
            }
 
            /*         ,        */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetCount - 1;
                for (int k = targetOffset + 1; j < end && source[j] ==
                         target[k]; j++, k++);
 
                if (j == end) {
                    /*   j  end,            ,     */
                    return i - sourceOffset;
                }
            }
        }
        return -1;
    }

index Of 는 검색 방법 만 보면 첫 번 째 를 찾 은 다음 나머지 와 일치 합 니 다.
public boolean equals(Object anObject)
public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

비교 char~~
replace 와 replace All
 public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
            this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
    }
 
    public String replaceAll(String regex, String replacement) {
	return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

이 두 마디 는 정말 짧다.정규 표현 식 으로 바 뀌 었 습 니 다.그들의 차 이 를 알 수 있다.replace 는 일반 문자 의 교체 만 지원 합 니 다.Pattern.LITERAL 은 모드 를 사용 하 는 글자 값 분석 을 말 합 니 다.Matcher.quoteReplacement(str)은 지정 한 String 의 글자 값 을 String 으로 바 꿉 니 다.이 방법 은\\\를\\\\(네 개의 역 슬 래 쉬)로 바 꾸 고$를\\\$로 바 꾸 는 것 이다.이렇게 하면 정규 표현 식 을 사용 할 수 없 지만,여전히 replace All 을 보고 모든 것 을 교체 합 니 다.replace All 의 간단 한 정규 표현 식 사용~~원본 문자열 이 바 뀐 후에 내용 이 변 하지 않 았 음 을 주의해 야 합 니 다.예 를 들 면 다음 과 같다. 출처 String src=new String("ab43a2c43d");System.out.println(src.replace(“3″,”f”));=>ab4f2c4fd. System.out.println(src.replace(’3′,’f'));=>ab4f2c4fd. System.out.println(src.replaceAll(“\\d”,”f”));=>abffafcffd. System.out.println(src.replaceAll(“a”,”f”));=>fb43fc23d. System.out.println(src.replaceFirst(“\\d,”f”));=>abf32c43d System.out.println(src.replaceFirst(“4″,”h”));=>abh32c43d.

좋은 웹페이지 즐겨찾기