Arrays class
자주 쓰면서 어떤 메소드가 있는지 정확하게 모르고 썼던 Arrays 클래스! 이번에 확실하게 머리에 넣자! 👀
배열을 다루기 위한 다양한 메소드가 포함되어 있다.
모두 클래스 메소드 이므로 객체를 생성하지 않고 클래스명으로 접근하여 바로 생성할 수 있다.
asList(arrays)
- 전달받은 배열을 고정 크기의 리스트로 변환하여 반환함
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArraysAsListExample {
public static void main(String[] args) {
// 배열을 List로 변환
String[] array = {"사과", "바나나", "체리", "딸기"};
// 원래 배열과 연결된 List
List<String> list1 = Arrays.asList(array);
// ArrayList로 새로운 List 생성
List<String> list2 = new ArrayList<>(Arrays.asList(array));
// 배열 수정
array[0] = "오렌지";
// list1 출력
System.out.println("list1: " + list1);
// list2 출력
System.out.println("list2: " + list2);
}
}
실행결과
list1: [오렌지, 바나나, 체리, 딸기] : 원래 배열과 같은 주소를 바라보는 리스트
list2: [사과, 바나나, 체리, 딸기] : 새로운 객체가 생성되어 별개의 주소값을 가지는 리스트
binarySearch(arrays, target)
- 전달받은 배열에서 특정 값의 위치를 이진 검색 알고리즘을 사용하여 검색한 후 해당 인덱스를 반환하고 찾지 못한 경우 음수 값을 반환함
- 이진 검색 알고리즘을 사용하므로 전달되는 배열이 미리 정렬되어 있어야 제대로 동작함
import java.util.Arrays;
public class BinarySearchExample {
public static void main(String[] args) {
int[] sortedArray = {2, 4, 6, 8, 10, 12, 14, 16};
// 먼저 배열을 정렬해야 합니다.
Arrays.sort(sortedArray);
int target = 10;
int index = Arrays.binarySearch(sortedArray, target);
if (index >= 0) {
System.out.println("요소 " + target + "는 배열에서 인덱스 " + index + "에 있습니다.");
} else {
System.out.println("요소 " + target + "는 배열에 존재하지 않습니다.");
}
}
}
실행 결과
요소 10는 배열에서 인덱스 4에 있습니다.
copyOf(arrays, newLength)
- 전달받은 배열의 특정 길이만큼을 새로운 배열로 복사하여 반환함(깊은복사)
- 새로운 배열의 길이가 원본 배열의 길이보다 크다면 나머지는 배열 요소의 타입에 맞게 기본값으로 채워진다.
import java.util.Arrays;
public class ArraysCopyOfExample {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 원래 배열의 일부를 복사
int[] copiedArray1 = Arrays.copyOf(originalArray, 3);
System.out.println("copiedArray1: " + Arrays.toString(copiedArray1));
// 원래 배열 전체를 복사
int[] copiedArray2 = Arrays.copyOf(originalArray, originalArray.length);
System.out.println("copiedArray2: " + Arrays.toString(copiedArray2));
// 복사된 배열을 수정해도 원래 배열에 영향을 미치지 않습니다.
copiedArray1[0] = 10;
System.out.println("originalArray: " + Arrays.toString(originalArray));
System.out.println("copiedArray1 after modification: " + Arrays.toString(copiedArray1));
}
}
실행결과
copiedArray1: [1, 2, 3]
copiedArray2: [1, 2, 3, 4, 5]
originalArray: [1, 2, 3, 4, 5]
copiedArray1 after modification: [10, 2, 3]
copyOfRange(arrays, from, to)
- 전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환함
import java.util.Arrays;
public class ArraysCopyOfRangeExample {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 배열의 일부를 복사
int[] copiedArray = Arrays.copyOfRange(originalArray, 1, 4);
System.out.println("originalArray: " + Arrays.toString(originalArray));
System.out.println("copiedArray: " + Arrays.toString(copiedArray));
}
}
실행결과
originalArray: [1, 2, 3, 4, 5]
copiedArray: [2, 3, 4]
equals(arrays1, arrays2)
- 두 배열이 동일한 요소를 가지고 있는지 요소와 길이를 모두 비교
import java.util.Arrays;
public class ArraysEqualsExample {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4, 5};
int[] array2 = {1, 2, 3, 4, 5};
int[] array3 = {5, 4, 3, 2, 1};
boolean isEqual1 = Arrays.equals(array1, array2);
boolean isEqual2 = Arrays.equals(array1, array3);
System.out.println("array1 and array2 are equal: " + isEqual1);
System.out.println("array1 and array3 are equal: " + isEqual2);
}
}
실행결과
array1 and array2 are equal: true
array1 and array3 are equal: false
deepEquals(arrays1, arrays2)
- 다차원 배열의 깊은내용(내부 배열까지) 동일한지 확인하여 boolean 값을 반환함
import java.util.Arrays;
public class ArraysDeepEqualsExample {
public static void main(String[] args) {
// 다차원 배열 생성
int[][] a1 = { {1, 2}, {3, 4} };
int[][] a2 = { {1, 2}, {3, 4} };
int[][] a3 = { {1, 2}, {5, 6} };
// 깊은 내용을 비교
boolean isEqual1 = Arrays.deepEquals(a1, a2);
boolean isEqual2 = Arrays.deepEquals(a1, a3);
System.out.println("a1 and a2 are deep equals: " + isEqual1);
System.out.println("a1 and a3 are deep equals: " + isEqual2);
}
}
실행결과
a1 and a2 are deep equals: true
a1 and a3 are deep equals: false
equals
와deepEquals
의 차이점
equals deepEquals 배열의 종류 1차원 배열 다차원 배열 비교 방식 내용과 길이 모두 비교 내용과 길이와 구조를 모두 비교
hashCode(arrays)
- 배열의 내용의 길이만 비교하여 단순한 해시코드 생성
import java.util.Arrays;
public class ArraysHashCodeExample {
public static void main(String[] args) {
int[] array1 = {1, 2, 3, 4, 5};
int[] array2 = {1, 2, 3, 4, 5};
int[] array3 = {5, 4, 3, 2, 1};
int hashCode1 = Arrays.hashCode(array1);
int hashCode2 = Arrays.hashCode(array2);
int hashCode3 = Arrays.hashCode(array3);
System.out.println("HashCode of array1: " + hashCode1);
System.out.println("HashCode of array2: " + hashCode2);
System.out.println("HashCode of array3: " + hashCode3);
}
}
실행결과
HashCode of array1: 538279632
HashCode of array2: 538279632
HashCode of array3: 28229436
deepHashCode(arrays)
- 다차원 배열의 깊은내용(내부 배열까지) 에 대한 해시코드 생성
- 배열의 내용과 길이 구조까지 모두 비교하여 해시코드 생성
import java.util.Arrays;
import java.util.Arrays;
public class ArraysDeepHashCodeExample {
public static void main(String[] args) {
int[][] array1 = {{1, 2, 3}, {4, 5, 6}};
int[][] array2 = {{1, 2}, {3, 4, 5, 6}};
int[][] array3 = {{1, 2, 3}, {4, 5, 6}};
int deepHashCode1 = Arrays.deepHashCode(array1);
int deepHashCode2 = Arrays.deepHashCode(array2);
int deepHashCode3 = Arrays.deepHashCode(array3);
System.out.println("DeepHashCode of array1: " + deepHashCode1);
System.out.println("DeepHashCode of array2: " + deepHashCode2);
System.out.println("DeepHashCode of array3: " + deepHashCode3);
}
}
실행결과
DeepHashCode of array1: -1920740469
DeepHashCode of array2: 2002671652
DeepHashCode of array3: -1920740469
toString(arrays)
- 배열의 내용을 문자열로 표현
- 다차원 배열은 내부의 참조까지만 표현, 요소는 출력하지 않는다.
import java.util.Arrays;
public class ArraysToStringExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
String arrayAsString = Arrays.toString(numbers);
System.out.println("Array as String: " + arrayAsString);
}
}
실행결과
Array as String: [1, 2, 3, 4, 5]
deepToString(arrays)
- 다차원 배열의 깊은내용(내부 배열까지) 출력
import java.util.Arrays;
public class ArraysDeepToStringExample {
public static void main(String[] args) {
// 다차원 배열 생성
int[][] array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
// 다차원 배열 출력
String arrayString = Arrays.deepToString(array);
System.out.println("Array: " + arrayString);
}
}
실행결과
Array: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
fill(arrays, value)
- 배열의 모든 요소를 지정된 값으로 채움
import java.util.Arrays;
public class ArraysFillExample {
public static void main(String[] args) {
int[] array = new int[5];
// 배열을 0으로 채움
Arrays.fill(array, 0);
// 배열 출력
System.out.println("Array after filling with 0: " + Arrays.toString(array));
// 배열을 1로 채움
Arrays.fill(array, 1);
// 배열 출력
System.out.println("Array after filling with 1: " + Arrays.toString(array));
}
}
실행결과
Array after filling with 0: [0, 0, 0, 0, 0]
Array after filling with 1: [1, 1, 1, 1, 1]
parallelPrefix(arrays, operator)
- JAVA8 이후로 도입된 것으로, 배열의 요소에 대해 병렬 연산을 수행하여 누적 값을 구함
import java.util.Arrays;
public class ArraysParallelPrefixExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8};
Arrays.parallelPrefix(numbers, (x, y) -> x + y);
System.out.println("Cumulative Sum of Numbers: " + Arrays.toString(numbers));
}
}
실행결과
Cumulative Sum of Numbers: [1, 3, 6, 10, 15, 21, 28, 36]
setAll(arrays, generator)
- 각 요소를 인덱스 기반으로 설정
import java.util.Arrays;
public class ArraysSetAllExample {
public static void main(String[] args) {
int[] numbers = new int[10];
Arrays.setAll(numbers, index -> index);
System.out.println("Array with Values Set by Index: " + Arrays.toString(numbers));
}
}
실행결과
Array with Values Set by Index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
parallelSetAll(arrays, generator)
- 각 요소의 인덱스를 입력으로 받아 해당 인덱스에 대한 값을 계산하고, 배열의 요소를 병렬로 설정함
import java.util.Arrays;
public class ArraysParallelSetAllExample {
public static void main(String[] args) {
int[] numbers = new int[10];
Arrays.parallelSetAll(numbers, index -> index);
System.out.println("Array with Values Set by Index: " + Arrays.toString(numbers));
}
}
실행결과
Array with Values Set by Index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
sort(arrays)
- 배열을 정렬하는데 사용
import java.util.Arrays;
public class ArraysSortExample {
public static void main(String[] args) {
int[] numbers = {5, 2, 9, 1, 5, 6};
Arrays.sort(numbers);
System.out.println("Sorted Array: " + Arrays.toString(numbers));
}
}
실행결과
Sorted Array: [1, 2, 5, 5, 6, 9]
parallelSort(arrays)
- JAVA8부터 도입, 배열을 병렬로 정렬하는데 사용
import java.util.Arrays;
public class ArraysParallelSortExample {
public static void main(String[] args) {
int[] numbers = {5, 2, 9, 1, 5, 6};
Arrays.parallelSort(numbers);
System.out.println("Sorted Array: " + Arrays.toString(numbers));
}
}
실행결과
Sorted Array: [1, 2, 5, 5, 6, 9]
stream(arrays)
- 배열을 스트림으로 변환하는데 사용
- 배열의 요소를 스트림으로 처리하고 스트림 API를 활용하여 데이터를 처리할 수 있음
import java.util.Arrays;
import java.util.stream.IntStream;
public class ArraysStreamExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(numbers);
stream.forEach(System.out::println);
}
}
실행결과
1
2
3
4
5
asList(arrays)
binarySearch(arrays, target)
copyOf(arrays, newLength)
copyOfRange(arrays, from, to)
equals(arrays1, arrays2)
deepEquals(arrays1, arrays2)
hashCode(arrays)
deepHashCode(arrays)
toString(arrays)
deepToString(arrays)
fill(arrays, value)
parallelPrefix(arrays, operator)
setAll(arrays, generator)
parallelSetAll(arrays, generator)
sort(arrays)
parallelSort(arrays)
stream(arrays)