-
String s = new String("bikini");
String s = "bikini";
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})$");
}
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
//
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
//
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
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();
}
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
|
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 6 replies
-
이거에 추가적으로 String을 concat할 때 String str = "hello";
str = str + "world"; 이런 식으로 하게되면 매번 새로운 String 인스턴스를 생성하기 때문에 불필요하게 힙메모리를 차지하게 될 수 있음. (물론 GC 될테지만,,) |
Beta Was this translation helpful? Give feedback.
-
keySet()의 결과는 Map에 있는 key를 set의 형태로 변환해서 반환하는 것임. |
Beta Was this translation helpful? Give feedback.
-
String str = "abc"
String str2 = new String("abc"); 위 방식이 아래 방식과 다르게 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용하는 이유에 대해서 찾아보니 String Constant Pool 이라는 저장 공간에 String 객체를 저장하기 때문이라고 알게 되었습니다.
String Constant Pool은 Heap 영역에 존재하지만 new가 아닌 literal로 문자열을 생성한 경우 이미 해당 문자열이 String Pool에 존재한다면 재활용 하기 때문에 하나의 인스턴스를 사용하게 됩니다. 이번 아이템을 통해 단순히 편하다는 이유로 문자열을 literal로 생성하는 습관이 있었지만 해당 방식이 어떠한 장점이 있고 이러한 장점이 되는 이유에 대해 알게 되었습니다. |
Beta Was this translation helpful? Give feedback.
이거에 추가적으로 String을 concat할 때
이런 식으로 하게되면 매번 새로운 String 인스턴스를 생성하기 때문에 불필요하게 힙메모리를 차지하게 될 수 있음. (물론 GC 될테지만,,)
그래서 문자열 변경이 많을 때는 StringBuffer나 StringBuilder 사용 권장.
StringBuffer나 StringBuilder는 내부적으로 char array를 가지고 있어서 그 array에 계속 문자를 담아두는 형태로 동작함.
기본적으로 할당하는 char array size가 정해져있으므로 (문자열 변경이 잦지 않은 경우 비용이 더 클 수 있음) 문자열 변경이 자주 있을 때 사용하는 것이 좋음.
StringBuffer는 StringBuilder와 달리 thread-safe하므로 각 상황에 맞게 적절히 사용하는 것이 필요함.