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

우리는의 길이를 결정할 수 있습니다 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입니다.