Java가 크기 0의 배열을 허용하는 이유는 무엇입니까?


82

Java의 배열은 길이가 고정되어 있습니다. Java가 크기 0의 배열을 허용하는 이유는 무엇입니까?

String[] strings = new String[0];

답변:


122

비어 있음을 나타냅니다. 즉, 항목이 있고 결과가 발생하지 않는 것처럼 반복 할 수 있습니다.

for(int k = 0; k < strings.length; k++){
   // something
}

따라서 확인할 필요가 없습니다. 문제의 배열이 null이면 예외가 발생하지만이 경우에는 아무 작업도 수행하지 않으므로 적절할 수 있습니다.


9
또한 함수 test(Object... objects)가있을 때 명시 적 함수를 호출하는 데 유용 합니다test()
Frithjof

51

Java가 크기 1의 배열을 허용하는 이유는 무엇입니까? 단일 값을 배열로 래핑하는 것은 꽤 쓸모가 없습니까? Java가 크기 2 이상의 배열 만 허용하면 충분하지 않을까요?

예, 우리 null는 빈 배열 대신 단일 객체 또는 크기 1 행렬 대신 기본 요소를 전달할 수 있습니다 .

그러나 그러한 제한에 대해 몇 가지 좋은 주장이 있습니다. 내 개인적인 주요 주장 :

제한이 너무 복잡하고 실제로 필요하지 않습니다.

배열의 크기를 [1..INTEGER.MAX_INT]로 제한하려면 코드 에 많은 추가 boudary 검사, (Konrads 의견에 동의) 변환 논리 및 메서드 오버로드를 추가해야합니다. 허용 된 어레이 크기에서 0 (또는 1)을 제외하면 비용이 절감되지 않으며 추가 노력이 필요하며 성능에 부정적인 영향을 미칩니다.

배열 모델 벡터

배열은 벡터에 대한 좋은 데이터 모델 (수학, 하지Vector 클래스!). 물론 수학의 벡터는 0 차원 일 수 있습니다. 개념적으로 존재하지 않는 것과 다릅니다.


사이드 노트 -(char-) 배열의 눈에 띄는 래퍼가 String클래스입니다. 불변 String은 빈 배열의 개념을 구체화합니다 "". 빈 문자열 ( )입니다.


2
나는 당신의 제한 주장을 믿지 않습니다. Java (예 : C와 달리)는 이미 음수를 확인해야합니다. 이 검사는 사소 (단지 변경 0을 수용하기에 적합 할 수 >= 0> 0). 그러나 나머지 부분에 대해서는 당연히 맞으므로이 제한을 추가하는 것은 의미가 없습니다.
Konrad Rudolph 2011 년

루프 반복 인수는 내 의견으로는 더 나은 것 같습니다. "for (int k = 0; k <strings.length; k ++) {// something}"
dannyxyz22

2
아니,가 아닌 나의 때문에 크기가 0 인 배열없는 세상에서, 의견, (문자 배열 기준) 빈 문자열은 단순히 존재하지 않을 그래서 루프 빈 배열을 고려 할 필요가 없을 것입니다. 이 반복 인수는 매우 실용적인 부작용입니다. 그 세계에서 배열에는 최소한 하나의 항목이 있습니다. (또는 두 있기 때문에 왜 하나 하나의 항목에 대한 배열을 필요?)
안드레아스 돌크

음수 색인과 너무 높은 색인에 대한 확인은 동일한 확인입니다. 음수 색인은 항상 배열 길이보다 작지 않은 부호가 없습니다
harold

26

때로는 null보다 크기가 0 인 배열을 반환하는 것이 훨씬 더 친숙합니다.


9
이를 "Null Object"패턴이라고합니다.
Aleksandr Dubinsky

16

이것을 고려하십시오 (정오의 대답에 대한 더 자세한 설명) :

public String[] getStrings() {
 if( foo ) {
  return null;
 } else {
  return new String[] {"bar, "baz"};
 }
}

String[] strings = getStrings();
if (strings != null) {
 for (String s : strings) {
  blah(s);
 }
}

이제 이것을 다음과 비교하십시오.

public String[] getStrings() {
 if( foo ) {
  return new String[0];
 } else {
  return new String[] {"bar, "baz"};
 }
}

// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
 blah(s);
}

이것은 (널 값이 아닌 빈 배열을 반환하는) 사실 Java API 디자인 세계에서 가장 좋은 방법입니다.

게다가 Java에서는 목록 (예 : ArrayList)을 배열로 변환 할 수 있으며 빈 목록을 빈 배열로 변환하는 것만이 의미가 있습니다.


5

C ++와 동일하므로 데이터가 없을 때보다 깔끔하게 처리 할 수 ​​있습니다.


4

길이가 0 인 배열이 유용 할 수있는 또 다른 경우 : 목록의 모든 요소를 ​​포함하는 배열을 반환하려면 :

<T> T[ ] toArray(T[ ] a)

길이가 0 인 배열을 사용하여 배열 유형을이 메서드에 전달할 수 있습니다. 예를 들면 :

ClassA[ ] result = list.toArray(new ClassA[0]);

길이가 0 인 배열은 여전히 ​​요소가 0 인 Object의 인스턴스입니다.


2

빈 배열이 매우 유용하다고 생각할 수있는 한 가지 경우는 null이 허용되지 않는 상황에서 null 대신 사용하는 것입니다. 한 가지 가능한 예는 배열의 BlockingQueue입니다. 읽기쪽에 입력의 끝을 알리고 싶을 때 어떻게 하시겠습니까? null을 보내는 것은 당연한 선택처럼 보이지만 BlockingQueue는 null을 허용하지 않습니다. " boolean last;"종류의 필드를 사용하여 클래스 내부에 배열을 래핑 할 수 있지만 이는 일종의 과잉입니다. 빈 (크기가 0 인) 배열을 보내는 것이 가장 합리적인 선택 인 것 같습니다.


0

길이가 0 인 배열이 유용한 또 다른 경우는 2 차원 배열을 복사 할 때입니다. 난 쓸수있다:

public int[][] copyArray(int[][] array){
     int[][] newArray = new int[array.length][0];
     for(int i=0;i<array.length;i++){
         newArray[i] = array[i];
     }
     return newArray;

배열의 모든 배열 참조를 덮어 쓰므로 길이가 0 인 배열에 대한 참조로 초기화하는 것이 가장 효율적입니다.


0

0 길이는 byte[], 또는 char[]빈 나타낼 수 String구별되는을 null. (사용하여 문자열에서 배열로 바이트 또는 문자를 얻기 getBytes(), getChars()String클래스 등)과 그 반대의 형성 String에서들 byte[], char[]매우 일반적입니다. 예를 들어, 사용자 지정 인코딩의 경우 문자열 디코딩.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.