IT

배열의 길이 속성은 어디에 정의되어 있습니까?

lottoking 2020. 3. 30. 08:57
반응형

배열의 길이 속성은 어디에 정의되어 있습니까?


우리는의 길이를 결정할 수 있습니다 ArrayList<E>공개 방법을 사용하여 size()같은,

ArrayList<Integer> arr = new ArrayList(10);
int size = arr.size();

마찬가지로 속성을 Array사용하여 객체 의 길이를 결정할 수 있습니다length

String[] str = new String[10];
int size =  str.length;

size()메소드 ArrayListArrayList클래스 내에서 정의 되는 반면, length특성은 어디에 Array정의되어 있습니까?


배열은 Java의 특수 객체이며 이름이라는 간단한 속성 lengthfinal있습니다.

배열에 대한 "클래스 정의"는 없으며 (.class 파일에서 찾을 수 없음) 언어 자체의 일부입니다.

10.7. 배열 구성원

배열 유형의 멤버는 모두 다음과 같습니다.

  • public final필드 length배열의 요소의 수를 포함. length양수 또는 0 일 수 있습니다.
  • public메소드 clone는 클래스에서 동일한 이름의 메소드를 대체하고 Object확인 된 예외를 발생시키지 않습니다. clone배열 유형 메소드의 리턴 유형은 T[]입니다 T[].

    다차원 배열의 복제본은 얕습니다. 즉, 하나의 새 배열 만 만듭니다. 하위 배열이 공유됩니다.

  • 모든 멤버는 클래스에서 상속되었습니다 Object. Object상속되지 않는 유일한 방법 은 그 clone방법입니다.

자원:


기본적으로 자체 바이트 코드 명령과 함께 "특별" arraylength합니다. 따라서이 방법 :

public static void main(String[] args) {
    int x = args.length;
}

다음과 같이 바이트 코드로 컴파일됩니다.

public static void main(java.lang.String[]);
  Code:
   0:   aload_0
   1:   arraylength
   2:   istore_1
   3:   return

따라서 일반 필드처럼 액세스되지 않습니다. 실제로 다음과 같이 일반 필드처럼 가져 오려고하면 실패합니다.

// Fails...
Field field = args.getClass().getField("length");
System.out.println(field.get(args));

불행히도 공개 최종 필드 length있는 각 배열 유형의 JLS 설명 은 다소 오도됩니다.


Java 언어 사양에 정의되어 있습니다 .

배열 유형의 멤버는 모두 다음과 같습니다.

  • public final필드 length배열의 요소의 수를 포함. length양수 또는 0 일 수 있습니다.

어레이 형태의 무한 개수가 존재하기 때문에 (각 클래스에 대응하는 어레이 형태가 있고, 그 다음 , 그들이 클래스 파일에서 구현 될 수있는 다차원 배열이있다); JVM은 즉시 수행해야합니다.


이것이 질문에 대한 직접적인 대답은 아니지만 .length.size()논쟁에 추가됩니다 . 나는이 질문과 관련된 것을 연구하고 있었으므로 그것을 만났을 때 여기에 정의가 제공되어 있음을 알았습니다.

배열의 구성 요소 수 를 포함하는 공개 최종 필드 길이 입니다.

"정확하게"정확하지 않습니다.

필드 길이에는 배열에있는 구성 요소 수가 아니라 구성 요소를 배치수있는 사용 가능한 위치 수가 포함 됩니다. 따라서이 메모리에 얼마나 많은 메모리가 채워져 있는지가 아니라 해당 어레이에 할당 된 총 가용 메모리를 나타냅니다.

어레이 메모리 할당

예:

static class StuffClass {
    int stuff;
    StuffClass(int stuff) {
        this.stuff = stuff;
    }
}

public static void main(String[] args) {

    int[] test = new int[5];
    test[0] = 2;
    test[1] = 33;
    System.out.println("Length of int[]:\t" + test.length);

    String[] test2 = new String[5];
    test2[0] = "2";
    test2[1] = "33";    
    System.out.println("Length of String[]:\t" + test2.length);

    StuffClass[] test3 = new StuffClass[5];
    test3[0] = new StuffClass(2);
    test3[1] = new StuffClass(33);
    System.out.println("Length of StuffClass[]:\t" + test3.length);         
}

산출:

Length of int[]:        5
Length of String[]:     5
Length of StuffClass[]: 5

그러나의 .size()속성은 ArrayList목록의 요소 수를 제공합니다.

ArrayList<Integer> intsList = new ArrayList<Integer>();
System.out.println("List size:\t" + intsList.size());
intsList.add(2);
System.out.println("List size:\t" + intsList.size());
intsList.add(33);
System.out.println("List size:\t" + intsList.size());

산출:

List size:  0
List size:  1
List size:  2

배열의 구성 요소 수를 포함하는 public final field입니다 (길이는 양수이거나 0 일 수 있음).

따라서 배열은 다음 클래스와 동일한 공용 필드 및 메소드를 갖습니다.

class A implements Cloneable, java.io.Serializable {
    public final int length = X;
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.getMessage());
        }
    }
}

더 많은 정보

10.7 배열 구성원

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html


그대로 대답하려면 배열 의이 길이 속성은 어디에 정의되어 있습니까? 특별 Object header합니다.

JOL을 통해 쉽게 볼 수

 int [] ints = new int[23];
 System.out.println(ClassLayout.parseInstance(ints).toPrintable());

이 출력의 라인 중 하나는 다음과 같습니다.

OFFSET  SIZE      TYPE DESCRIPTION
16       4        (object header)   17 00 00 00 (00010111 00000000 00000000 00000000) (23)

일반적으로 객체는 두 개의 헤더 (마크와의 klass), 배열은 항상 점유하는 것이 더욱 하나가이 4 bytes같은 길이를 size입니다 int.


키워드 길이는 정의 된 데이터와 같은 역할을합니다. 배열에서 사용할 때 배열을 사용하여 배열의 요소 수에 액세스 할 수 있습니다. String []과 관련하여 String 클래스에 정의 된 length () 메서드를 호출 할 수 있습니다. ArrayList와 관련하여 ArrayList에 정의 된 size () 메서드를 사용할 수 있습니다. ArrayList <> (capacity)로 배열 목록을 만들 때 요소가 없으므로이 배열 목록의 초기 크기 ()는 0입니다.

참고 URL : https://stackoverflow.com/questions/9297899/where-is-arrays-length-property-defined

반응형