코딩마을방범대
List 를 String 으로, String 을 List 로 변환하는 방법 본문
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로 만들기
'💡 백엔드 > Java' 카테고리의 다른 글
[Java] Hashtable, HashMap, ConcurrentHashMap 에 대해서 (0) | 2023.07.31 |
---|---|
[Java] 컬렉션 팩토리(Set, Map, List) (0) | 2023.07.31 |
[Java] String, StringBuffer, StringBuilder의 차이점 (0) | 2023.07.28 |
자바에서 유니크한 값 가져오기 ( UUID / random ) (0) | 2023.07.27 |
Java에서 QR 코드 만들기 (0) | 2023.07.27 |