똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 것이 좋다.
String 생성
String s = new String("bikini"); // 1.잘못된 코드
String s1 = "bikini"; // 2.개선된 코드
정적 팩터리 메서드
Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩터리 메서드를 사용하는 것이 좋음
→ 생성자는 호출할 때마다 새로운 객체를 만들지만 정적 팩터리 메서드는 그렇지 않음
정규 표현식
static boolean isRomanNumeral(String s){
return s.matches("정규식");
}
String.matches가 내부에서 만드는 정규표현식용 Pattern 인스턴스는, 한번 쓰고 버려져서 곧바로 gc 대상이 됨
성능 개선을 위해서, 필요한 정규표현식을 표현하는 불변인 Pattern 인스턴스를 캐싱하여 사용해야 함
public class RomanNumerals{
private static final Pattern ROMAN = Pattern.compile("~~");
static boolean isRomanNumeral(String s){
return ROMAN.matcher(s).matches();
}
}
→ 클래스가 초기화된 후 메서드를 한번도 호출하지 않으면 ROMAN 필드는 쓸데없이 초기화된 것이 됨
→ 위 문제를 지연 초기화를 통해 해결할 수 있지만 코드가 복잡해지고, 성능은 크게 개선되지 않는 경우가 많아 권하지 않음
오토박싱 (auto boxing)
프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 상호 변환해주는 기술
박싱된 기본 타입보다는 기본 타입을 사용하고, 의도치 않은 오토박싱 사용을 주의하자
private static long sum(){
Long sum = 0L;
for(long i = 0; i<= Integer.MAX_VALUE; i++){
sum+=i;
}
return sum;
}
Map<String, Integer> map = new HashMap<>();
map.put("도끼", 3);
map.put("활",1);
Set<String> set1 = map.keySet();
Set<String> set2 = map.keySet();
set1.remove("도끼");
System.out.println(set1.size()); // 1
System.out.println(set2.size()); // 1 (2라고 생각할 수도!)
→ 주의해서 사용하자!