구분자와 문자열 추가 StringJoiner
Effective Java에서 바로 StringBuffer, StringBuilder는 관련해서 나오는 이야기는 두가지 정도로 기억한다.
첫번째는 "text" + "text" 연산보다 StringBuffer, StringBuilder 가 좋은 이유는 +연산마다 새로운 객체를 생성되기 때문에 많은 문자열 더하기를 할때는 계속 불필요한 객체생성되는 + 연산보다는 StringBuffer, StringBuilder 를 사용하라
두번째는 StringBuffer는 append()시에 락(synchronized)을 잡기 때문에 여러 스레드에서 같은 StringBuffer 객체를 공유해서 써야하는경우(이런 경우를 지금까지는 보지 못했다..)아니고서는 락을 잡는것은 낭비이기 때문에 락(synchronized)을 잡지 않는 StringBuilder를 사용하라
보통 로깅을 한다거나, 문자열 붙이기를 할때
문자열 사이에 라인변경(\n)을 추가하거나, 콤마(,) 를 자주 추가하곤했는데
간단한 코드지만 중간에 구분자를 넣는작업은 귀찮긴 했습니다.
그래서 guava의 Joiner를 많이 사용했었는데
JDK8에 StringJoiner로 대체할수 있습니다.
StringBuilder로 추가 문자열마다 라인변경을 한다고 했을때
(첫번째 추가할때는 구분자를 넣지 않고, 첫번째가 아니라면 구분자 추가)
ArrayList<String> strings = Lists.newArrayList("name1", "name2", "name3");
final StringBuilder stb = new StringBuilder();
strings.forEach(string -> {
stb.append(string);
if (stb.length() != 0) {
stb.append("\n");
}
});
StringJoiner로 추가 문자열마다 라인 변경을 한다고 했을때 생성자에 구분자("\n")넣고 add로 문자열을 붙인다
StringJoiner는 생성자가 두종류, (구분자) , (구분자, Prefix, Suffix)
ArrayList<String> strings = Lists.newArrayList("name1", "name2", "name3");
final StringJoiner joiner = new StringJoiner("\n");
strings.forEach(string -> {
joiner.add(string);
});
동작이 조금 다른건 전달받은 String을 StringBuilder는 byte[] 로 관리, StringJoiner는 String[]로 관리
StringJoiner의 경우 추가한 문자열에대해서만 String[]에 추가하고, del의 경우는 추가로 저장하고 있는것은 아니기 때문에
메모리를 적게 먹을것이고,
StringBuilder의 경우 del이나 Prefix, Suffix 구분이 딱히 없어서 일반 추가한 문자열 취급을 하기 때문에
bytes에 추가될것임
문자를 붙일때마다, 구분자가 필요하거나 Prefix, Suffix가 필요한경우
StringJoiner를 사용하는것이 여러모로 유리하다고 생각합니다.
'JAVA' 카테고리의 다른 글
ActiveMQ JDK Version (0) | 2020.09.09 |
---|---|
DCL(Double Checked Locking) (0) | 2020.09.08 |
Java Stream (0) | 2020.07.14 |
Java Time (0) | 2020.07.06 |
SortedQueue... (0) | 2020.07.02 |