StringJoiner에 해당하는 글 1

구분자와 문자열 추가 StringJoiner

JAVA|2021. 8. 26. 21:47

Effective Java에서 바로  StringBuffer, StringBuilder는 관련해서 나오는 이야기는 두가지 정도로 기억한다.

 

첫번째는 "text" + "text" 연산보다 StringBuffer, StringBuilder 가 좋은 이유는 +연산마다 새로운 객체를 생성되기 때문에 많은 문자열 더하기를 할때는 계속 불필요한 객체생성되는 + 연산보다는 StringBuffer, StringBuilder 를 사용하라

 

두번째는 StringBuffer는 append()시에 락(synchronized)을 잡기 때문에 여러 스레드에서 같은 StringBuffer 객체를 공유해서 써야하는경우(이런 경우를 지금까지는 보지 못했다..)아니고서는 락을 잡는것은 낭비이기 때문에 락(synchronized)을 잡지 않는 StringBuilder를 사용하라

 

 

StringBuffer.append()
StringBuilder.append()

 

보통 로깅을 한다거나, 문자열 붙이기를 할때

문자열 사이에 라인변경(\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);
        });

StringJoiner.add(), 여기서 elts는 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

댓글()