모든 배열 요소를 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.