2014-08-27 3 views
2

는 내가 equalsIgnoreCase 방법에서 특히, 자바 SE7 String 클래스의 디 컴파일 된 소스를 찾고 어떤 이상한로 생각 난 것은 (while 루프에서 수행 생략 현지 바르) 다음 줄을이었다 :String.equalsIgnoreCase가 왜 개별 문자의 대문자와 소문자 버전을 비교합니까?

if (((c1 = this.value[(o1++)]) != (c2 = target[(o2++)])) 
    && (toUpperCase(c1) != toUpperCase(c2)) 
    && (toLowerCase(c1) != toLowerCase(c2))) { 
     return false; 
} 

그리고 왜 c1과 c2가 대문자와 소문자 형식 모두에서 비평 행성을 검사하는지 궁금했습니다. 분명히 대문자 비교가 동일하다면, 소문자는 결코 도달하지 않을 것입니다 ... 그러나 이것으로부터, 대문자 (c1)! = 대문자 (c2)와 문자가 여전히 동일 할 때가 있다고 믿게되었습니다 소문자로 비교했다.

제안 사항?

+0

일부 비 라틴 문자는 대문자와 소문자를 구분하지 않을 수도 있고, 그 반대의 경우도있을 수 있습니까? 어쨌든 좋은 질문입니다. – Mena

+0

@ 메나 - 실제로는 좋지 않습니다. 1) 그것은 중복이다. 2) 대답은 소스 코드 주석에 있으며, 소스 코드는 여러 곳에서 자유롭게 사용할 수 있습니다. –

+0

@StephenC 죄송합니다. 내 숙제를 했어야 했어. – Mena

답변

2

this link에서 일부 대문자와 소문자가 일치하지 않는 로케일이있는 것 같습니다. 사용 된 예는 터키어입니다.

if (x.toLowerCase().equals("list")) 

x="LIST"에 대해 true를 반환하지 않습니다.

그런 경우가 여러 개있을 것으로 추측됩니다. 따라서 옵션은 다른 딸꾹질을 많이 만들거나 두 경우를 비교할 가능성이있는 로케일을 지정하는 것입니다. 그래서 기본적으로 문자가 하나의 경우에 동일 할 수가 아닌 다른

3

equalsIgnoreCase에 대한 실제 자바 소스 코드는 다음과 같다 사례가 :

public boolean equalsIgnoreCase(String anotherString) { 
    return (this == anotherString) ? true 
      : (anotherString != null) 
      && (anotherString.value.length == value.length) 
      && regionMatches(true, 0, anotherString, 0, value.length); 
} 

당신이 regionMatches에 대해 얘기 코드, 여기에 관련된 부분은 원래 의견 완료 :

 if (ignoreCase) { 
      // If characters don't match but case may be ignored 
      // try converting both characters to uppercase. 
      // If the results match, then the comparison scan should 
      // continue. 
      char u1 = Character.toUpperCase(c1); 
      char u2 = Character.toUpperCase(c2); 
      if (u1 == u2) { 
       continue; 
      } 
      // Unfortunately, conversion to uppercase does not work properly 
      // for the Georgian alphabet, which has strange rules about case 
      // conversion. So we need to make one last check before 
      // exiting. 
      if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) { 
       continue; 
      } 
     } 

학습 : 실제 소스 코드 FRE 때 디 컴파일 코드를보고 시간을 낭비하지 마십시오 사용할 수 있습니다 ... 자바 라이브러리와 마찬가지입니다. 사실, 자바 라이브러리의 소스 코드는 JDK에 포함되어있다.

참고 :

관련 문제