코딩마을방범대

List 를 String 으로, String 을 List 로 변환하는 방법 본문

💡 백엔드/Java

List 를 String 으로, String 을 List 로 변환하는 방법

신짱구 5세 2023. 7. 28. 16:01
728x90

 

 

String 문자열을 쌓을 때 String을 사용할지, StringBuilder or StringBuffer를 사용할지는 아래 포스트를 참고해서 결정하자!

[Java] String, StringBuffer, StringBuilder의 차이점


 

 

 

List to String

List를 String으로 변환하는 방법을 먼저 알아보면 내가 알기론 5가지가 존재한다!

 

1. forEach (확장 for문)

StringBuilder str1 = new StringBuilder();
for(String str: list){
	str1.append(str);
}

 

2. for문

StringBuilder str2 = new StringBuilder();
for( int i = 0; i < list.size(); i++ ){
	str2.append(list.get(i));
}

 

3. Stream을 사용

// String일 경우
String result = list.stream()
	.map(str-> String.valueOf(str))
	.collect(Collectors.joining());
    
// StringBuilder일 경우
StringBuilder str3 = new StringBuilder();
list.stream()
	.map(str -> str3.append(str))
	.collect(Collectors.joining());

 

4. List 내부 forEach를 사용

StringBuilder str4 = new StringBuilder();
list.forEach(str4::append);

 

5. 외부 라이브러리를 사용

maven 사이트 참고하여 의존성 추가 필요

String str5 = StringUtils.join(list,"");

 

 


 

 

위 방법들을 이용해 사이즈가 800인 list를 String으로 변환했을 때 소요되는 시간을 알아보았다.

결과는 아래와 같다. ( 전부 StringBuilder를 이용함 )

 

속도   :    for문  >>  forEach  >>  List 내부 forEach  >>  라이브러리  >>  stream

** StringBuilder 이용
첫번째 ::: 192000 / 시간 :::0
두번째 ::: 192000 / 시간 :::1
세번째 ::: 192000 / 시간 :::199
네번째 ::: 192000 / 시간 :::2
다섯번째 ::: 192000 / 시간 :::3

 

 

그러나 StringBuilder가 아닌 String을 이용할 경우 아래와 같은 결과가 출력됐다.

( 네번째 방법은 함수를 이용해야하므로 String으로 사용 불가 )

 

역시 StringBuilder가 속도 측면에서 뛰어난 것을 알 수 있었다.

만약 List 요소의 데이터 수정이 필요하지 않다면 stream과 라이브러리를 이용하는 것이 좋을 것 같다.

 

속도   :    라이브러리  >>  stream  >>  forEach  >>  for문

** String 이용
첫번째 ::: 192000 / 시간 :::101
두번째 ::: 192000 / 시간 :::98
세번째 ::: 192000 / 시간 :::5
다섯번째 ::: 192000 / 시간 :::2

 

 


 

 

참고로 List를 이용한 반복문으로 로직을 구성할 땐 forEach문보다 for문이 더 빠르다고 한다!

LinkedList는 forEach문을 사용하는게 확연히 더 빠르지만, ArrayList나 Array의 경우 for문을 통해 get하는 것이 더 빠르다.

ArrayList
- 인덱스 기반의 자료구조이기 때문에 get(int index)를 통해 무작위 접근 가능 → O(1)의 시간복잡도를 가짐
- 삽입, 삭제시 배열을 임시배열에 복사하는 방식이기 때문에 O(N) 복잡도
- 포인터를 저장하지 않아도 되는 배열 (연속된 메모리안에 저장)

LinkedList
- 처음 노드부터 찾으려는 노드까지 순차적으로 탐색해야하므로 최대 O(N)의 시간복잡도를 가짐
- 삽입, 삭제시 이전노드와 다음 노드를 참조하는 상태만 변경하면 되기 때문에 O(1)의 복잡도
- 포인터의 사용으로 저장공간을 많이 차지한다

검색              : ArrayList가 빠름
삽입,삭제      : LinkedList가 빠름

 

 

 

 

 


 

 

 

 

 

String to List

String을 List로 변환하는 방법에도 4가지가 존재한다!

모두 동일한 String 값으로, 10만자리 랜덤 String을 생성하여 테스트하였다.

 

1. forEach (확장 for문)

String[] arr1 = string.split("");
List<String> list1 = new ArrayList<>();
for(String str: arr1){
	list1.add(str);
}

 

2. List addAll

String[] arr2 = string.split("");
List<String> list2 = new ArrayList<>();
list2.addAll(Arrays.asList(arr2));

 

3. Arrays.asList

String[] arr3 = string.split("");
List<String> list3 = new ArrayList<>(Arrays.asList(arr3));

 

4. for문

List<String> list4 = new ArrayList<>();
for( int i = 0; i < string.length(); i++ ){
	list4.add(String.valueOf(string.charAt(i)));
}

 


 

 

위 방법들을 이용해 String을 List로 변환했을 때 소요되는 시간을 알아보았다.

결과는 아래와 같다.

 

속도   :    Arrays.asList  >>  for문  >>  List addAll  >>  forEach

첫번째 ::: 123
두번째 ::: 70
세번째 ::: 24
네번째 ::: 45

 

 

String을 배열로 변경해서 asList를 사용하는 것이 가장 빠르고 편하지만,

초기화 할 때 값을 지정해줘야하기 때문에 if문 같은 곳에서는 사용이 불가능할 것 같다.

 

의외로 String을 하나하나 차례대로 가져와서 저장하는 것이 빨라서 놀랐다!

 

 

 

 

 

 

 


참고사이트

[Java] List형을 String 형으로 변환하는 여러가지 방법

[Java] String에서 ArrayList로 만들기

ArrayList, LinkedList의 특징과 차이

 

 

728x90