Arrays
클래스에는 배열을 유용하게 다룰 수 있는 메서드들이 정의되어 있다. 정의된 메서드는 모두 static 메서드이다.
int[] arr = { 0, 1, 2, 3, 4 };
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr2 = [0,1,2,3,4]
int[] arr3 = Arrays.copyOf(arr, 3); // arr3 = [0,1,2]
int[] arr4 = Arrays.copyOfRange(arr, 2, 4); // arr4 = [2,3]
int[] arr5 = Arrays.copyOfRange(arr, 0, 7); // arr5 = [0,1,2,3,4,0,0]
copyOf()
: 매개변수로 받은 배열과 길이만큼 새로운 배열에 복사한다.copyOfRange()
: 지정한 범위만큼 새로운 배열을 복사하며 지정된 범위의 끝은 포함되지 않음.int[] arr = new int[5];
Arrays.fill(arr, 9); // arr = [9,9,9,9,9]
Arrays.setAll(arr, (i) -> (int) (Math.random() * 5) + 1); // arr = [1,5,2,3,2]
fill()
: 배열의 모든 요소를 지정한 값으로 채운다.setAll()
: 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받는다. 함수형 인터페이스를 구현한 객체를 지정하거나 람다식을 지정해야 한다.int[] arr = { 3, 2, 0, 1, 4 };
int idx = Arrays.binarySearch(arr, 2);
System.out.println(idx); // -5 -> 잘못된 결과
Arrays.sort(arr);
int idx2 = Arrays.binarySearch(arr, 2);
System.out.println(idx2); // 2 -> 올바른 결과
sort()
: 배열을 오름차순으로 정렬한다.binarySearch()
: 이진 검색으로 검색할 범위를 절반씩 줄이며 검색한다. 큰 배열의 검색에 유리하지만 배열이 정렬되어 있는 경우에만 사용할 수 있다.int[] arr = { 0, 1, 2, 3, 4 };
int[][] arr2d = { { 11, 12 }, { 21, 22 } };
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
System.out.println(Arrays.deepToString(arr2d)); // [[11, 12], [21, 22]]
String[][] str2d = new String[][] { { "aa", "bb" }, { "AA", "BB" } };
String[][] str2d2 = new String[][] { { "aa", "bb" }, { "AA", "BB" } };
System.out.println(Arrays.equals(str2d, str2d2)); // false
System.out.println(Arrays.deepEquals(str2d, str2d2)); // true
toString()
: 일차원 배열을 출력한다.deepToString()
: 다차원 배열을 출력한다.equals()
: 두 배열에 저장된 모든 요소를 비교해서 boolean 값을 반환한다. 위에서는 배열에 저장된 배열의 주소를 비교했기 때문에 false가 반환됐다.deepEquals()
: 다차원 배열에서의 비교를 할 때 사용한다.List list = Arrays.asList(new Integer[] { 1, 2, 3, 4, 5 });
list.add(6); // 에러 발생
List list2 = Arrays.asList(1, 2, 3, 4, 5);
List list3 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
asList()
: 배열을 List
에 담아서 반환한다. 배열 생성없이 저장할 요소들만 나열하는 것도 가능하다. 하지만 asList()
로 생성한 List
도 배열이기 때문에 크기를 변경할 수 없기 때문에 ArrayList
를 사용하는 방법도 있다.parallelXXX()
: 여러 쓰레드로 작업을 나누어 처리하도록 한다.spliterator()
: 여러 쓰레드가 처리하도록 하나의 작업을 여러 작업으로 나누는 Spliterator
를 반환한다.stream()
: 컬렉션을 스트림으로 변환한다.import java.util.*;
class ArraysEx {
public static void main(String[] args) {
int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12,13}, {21,22,23}};
System.out.println("arr="+Arrays.toString(arr));
System.out.println("arr2D="+Arrays.deepToString(arr2D));
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 3);
int[] arr4 = Arrays.copyOf(arr, 7);
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
System.out.println("arr2="+ Arrays.toString(arr2));
System.out.println("arr3="+ Arrays.toString(arr3));
System.out.println("arr4="+ Arrays.toString(arr4));
System.out.println("arr5="+ Arrays.toString(arr5));
System.out.println("arr6="+ Arrays.toString(arr6));
int[] arr7 = new int[5];
Arrays.fill(arr7, 9); // arr=[9,9,9,9,9]
System.out.println("arr7="+Arrays.toString(arr7));
Arrays.setAll(arr7, i -> (int)(Math.random()*6)+1);
System.out.println("arr7="+Arrays.toString(arr7));
for(int i : arr7) {
char[] graph = new char[i];
Arrays.fill(graph, '*');
System.out.println(new String(graph)+i);
}
String[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2)); // false
System.out.println(Arrays.deepEquals(str2D, str2D2)); // true
char[] chArr = { 'A', 'D', 'C', 'B', 'E' };
int idx = Arrays.binarySearch(chArr, 'B');
System.out.println("chArr="+Arrays.toString(chArr));
System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B'));
System.out.println("= After sorting =");
Arrays.sort(chArr);
System.out.println("chArr="+Arrays.toString(chArr));
System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B'));
}
}