우리는의 길이를 결정할 수 있습니다 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()
메소드 ArrayList
는 ArrayList
클래스 내에서 정의 되는 반면, 이 length
프로퍼티는 어디에 Array
정의되어 있습니까?
답변
배열은 Java의 특수 객체이며 이름이라는 간단한 속성 length
이 final
있습니다.
배열의 “클래스 정의”는 없으며 (.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입니다.