[Effective Java 3/e] 아이템 6 - 불필요한 객체 생성을 피하라
아이템 6 - 불필요한 객체 생성을 피하라
//따라 하지 말 것
String s = new String("bikini");
//개선 된 버전
String s = "bikini"; // 같은 가상 머신 안에서 이와 똑같은 문자열 리털을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다.
값비싼 정규 표현식
static boolean isRomanNumeric(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
- String.matches는 내부에서 정규표현식용 Pattern 인스턴스는, 한 번 쓰고 버려진다.
값비싼 객체를 재사용해 성능을 개선
public class RomanNumerals {
private static final Pattern ROMAN = Pattern.compile(
"^(?=.)M*(C[MD]|D?C{0,3})"
+ "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
static boolean isRomanNumeric(String s) {
return ROMAN.matcher(s).matches();
}
}
- Pattern 인스턴스를 클래스 초기화(정적 초기화) 과정에서 직접 생성해 캐싱
- isRomanNumeral 메서드가 호출될 때마다 인스턴스 재사용
의도치 않은 오토박싱
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++){
sum += i;
}
return sum;
}
- sum 변수를 long 이 아닌 Long 으로 선언해서 불필요한 Long 인스턴스가 만들어진다.
- long 타입인 i가 Long 타입인 sum에 더해질 때마다
- 박싱된 기본 타입 보다는 기본 타입을 사용하고, 의도치 않은 오토박싱에 주의해야 함