JAVA 배열과 컨테이너 클래스 사이에는 효율성, 유형, 기본 유형 저장 기능이라는 세 가지 주요 차이점이 있습니다 . JAVA에서 배열은 일련의 객체 참조를 저장하고 무작위로 액세스하는 가장 효율적인 방법입니다. 배열은 요소 액세스를 매우 빠르게 만드는 간단한 선형 시퀀스입니다. 그러나 이를 위해 지불되는 대가는 배열의 크기가 고정되어 있으며 수명 동안 변경할 수 없다는 것입니다.
제네릭 및 자동 패키징 메커니즘 덕분에 컨테이너는 이제 배열만큼 쉽게 기본 유형과 함께 사용할 수 있습니다. 배열과 컨테이너 모두 어느 정도 남용을 방지할 수 있습니다. 범위를 벗어나면 RuntimeException이 발생합니다. 배열의 유일한 장점은 효율성입니다. 그러나 보다 일반적인 문제를 해결하려는 경우 배열이 너무 제한적일 수 있으므로 이 경우에도 대부분의 사람들은 컨테이너를 선택합니다.
따라서 최신 JAVA 버전을 사용하는 경우 배열보다 컨테이너를 선호해야 합니다. 성능이 문제인 것으로 입증되고 어레이로 전환하면 성능이 향상되는 경우에만 프로그램을 어레이로 리팩터링해야 합니다.
【초기화】
JAVA에는 배열 초기화에 대한 매우 엄격한 규정이 있어 배열 남용을 효과적으로 방지할 수 있습니다. 초기화 오류가 발생하면 RuntimeException 대신 CompileException이 직접 발생합니다. 배열이 적절하게 초기화될 때까지 이 배열 참조로 아무 작업도 수행할 수 없습니다.
배열 정의에는 int[] 배열과 int array[]가 포함됩니다. 일반적으로 첫 번째 스타일은 변수 이름과 유형을 구분하는 데 사용됩니다.
배열을 초기화하는 방법에는 정적 초기화와 동적 초기화의 두 가지가 있습니다. 길이는 초기화 시 지정해야 하며, 다차원 배열의 첫 번째 차원의 길이를 명시해야 하며, 높은 차원부터 낮은 차원까지 정의해야 합니다. 초기화 작업은 코드 어디에나 있을 수 있지만, {} 메서드는 배열이 생성된 위치에만 나타날 수 있습니다. 특정 초기화 방법은 프로그램을 참조하세요.
arrayA = new int[10]; //동적 초기화
System.out.println("arrayA 길이: " + arrayA.length);
int[] arrayC = 새로운 int[]{1,2,3,4};
System.out.println("arrayC 길이: " + arrayC.length);
//int[] arrayD = new int[1]{1}; //잘못된 초기화, 크기 및 초기화 값을 동시에 정의할 수 없습니다.
int[][] arrayE = 새로운 int[1][];
System.out.println("arrayE 길이: " + arrayE.length);
//int[][] arrayF = new int[][2]; //고차원의 길이를 먼저 지정해야 합니다.
int[][] arrayG = new int[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
System.out.println("arrayG 길이: " + arrayG.length);
int[][][] arrayH = 새로운 int[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12} }};
System.out.println("arrayH 길이: " + arrayH.length);
dummyArray[] arrayI = {new dummyArray(),new dummyArray()} //사용자 정의 배열 유형
System.out.println("arrayI 길이: " + arrayI.length);
System.out.println("arrayI[1]: " + arrayI[1].getValue());
dummyArray[] arrayK = 새로운 dummyArray[5];
System.out.println("arrayK[0]: " + arrayK[0]); //null
for(int i = 0; i < arrayK.length; i++){
arrayK[i] = 새로운 dummyArray();
}
System.out.println("arrayK[0]: " + arrayK[0].getValue()); //2
}
}
클래스 dummyArray{
개인 정적 int 임시;
개인 최종 int arrayValue = 임시++;
공개 int getValue(){
배열값을 반환합니다.
}
}
산출:
배열B 길이: 5
arrayA 길이: 10
arrayC 길이: 4
arrayE 길이: 1
arrayG 길이: 3
arrayH 길이: 1
arrayI 길이: 2
배열I[1]: 1
배열K[0]: 널
배열K[0]: 2
int[][] arrayB = 새로운 int[10][];
System.out.println("arrayB 길이: " + arrayB.length);
int[][] arrayC = 새로운 int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,};//뒤의 쉼표에 주의하세요.
System.out.println("arrayC 길이: " + arrayC.length);
int[][] arrayD = 새로운 int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,{}};
System.out.println("arrayD 길이: " + arrayD.length);
}
}
산출:
arrayA 길이: 15
배열B 길이: 10
arrayC 길이: 3
arrayD 길이: 4
[과제 및 참고사항]
JAVA 배열이 초기화되면 배열에 대한 참조만 있고 배열에 저장 공간이 할당되지 않습니다. 따라서 배열 간 복사는 동일한 객체가 동작하기 때문에 단순히 "=" 할당을 사용할 수 없습니다. 다음 절차:
}
}
산출:
저는 testA입니다. 변경된 사항이 없습니다:testA
저는 arrayA입니다. 변경된 사항이 없습니다. arrayB가 변경되었습니다.
[어레이 복사]
JAVA에서 배열을 복사하는 방법:
1. FOR 루프를 사용하여 전체 또는 지정된 요소를 복사합니다. 이는 덜 효율적입니다.
2. 참조 대신 배열의 값을 얻으려면 clone 메소드를 사용하십시오. 그러나 복제본은 지정된 요소를 복사할 수 없으며 유연성이 낮습니다.
3. System.arraycopy(src, srcPos, dest, destPos, length) 메소드를 사용하십시오. Java 표준 클래스 라이브러리는 System.arraycopy()를 사용하여 배열을 복사하는 것이 for 루프보다 훨씬 빠릅니다. .arraycopy()는 모든 유형에 대한 것입니다. 기본 유형 배열과 객체 배열 모두 System.arraycopy()를 사용하여 복사할 수 있지만 객체 배열은 참조만 복사하므로 객체의 복사본이 두 개 없습니다. 이것을 얕은 복사라고 합니다.
src: 소스 배열;
srcPos: 복사할 소스 배열의 시작 위치.
dest: 대상 배열;
destPos: 대상 배열이 배치되는 시작 위치입니다.
길이: 복사본의 길이입니다.
참고: System.arraycopy()는 자동 패키징 및 자동 언패킹을 수행하지 않으므로 두 배열은 동일한 유형이어야 하거나 동일한 유형의 배열로 변환될 수 있습니다. 동시에 이 방법을 사용하여 배열 자체를 복사할 수도 있습니다.
int[] 테스트 ={0,1,2,3,4,5,6};
System.arraycopy(테스트,0,테스트,3,3);
결과는 다음과 같습니다: {0,1,2,0,1,2,6};
테스트 절차는 다음과 같습니다.
//클론 메소드
int[] arrayB = 새로운 int[9];
arrayB = array.clone();
//시험
배열B[1] = 19;
for(int i = 0; i < arrayB.length; i++){
System.out.print(arrayB[i] + ",");
}
System.out.println("");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + ",");
}
System.out.println("");
//System.arrayCopy 메소드
int[] arrayC = 새로운 int[9];
System.arraycopy(array, 0, arrayC, 0, arrayC.length);
//시험
배열C[1] = 19;
for(int i = 0; i < arrayC.length; i++){
System.out.print(arrayC[i] + ",");
}
System.out.println("");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + ",");
}
}
}
String[][] arrayD = {{"a","b"},{"c","d"}};
String[][] arrayE = {{"a","b"},{"c","d"}};
System.out.println(Arrays.deepEquals(arrayD, arrayE));
}
}
[반환 배열]
C 및 C++에서는 배열을 반환할 수 없고 배열에 대한 포인터만 반환할 수 있습니다. 왜냐하면 배열을 반환하면 배열의 수명 주기를 제어하기 어렵고 쉽게 메모리 누수가 발생할 수 있기 때문입니다. Java에서는 배열을 직접 반환할 수 있으며 가비지 수집 메커니즘을 통해 재활용할 수 있습니다.
[배열 및 컨테이너 변환] [기본형 배열 변환 불가]
배열을 목록으로 변환:
int[] arrayB = {1,2,3};
목록 listB = java.util.Arrays.asList(arrayB);
System.out.println("listB: " + listB);
정수[] arrayC = {1,2,3};
목록 listC = java.util.Arrays.asList(arrayC);
System.out.println("listC: " + listC);
}
}
산출:
목록A: [a, b, c]
목록B: [[I@de6ced]
목록C: [1, 2, 3]
목록을 배열로 변환
String[] strings = new String[list.size()];
배열 = list.toArray(strings);
for(int i = 0, j = array.length; i < j; i++){
System.out.print(array[i] + ",");
}
}
}
출력은 다음과 같습니다
목록: [테스트A, 테스트B, 테스트C]
테스트A, 테스트B, 테스트C
공개 정적 문자열[] arrayUnique(문자열[] 배열){
List<String> 목록 = new ArrayList<String>();
for(int i = 0, j = array.length; i < j; i++){
if(!list.contains(배열[i])){
list.add(배열[i]);
}
}
String[] strings = new String[list.size()];
String[] arrayUnique = list.toArray(strings);
arrayUnique를 반환합니다.
}
}
Double[] arrayB = new Double[1000000];
for(int i = 0, j = arrayB.length; i < j; i++){
arrayB[i] = Math.ceil(Math.random()*1000);
}
System.out.println("시작");
긴 startTime = System.currentTimeMillis();
arrayUnique(배열);
긴 endTime = System.currentTimeMillis();
System.out.println("배열 고유 런타임: " +(endTime - startTime) +"ms");
긴 startTimeB = System.currentTimeMillis();
arrayUnique(arrayB);
긴 endTimeB = System.currentTimeMillis();
System.out.println("arrayB 고유 런타임: " +(endTimeB - startTimeB) +"ms");
}
공개 정적 Double[] arrayUnique(Double[] 배열){
List<Double> list = new ArrayList<Double>();
for(int i = 0, j = array.length; i < j; i++){
if(!list.contains(배열[i])){
list.add(배열[i]);
}
}
Double[] doubles = new Double[list.size()];
Double[] arrayUnique = list.toArray(doubles);
arrayUnique를 반환합니다.
}
}
산출:
시작
어레이 고유 런타임: 577ms
arrayB 고유 런타임: 5663ms