[자료구조] 가변크기 배열(ArrayList, StringBuilder)

Yodi.Song·2021년 1월 4일
0

ArrayList와 가변크기 배열

동적가변크기 배열: 입력된 데이터에 따라 동적으로 크기가 변하는 배열

삽입, 삭제 시간복잡도

  • 일반적으로는 O(1)

  • 배열의 용량이 꽉 찼을때

    • 어레이 리스트는 기존보다 2배 더 큰 배열을 생성하고 이전 배열의 모든 원소를 새 배열로 복사한다.
    • O(2N) = O(N)
  • 전체 삽입 시간은?

    • 상환시간 ---> 분할 상환분석 --->O(1)

StringBuilder

문자열 리스트가 주어졌을 때, 하나의 문자열로 이어붙이려고 한다. 이때의 수행시간은?

len(str_list) = n, len(tmp) = x 일때

String str = ''
for tmp in str_list:
  str = str + tmp
  
return str

시간복잡도

O(N2X)O(N^2X)

하지만 StringBuilder를 사용하면 필요한 경우에만 문자열을 복사하여 시간복잡도를 크게 단축할 수 있다.

StringBuilder str = new StringBuilder()
for tmp in str_list:
  str.append(tmp)

return str

String, StringBuilder와 StringBuffer

  • String

    • 변경 불가능(immutable) 수정해야할 경우 새로 생성해야한다. O(N)
    • literal 방식으로 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다
      • String str = "hihihi";
    • 사용 적절한 경우
      • 문자열 연산이 적고 자주 조회해야하는 경우
      • 멀티쓰레드 환경
  • StringBuilder(동기화 지원안함)

    • 변경 가능(mutable)하다
    • new 방식으로 생성되며 인스턴스의 메모리 공간은 가변가능하다
    • 변경가능한 문자열이지만 synchronization이 적용되지 않았다.
    • 사용 적절한 경우
      • 문자열 연산이 많은 경우
      • 싱글쓰레드 환경, 또는 멀티쓰레드 환경이어도 굳이 동기화가 필요 없는 경우
  • StringBuffer(동기화 지원함)

    • Thread-safe, multiple thread환경에서 안전한 클래스
    • 비동기적으로 동작한다
    • 사용 적절한 경우
      • 문자열 연산이 많은 경우
      • 멀티쓰레드 환경

참고 블로그

1개의 댓글

comment-user-thumbnail
2021년 1월 4일

안녕하세요, tech 기업에서 일하는/ 일하기를 희망하는 여성들을 모아서 모임을 만들고 있어요!
자세한 사항은 및 링크 참조바랍니다 :)
https://velog.io/@emilyscone/SheKorea-1%EA%B8%B0-%EB%A9%A4%EB%B2%84%EB%A5%BC-%EB%AA%A8%EC%A7%91%ED%95%A9%EB%8B%88%EB%8B%A4

답글 달기