같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 것이 좋을 때가 많이 있다.
String 객체를 예로 보면
String s = new String("bikini");
String s = "bikini";
생성자 대신 정적 팩토리 메소드를 사용해 불필요한 객체 생성을 피할 수 있다. (ex: Boolean 생성자 보다는 Boolean.valueOf(String) 팩토리 메소드)
정규표현식은 생성비용이 비싼 객체중 하나이다.
static boolean isRomanNumeral(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
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 isRomanNumeral(String s) {
return ROMAN.matcher(s).matches();
}
}
public static void main(String[] args) {
boolean result = false;
long start = System.nanoTime();
for (int j = 0; j < 1000; j++) {
result = isRomanNumeral("MCMLXXVI");
}
long end = System.nanoTime();
System.out.println(end - start);
System.out.println(result);
}
개선 전 | 개선 후 |
---|---|
40421200 ns | 5786600 ns |
오토 박싱은 기본 타입과 박싱된 타입 사이을 자동으로 변환 해주는 기술이다.
(ex: long <-> Long)
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
private static long sum() {
long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
long x = sum();
long end = System.currentTimeMillis();
System.out.println((end - start) + " ms.");
}
개선 전 | 개선 후 |
---|---|
10217 ms | 829 ms |