모든 배열 요소를 0으로 초기화하는 단축키가 있습니까?


281

에서 C/C++내가 할하는 데 사용

int arr[10] = {0};

... 모든 배열 요소를 0으로 초기화합니다.

Java에도 비슷한 단축키가 있습니까?

루프 사용을 피하고 싶습니다. 가능합니까?

int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
    arr[i] = 0;
}

2
java.util.Arrays.fill () int [] arr = 새로운 int [10]; int arr [10] = {0}; 모두 내부 루프를 사용합니다.
Kevin Kostlan 4

답변:


574

정수 유형의 배열에 대한 기본값 0은 언어 사양에 의해 보장됩니다 .

각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소는 작성 될 때 기본값으로 초기화됩니다 (§15.9, §15.10) [...] type int의 경우 기본값은 0 0입니다.  

1 차원 배열을 다른 값으로 초기화하려는 경우 java.util.Arrays.fill ()을 사용할 수 있습니다 ( 물론 내부적으로 루프를 사용함).


@MichaelBorgwardt 도움이되었습니다. for 루프와 비교할 때 동일한 비용이 듭니까?
maytham-ɯɐɥʇʎɐɯ

@ maytham-ɯɐɥıλɐɯ : 소스 코드를 볼 수 있으며 JDK와 함께 제공됩니다. 정확히 동일합니다.이 방법은 완벽하게 정상적이고 간단한 for 루프로 구성됩니다.
Michael Borgwardt

@MichaelBorgwardt 로컬 2 차원 배열의 값은 어떻습니까? "어레이 구성 요소"에 해당됩니까?
Rishi

Arrays.fill반드시 루프를 사용할 필요는 없습니다.
NateS

@ NateS : 그렇지 않은 Java 구현의 예를 들어 줄 수 있습니까?
Michael Borgwardt 2018 년

104

다른 답변은 정확하지만 (int 배열 값은 기본적으로 0으로 초기화됩니다) 명시 적으로 수행하려는 경우 (예 : 값 42로 채워진 배열을 원할 경우) fill () 메서드를 사용할 수 있습니다 배열의 클래스 :

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

또는 1 라이너 팬이라면 다음과 같은 Collections.nCopies()루틴을 사용할 수 있습니다 .

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

arr에게 가치를 줄 것입니다 :

[42, 42, 42]

(이것은 Integer아니지만 int, 기본 유형이 필요한 경우 Apache CommonsArrayUtils.toPrimitive() 루틴을 연기 할 수 있습니다 .

int [] primarr = ArrayUtils.toPrimitive(arr);

9
한 - 라이너 좋은, 그러나 List<Integer>Integer[]int[]? 조금 복잡합니다.
dhardy 2016 년

2
@dhardy 물론입니다. 그러나 이것이 답에 2 줄 버전이있는 이유입니다 ( "얽힌"요소에 대해 우려가있는 경우).
Adam Parkin

Arrays.fill방법으로 2D 배열을 초기화하면 문제가 발생하고 오류가 발생합니다.
AKS

39

자바의 모든 요소 (프리미티브 정수 타입은 byte short, int, long) 기본적으로 0으로 초기화된다. 루프를 저장할 수 있습니다.


2
이것이 기본 유형을 보유한다고 가정합니까?!
Olimpiu POP

1
int와 같은 기본 Java 유형은 초기화되지 않습니다.
Mirko Ebert

8
@ tfb785 : 이것은 잘못되었습니다. 마이클 Borgwardt하여 상술 한 바와 같이 정수 프리미티브 타입 (짧은는 INT는 길이)를 0으로 초기화된다
아네 독일어

1
예, int []와 같은 자바 프리미티브 배열은 0으로 시작됩니다. 아니오, 하나의 자바 프리미티브 유형은 0으로 시작되지 않습니다.
Mirko Ebert

3
기본 클래스 멤버 (정적이든 아니든)는 0으로 초기화됩니다. 로컬 변수는 그렇지 않습니다.
Arne Deutsch

23

어떻게 응용 프로그램의 성능을 저하 시키는가? ...? 다음을 읽으십시오.

Java 언어 사양에서는 모든 객체 의 기본값 / 초기 값 을 다음과 같이 지정할 수 있습니다.

byte 유형의 경우 기본값0 이며, 즉 (byte)의 값은 0 입니다.

short 유형의 경우 기본값0 이며, 즉 (short) 값은 0 입니다.

int 유형의 경우 기본값0 , 즉 0 입니다.

long 유형의 경우 기본값0 , 즉 0L 입니다.

float 유형의 경우 기본값양수 0 , 즉 0.0f 입니다.

double 유형의 경우 기본값양수 0 , 즉 0.0d 입니다.

char 유형의 경우 기본값 문자, 즉 ' \ u0000 '입니다.

boolean 유형의 경우 기본값false 입니다.

대한 모든 참조 형디폴트 값은 이다 널 (null) .

이 모든 것을 고려하면 int 배열의 경우 기본적으로 모든 배열 요소가 0이므로 배열 요소의 값을 0으로 초기화 할 필요가 없습니다.

배열 은 단일 유형의 고정 된 수의 값을 보유하는 컨테이너 객체 이기 때문 입니다. 이제 배열의 유형은 int 이므로 모든 배열 요소의 기본값은 자동으로 0 입니다. int 유형을 보유하고 있기 때문입니다 .

이제 모든 배열 요소의 기본값null 이되도록 String 유형배열고려 하십시오 .

왜 그렇게하지 않습니까?

질문에서 제안한대로 루프를 사용하여 null 값을 할당 할 수 있습니다.

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

그러나 그렇게하면 쓸모없는 기계 사이클 손실이 발생합니다. 많은 어레이가있는 애플리케이션에서 사용하고 각 어레이에 대해 수행하면 애플리케이션 성능이 상당한 수준까지 영향을 미칩니다.

기계 사이클을 많이 사용할수록 ==> 데이터 처리에 더 많은 시간이 소요됩니다 ==> 출력 시간이 크게 증가 합니다. 따라서 응용 프로그램 데이터 처리는 낮은 수준 (일부 수준까지 느림)으로 간주 될 수 있습니다.


17

루프를 저장할 수 있으며 이미 0으로 초기화되었습니다. 로컬 변수의 경우에도 마찬가지입니다.

그러나 가독성을 위해 대괄호를 놓은 위치를 수정하십시오 (가장 모범 사례로 인식됨).

int[] arr = new int[10];

14

Float 또는 Integer를 사용하는 경우 다음과 같이 기본값을 지정할 수 있습니다 ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));

6

기존 배열 크기로 빈 배열을 새로 만들어 배열에 다시 할당 할 수 있습니다. 이것은 다른 것보다 빠를 수 있습니다. 스 니펫 :

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

결과 :

0
0
0
0
0    
0
0
0
0

1

예, 배열의 int 값은 0으로 초기화됩니다. 그러나 이것이 보장되지는 않습니다. Oracle 설명서에는 이것이 나쁜 코딩 관행이라고 명시되어 있습니다.


Java 언어 사양의 섹션 15.10.2 에 따르면 초기 값을 제공하지 않는 배열 생성 예외로 배열을 만들면 배열의 모든 요소가 배열의 구성 요소 유형에 대한 기본값 (예 : 0)으로 초기화됩니다. char []의 경우. 이것은 보증입니다. 오라클이 나쁜 습관으로 생각하는 것에 놀랐습니다.
이안 로버트슨

1

모든 사람들이 언급했듯이 초기화 후 int 값은 이미 0입니다. 실제로 배열 값을 0으로 설정해야하고 상황을 최적화하려는 경우 System.arraycopy다음을 사용하십시오 .

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

이것은 memcpy대부분 또는 모든 JRE 구현에서 다루어집니다. 최악의 경우 여러 스레드가 zeros동시에 재 할당되므로 아무 것도 해치지 않기 때문에 이와 같이 정적을 사용하면 여러 스레드에서도 안전 합니다.

Arrays.fill다른 사람들이 언급했듯이 사용할 수도 있습니다 . 스마트 JVM에서 사용할 Arrays.fill memcpy 는 있지만 아마도 Java 루프 일 뿐이며 그에 대한 경계 검사입니다.

물론 최적화를 벤치마킹하십시오.


1

Java 8 이상의 람다를 사용하는 또 다른 접근법

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);

1

c / cpp에는 첨자가 0 인 모든 배열을 초기화하는 것 외에는 지름길이 없습니다.

  int arr[10] = {0};

그러나 자바에는 Arrays.fill ()이라는 마법 도구가있어 배열의 모든 값을 선택한 정수로 채 웁니다.

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }

1

Java에서 int의 기본값이 0이므로 0의 경우 초기화가 필요하지 않습니다. 0 이외의 값 java.util.Arrays은 많은 옵션을 제공하며, 가장 간단한 옵션은 채우기 방법입니다.

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

조건에 따라 값을 채우려면 Arrays.setAll ()을 사용할 수도 있습니다.

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]

0

배열을 클래스의 인스턴스 변수로 선언하십시오. 즉 모든 메소드에서 JVM이 기본값으로 0을 제공합니다. 더 이상 걱정할 필요가 없습니다


-3
    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

결과 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10

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