[Java] Array, List, Set

호호빵·2022년 5월 19일
0

Java

목록 보기
5/19

Array

  • 고정된 크기를 갖는 같은 자료형의 원소들이 연속적인 형태로 구성된 자료구조
  • 인덱스에 따라 값을 유지하므로 원소가 삭제되어도 빈자리가 남게되어 메모리가 낭비됨
  • 데이터 갯수가 확실하게 정해져 있고, 접근이 빈번한 경우 효율적
  • 컴파일 타임에 할당되는 정적 메모리 할당
    (compile time : 소스 코드가 컴파일을 통해 기계어 코드로 변환되어 실행 가능한 프로그램이 되는 편집 과정)
import java.util.Arrays;

int[] arr = new int[5];  // 크기가 5인 배열 생성 {0, 0, 0, 0, 0}

...
<정렬>
Arrays.sort(arr) // 오름차순 정렬
Arrays.parallelSort(arr)  
Arrays.sort(arr, Collections.reverseOrder()); // 내림차순 정렬

arr[1] = 0     // arr 배열의 첫번째 원소 값

<원소의 개수>
Collections.frequency(Arrays.asList(arr), "0") -> 5
// 배열 자체에서 지워하지 않기 때문에 리스트로 바꿔서 0 원소의 개수 세기


<값 검색>
Arrays.asList(arr).indexOf(0)  // 리스트로 변경 후 0의 인덱스 검색


List

  • 순서가 있는 빈틈없는 데이터의 적재, 동적으로 자료형의 개수 늘릴 수 있음
  • 원소를 삭제했을 때 삭제된 데이터 뒤 원소로 빈틈없이 연속적으로 위치시킴
  • 새로운 Node가 추가되는 런타임에 할당되는 메모리 할당
    (runtime : 컴파일 과정을 마친 응용프로그램이 사용자에 의해 실행될 때)

ArrayList

  • List 인터페이스를 상속 받은 클래스 중 하나
  • 배열을 이용해 리스트를 구현, 접근이 빠름, 추가와 삭제 느림
  • 동적으로 사용하기 힘듦

LinkedList

  • 한 원소에서 값과 다음 원소의 주소를 알고 연결하는 방식
  • 순차적 접근, 삽입 삭제 가능
import java.util.List;
import java.util.ArrayList;

#
List<Object> list = new ArrayList<>();  // 더 유연해짐
List<Object> list = new LinkedList<>();
 
#
ArrayList<Integer> names = new ArrayList<>();

<함수>
names.add(3);
names.add(4)
names.offer(5);   // 값 넣어주기  {3, 4, 5}
names.poll();     // 맨 마지막 값 반환 후 제거 5, {3, 4}
names.peek();	  // 4, {3, 4}

names.get(0)      // 0번째 값 도출  -> 3

<정렬>
Collections.sort(names)      // 오름차순으로 정렬
							 -> {3, 4}
Collections.sort(names, Collections.reverseOrder());  // 내림차순 정렬
													  -> {4, 3}

<원소의 개수>
Collections.frequency(names, 3)  -> 1  // 3이란 원소의 개수 하나

<값 검색>
names.contain(3); // 3이 ArrayList에 저장되어 있는지. 있으면 true 리턴
names.indexOf(3); // 3이 저장되어 있는 위치 리턴. 없으면 -1 리턴


Set

  • 순서 유지 x, 중복 x (순서를 유지하고 싶으면 LinkedHashSet 클래스를 사용)
import java.util.Set;

Set<String> set = new HashSet<>();

set.add("apple");
set.add("banana");
set.add("kiwi");  // {"apple", "banana", "kiwi"}

set.remove("apple"); // {"banana", "kiwi"}

<데이터 출력>
Iterator<String> iterSet = set.iterator();
while (iterSet.hasNext()) {
	System.out.print(iterSet.next()) + " ");
}
// banana kiwi  -> 각 데이터를 조작할 때

System.out.println(set.toString());
// {banana, kiwi}   -> 단순히 확인할 때

<값 포함, 존재 유무>
set.contains("apple");  // false
set.contains("kiwi");   // true
set.isEmpty();          // false



Array <-> Set

1. Array -> Set
// HashSet의 생성자 파라미터로 List 넘겨줌 (배열을 리스트로 변환해서)

Integer[] arr = {1, 1, 2, 3, 4};

Set<Integer> set = new HashSet<>(Arrays.asList(arr));

System.out.println(set)     // [1, 2, 3, 4]



2. Set -> Array
// Set객체의 toArray() 메소드를 이용하면, Set객체를 배열로 변환 가능
// 파라미터로는 변환될 배열 객체를 넘겨주면 되는데
// 배열의 크기를 0으로 지정하면 자동으로 배열의 크기가 지정됨

Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3, 4));

Integer[] arr = set.toArray(new Integer[0]);
// Integer[] arr = new Integer[set.size()];
// set.toArray(arr);     -> 이 두 줄을 한줄로

System.out.println(Arrays.toString(arr))   // [1, 2, 3, 4]


List <-> Set

Guava 활용 변환

  • 구글의 자바 라이브러리인 Guava를 이용
  • Gradle project에서 Guava를 사용하려면 build.gradle의 dependencies에 다음과 같이 정의
  • Lists, Sets라는 Util 클래스 제공
    (간단한 코드로 list를 생성하고 set으로 변환가능)
implementation("com.google.guava:guava:28.2-jre")

변환

1. List -> Set
List<Integer> list = Arrays.asList(0, 1, 2, 3, 4);
Set<Integer> set = new HashSet<>(list);
// 생성인자 파라미터로 list 전달

`Guava`
Set<Integer> guavaSet = Sets.newHashSet(list);   
// Guava 활용 변환


2. Set -> List
Set<Integer> set = new HashSet<>(Arrays.asList(0, 1, 2, 3, 4));
List<Integer> list = new ArrayList<>(set);
// 생성인자 파라미터로 set 전달
// `Guava` 활용 변환 가능, Lists 사용



List, Arraylist
Arraylist
LinkedList
리스트와 배열 차이
배열 sorting
HashSet
Array<->Set
List<->Set

profile
하루에 한 개념씩

0개의 댓글

관련 채용 정보