컬렉션 프레임웍 Collection Framework : Arrays
Arrays 클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다.
배열의 복사 : copyOf(), copyOfRange()
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.copyOf(arr,7); // arr4 = [0,1,2,3,4,0,0]
int[] arr5 = Arrays.copyOfRange(arr,2,4); // arr5 = [2,3]
int[] arr6 = Arrays.copyOfRange(arr,0,7); // arr6 = [0,1,2,3,4,0,0]
배열 채우기 : fill() , setAll()
fill()은 배열의 모든 요소를 지정된 값으로 채운다. setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 매개변수로 지정하던가 아니면 람다식을 지정해야한다
int[] arr = new int[5];
Arrays.fill(arr,9); // arr = [9,9,9,9,9]
Arrays.setAll(arr, () -> (int)(Math.random()*5)+1) // arr=[1,5,2,1,1]
배열의 정렬과 검색 : sort(), binarySearch()
int[] arr = {3,2,0,1,4};
Arrays.sort(arr); // 배열 arr을 정렬한다.
System.out.println(Arrays.toString(arr)) // [0,1,2,3,4]
int idx = Arrays.binarySearch(arr,2); // idx = 2
문자열의 비교와 출력 : equals() , toString()
toString()은 일차원 배열에만 사용할 수 있으므로, 다차원 배열에는 deepToString()을 사용해야 한다.
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]]
equals()도 일차원 배열에만 사용가능하므로, 다차원 배열의 비교에는 deepEquals()를 사용해야한다.
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.deepToEquals(str2D,str2D2)) // true
배열을 List로 변환 : asList(Object...a)
asList()는 배열을 List에 담아서 반환한다. 매개변수의 타입이 가변인수라서 배열 생성없이 저장할 요소들만 나열하는 것도 가능하다.
List list = Arrays.asList(new Integer[]{1,2,3,4,5}); // list = [1,2,3,4,5]
List list = Arrays.asList(1,2,3,4,5); // list = [1,2,3,4,5]
list.add(6); // UnsupportedOperationException 예외발생
주의할 점은 asList()가 반환한 List의 크기를 변경할 수 없다. 만일 크기를 변경할 수 있는 List가 필요하다면 다음과 같이 하면 된다.
List list = new ArrayList(Arrays.asList(1,2,3,4,5));
이외의 메서드: parallelXXX(), spliterator(), stream()
parallel로 시작하는 메서드들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다.
spliterator()는 여러 쓰레드가 처리할 수 있게 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환하며,
stream()은 컬렉션을 스트림으로 변환한다.