development

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

big-blog 2020. 4. 1. 08:00
반응형

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


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

int arr[10] = {0};

모든 배열 요소를 0으로 초기화합니다
. Java에도 비슷한 단축키가 있습니까?
루프 사용을 피하고 싶습니다. 가능합니까?

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

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

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

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


다른 답변은 정확하지만 (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);

Java에서는 모든 요소가 기본적으로 0으로 초기화됩니다. 루프를 저장할 수 있습니다.


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

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;

그러나 그렇게하면 쓸모없는 기계 사이클 손실이 발생합니다. 그리고 많은 배열이있는 응용 프로그램에서 사용하고 각 배열에 대해 수행하면 응용 프로그램 성능이 상당한 수준까지 영향을 미칩니다.

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


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

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

int[] arr = new int[10];

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

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

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

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

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


모든 사람들이 언급했듯이 초기화 후 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 루프 일 뿐이며 그에 대한 경계 검사입니다.

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


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

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

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


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

  int arr[10] = {0};

그러나 Java에는 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));
   }
 }

    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

참고 URL : https://stackoverflow.com/questions/2154251/any-shortcut-to-initialize-all-array-elements-to-zero

반응형