Java(및 기타 언어)의 데이터 구조 연구를 처음 접하는 방법은 배열을 통해서입니다. Java에서 배열은 클래스, 객체, Object의 하위 항목입니다(모든 클래스가 그렇듯이). 하지만 언어에 있어서는 특별 대우를 받는 수업입니다.
일반적인 클래스 및 객체와 달리 배열의 구문과 처리는 컴파일러와 JVM(Java Virtual Machine)에서 직접 관리됩니다. 여기에는 배열을 할당, 조작 및 액세스하는 방법이 포함됩니다. 이 클래스는 소스 코드에서 직접 찾을 수 없습니다.
Java는 자동으로 배열을 이 특수 클래스의 인스턴스로 처리합니다.
아래 코드를 실행하면 다음과 같은 결과가 표시됩니다.
public class Main { public static void main(String[] args) { int[] intArray = new int[5]; System.out.println(intArray.getClass().getName()); System.out.println(intArray.getClass().getSuperclass()); } }
[나
클래스 java.lang.Object
이 클래스 이름 "[I"는 JVM이 정수 배열(int[])을 나타내는 데 사용하는 자동 생성된 기호 이름입니다. 각 유형에는 고유한 상징적 이름이 있습니다.
괄호 "["는 크기를 나타냅니다. 1차원 배열은 [, 2차원 배열은 [[, 3차원 배열은 [[[... 등)으로 표현됩니다.
배열을 선언하고 초기화하려면 객체의 데이터 유형과 크기를 지정하는 것이 중요합니다.
int[] intArray = new int[5]; //array de tamanho 5 char[] charArray = new char[]{'a', 'b', 'c'}; //o compilador entende que é um array de tamanho 3 double[] doubleArray = {1.2, 1.3, 1.4, 1.5}; //o compilador entende que é um array de tamanho 4
Java에서는 유형 대신 변수 이름에 대괄호를 넣을 수 있습니다. 예: int intArray[] = new int[5]. 하지만 이는 관례에 어긋나기 때문에 권장하지 않습니다.
배열 내에 저장된 데이터는 JVM에 의해 "연속적으로", 즉 순차적으로 메모리에 할당될 수 있습니다. 데이터에 접근하기 위해 인덱스를 사용하며, Java에서는 배열의 첫 번째 인덱스가 항상 0입니다.
예를 들어 위 charArray의 문자 'a'에 액세스하려면 charArray[0]로 검색해야 합니다. 문자 'b'는 charArray[1]에 있고 문자 'c'는 charArray[2]에 있습니다. 배열에 존재하지 않는 인덱스에 액세스하려고 하면 "IndexOutOfBounce" 오류가 발생합니다. 예를 들어 charArray[3]의 값에 액세스하려고 하는 경우입니다.
선언에 정의된 배열의 크기는 절대 변경할 수 없습니다. charArray에 3개의 요소가 있다고 선언하면 그 이상은 포함되지 않습니다. 덜 예... 더 아니오.
여기에 부록이 있습니다. 배열에 채워지지 않은 값은 배열 유형과 동일한 기본값을 가정합니다. 예를 들어 정수 배열에서는 빈 값이 0으로 채워집니다. 부울 배열에서는 false로 채워집니다. 문자열 배열에서 null이 포함됩니다.
크기와 마찬가지로 배열의 유형도 변경할 수 없습니다. 그러나 동일한 유형의 하위 유형인 경우 다른 유형의 배열을 복사하는 것이 가능합니다. 혼란스럽죠? 예를 들면 다음과 같습니다. Integer와 Double은 Number의 하위 유형입니다. 그럼...
Integer[] integerArray = {1, 2, 3}; Number[] numberArray = intgerArray;
이 코드는 컴파일러에서 허용됩니다. 그러나 주의가 필요합니다. 여기서 이렇게 하면 컴파일 오류가 발생합니다.
numberArray[0] = 1.2;
integerArray와 numberArray가 동일한 메모리 공간을 가리키기 때문입니다. numberArray는 첫 번째 요소로 double을 지원하지만 정수 배열은 지원하지 않으므로 numberArray는 인덱스 값 0을 변경하는 것이 "허용"되지 않습니다.
배열은 항상 동일한 유형의 데이터를 저장할 수 있으며 기본 요소와 객체를 허용합니다. 배열이 정수로 구성된 경우 char, double, float, String... 정수 값만 허용됩니다.
배열 자체는 클래스이므로(특수 클래스임에도 불구하고) 힙에 저장됩니다. 이러한 방식으로 배열은 배열에 입력된 값을 포함하는 메모리 주소를 저장합니다.
기본 배열은 연속된 메모리 블록을 할당하여 값을 직접 저장하는 반면, 객체 배열은 메모리의 다른 위치에 있는 객체에 대한 참조(포인터)를 저장합니다.
이는 기본 유형의 배열(예: int[])과 객체 배열(예: String[])이 모두 힙에 저장된다는 의미입니다. 기본 유형 배열의 경우 배열 요소의 값도 배열 자체에 인접한 힙에 직접 저장됩니다. 객체 배열의 경우 이러한 참조가 가리키는 객체는 힙의 다른 위치에 할당될 수 있습니다.
모든 배열 클래스에는 길이와 복제 방법이 있습니다. 첫 번째는 배열의 크기를 반환하고 두 번째는 배열의 복사본을 다른 배열(이 경우 동일한 메모리 주소에 대한 포인터)로 만듭니다.
그러나 Object 클래스(Java의 모든 클래스 포함)의 하위 요소인 배열에는 toString, equals 및 hashCode와 같은 슈퍼클래스 메소드도 있습니다.
그러나 배후에서 배열을 사용하는 것은 실제 생활에서 가장 많이 일어나는 일입니다. 배열이 성능이 뛰어나더라도 해당 요소를 반복하는 것은 훨씬 더 복잡하며 배열 위에 추상화를 만드는 클래스가 있어 프로그래머의 삶이 훨씬 단순해집니다.
Arrays 클래스(대문자 사용)의 경우입니다. 기본적으로 표준 Java 클래스의 배열을 패키징하고 데이터 작업을 위한 구현하기 매우 간단한 일련의 메서드를 제공합니다. Arrays 클래스에는 또 다른 강력한 이점이 있습니다. 동적 할당과 함께 작동하므로 컬렉션을 처리하기가 더 쉽습니다. 결국 필요한 배열의 정확한 크기를 거의 알 수 없습니다. Arrays 클래스는 프로그래머가 더 큰 크기의 새 배열(소문자)을 생성하고 갑자기 너무 작아진 이전 배열의 데이터를 복사할 필요 없이 필요에 따라 컬렉션의 크기를 확장할 수 있습니다.
배열은 List, Stack, Queue와 같은 클래스의 기초이기도 합니다(기본적으로 랩이며 데이터를 처리하기 위한 매우 좋은 방법을 포함함).
String이 문자 배열을 추상화하는 클래스라고 생각해 본 적이 있나요?
위 내용은 array[]: JVM 자체에서 내부적으로 관리되는 특수 클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!