2017-10-30 3 views
3

자바가 문자열 리터럴로 연산을 최적화합니까? 예를 들어,java는 문자열 리터럴 toLowerCase()를 최적화합니까?

"literal".toLowerCase() 

항상 새 문자열 인스턴스를 만드시겠습니까?

+1

직접 테스트하지 않으시겠습니까? 쉬운 테스트 일 수 있었 겠지? – Lino

+2

당신은 더 중요한 것들을 걱정해야합니다. – EJP

+0

"최적화"를 정의 할 수 있습니까? 그리고 이것이 "최적화"되어 있는지보고 싶을 때 – AxelH

답변

4

toLowerCase()toLowerCase(Locale.getDefault())입니다.

어떤 문자가 변경 될 필요가없는 경우 원래 String이 반환되는 것을 볼 수 있습니다 구현을 보면 :의

public String toLowerCase(Locale locale) { 
    if (locale == null) { 
     throw new NullPointerException(); 
    } 

    int firstUpper; 
    final int len = value.length; 

    /* Now check if there are any characters that need to be changed. */ 
    scan: { 
     for (firstUpper = 0 ; firstUpper < len;) { 
      char c = value[firstUpper]; 
      if ((c >= Character.MIN_HIGH_SURROGATE) 
        && (c <= Character.MAX_HIGH_SURROGATE)) { 
       int supplChar = codePointAt(firstUpper); 
       if (supplChar != Character.toLowerCase(supplChar)) { 
        break scan; 
       } 
       firstUpper += Character.charCount(supplChar); 
      } else { 
       if (c != Character.toLowerCase(c)) { 
        break scan; 
       } 
       firstUpper++; 
      } 
     } 
     return this; // the original String is returned 
    } 
    ... 
} 
+0

나는 OP가 이것이 컴파일시에 "리터럴";로 최적화 될 것인지 알고 싶다고 믿는다. 어느 것이 로케일에 의존 하느냐에 따라 복잡해질 것입니다 ...;) – AxelH

+0

@AxelH 음, OP는 질문의 스 니펫이 "항상 새로운 문자열 인스턴스를 생성"하는지 물어 보았습니다. 나는 대답했다. – Eran

+0

@AxelH - 그 대답은 * 예 * – TheLostMind

2

첫째, 나는이 지정되지 않은 생각 때문에 행동의 JDK 사이에 다를 수 있습니다.

그러나 Oracle JDK 1.8.0_131에서 String.toLowerCase (Locale) 소스 코드를 살펴보면 아무 문자도 바꿀 필요가없는 경우 문자열 자체를 반환하는 검사가 있음을 알 수 있습니다.

/* Now check if there are any characters that need to be changed. */ 
scan: { 
    for (firstUpper = 0 ; firstUpper < len;) { 
     // Basically 
     if(characterNeedsToBeChanged) { 
      break scan; 
     } 
    } 
    return this; 
} 
... 
// Create a new string 
....