문자열
정규식, Pattern
생성 비용이 비싼 객체라서 반복해서 생성하기 보다, 캐싱하여 재사용하는 것이 좋다.
// 값비싼 객체를 재사용해 성능을 개선한다. (32쪽)
public class RomanNumerals {
// 코드 6-1 성능을 훨씬 더 끌어올릴 수 있다!
static boolean isRomanNumeralSlow(String s) {
return s.matches("^(?=.)M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
}
// 코드 6-2 값비싼 객체를 재사용해 성능을 개선한다.
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 isRomanNumeralFast(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 < 100; j++) {
//TODO 성능 차이를 확인하려면 xxxSlow 메서드를 xxxFast 메서드로 바꿔 실행해보자.
result = isRomanNumeralSlow("MCMLXXVI");
}
long end = System.nanoTime();
System.out.println(end - start);
System.out.println(result);
}
}
오토박싱 (auto boxing)[primitive → Wrrapper]
기본 타입(int)을 그게 상응하는 박싱된 기본 타입(Integer)으로 상호 변환해주는 기술.
기본 타입과 박싱된 기본 타입을 섞어서 사용하면 변환하는 과정에서 불필요한 객체가 생성될 수 있다.
public class Sum {
private static long sum() {
// TODO Long을 long으로 변경하여 실행해 보세요.
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.nanoTime();
long x = sum();
long end = System.nanoTime();
System.out.println((end - start) / 1_000_000. + " ms.");
System.out.println(x);
}
}
객체 생성은 비싸니 피하라.”는 뜻으로 오해하면 안 된다
p31, 사용 자제 API (Deprecation)
public class Deprecation {
/**
* @deprecated in favor of
* {@link #Deprecation(String)}
*/
@Deprecated(forRemoval = true, since = "1.2")
public Deprecation() {
}
private String name;
public Deprecation(String name) {
this.name = name;
}
}
p32, 정규 표현식
내부적으로 Pattern이 쓰이는 곳
String.matches(String regex)
String.split(String regex)
String.replace*(String regex, String replacement)
public class RegularExpression {
private static final Pattern SPLIT_PATTERN = Pattern.compile(",");
public static void main(String[] args) {
long start = System.nanoTime();
for (int j = 0; j < 10000; j++) {
String name = "keesun,whiteship";
name.split(","); // regax 가 1글자 일때는 더 유리하다.
// SPLIT_PATTERN.split(name);
}
System.out.println(System.nanoTime() - start);
}
}
p32, 한 번 쓰고 버려져서 가비지 컬렉션 대상이 된다.