자바가 문자열 리터럴로 연산을 최적화합니까? 예를 들어,java는 문자열 리터럴 toLowerCase()를 최적화합니까?
"literal".toLowerCase()
항상 새 문자열 인스턴스를 만드시겠습니까?
자바가 문자열 리터럴로 연산을 최적화합니까? 예를 들어,java는 문자열 리터럴 toLowerCase()를 최적화합니까?
"literal".toLowerCase()
항상 새 문자열 인스턴스를 만드시겠습니까?
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
}
...
}
나는 OP가 이것이 컴파일시에 "리터럴";로 최적화 될 것인지 알고 싶다고 믿는다. 어느 것이 로케일에 의존 하느냐에 따라 복잡해질 것입니다 ...;) – AxelH
@AxelH 음, OP는 질문의 스 니펫이 "항상 새로운 문자열 인스턴스를 생성"하는지 물어 보았습니다. 나는 대답했다. – Eran
@AxelH - 그 대답은 * 예 * – TheLostMind
첫째, 나는이 지정되지 않은 생각 때문에 행동의 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
....
직접 테스트하지 않으시겠습니까? 쉬운 테스트 일 수 있었 겠지? – Lino
당신은 더 중요한 것들을 걱정해야합니다. – EJP
"최적화"를 정의 할 수 있습니까? 그리고 이것이 "최적화"되어 있는지보고 싶을 때 – AxelH