programing

모든 어레이 요소를 0으로 초기화할 수 있는 숏컷이 있습니까?

goodcopy 2022. 8. 13. 23:27
반응형

모든 어레이 요소를 0으로 초기화할 수 있는 숏컷이 있습니까?

»C/C++에 했었어요

int arr[10] = {0};

...모든 어레이 요소를 0으로 초기화합니다.

자바에도 비슷한 숏컷이 있나요?

루프 사용을 피하고 싶은데 가능한가요?

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

통합형 배열의 기본값 0은 언어 사양에 의해 보증됩니다.

각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소는 생성 시 기본값( initial15.9, 1515.10)으로 초기화됩니다.[...] 유형int은 0,"0" 입니다.0

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

다른 응답은 올바르지만(int 배열 값은 기본적으로 0으로 초기화되어 있습니다), 명시적으로 응답하는 경우(예를 들어 값 42로 채워진 배열을 원하는 경우) Arrays 클래스의 fill() 메서드를 사용할 수 있습니다.

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

또는 1라인 팬이라면 다음과 같은 루틴을 사용할 수 있습니다.

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

arr에게 다음과 같은 값을 부여합니다.

[42, 42, 42]

)Integerint만약 당신이 기본 형식이 필요할 경우 당신이 아파치 공용 ArrayUtils.toPrimitive()일상으로:을 연기할 수 있다.

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

모든 정수형)가 사용됩니다.byte short,int,long을 사용법

어떻게.... 당신의 애플리케이션의 성능을 줄여 줍니다?리드에 관한.

자바 언어 명세에서 기본/초기 값 어떤 개체에 Follows이 주어져야 할 수 있다.

형식 바이트의 경우 기본 값은 0, 그것은,(바이트)의 값은 0입니다.

유형 짧은 내용은 기본 값은 0, 그것은,( 짧은)의 값은 0입니다.

형식 native의 경우 기본 값은 0,0입니다.

종류의 경우 기본 값은 0, 그것은, 0L.

형식 변동 환율제에게는 그것,는 0.0f, 기본 값은 양수 0.

형 이중에게는 그것, 0.0d, 기본 값은 양수 0.

형식 차의 경우 기본 값은 null이 나올 때, 그것은, '\u0000'.

형식 boolean의 경우 기본 값은 거짓이다.

모든 참조 형식의 경우, 기본 값은 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 을 합니다. 실제로 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른른른른른Arrays.fill 수 있다memcpy스마트 JVM에 포함되지만 아마도 Java 루프와 그에 수반되는 경계 확인일 것입니다.

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

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));
   }
 }

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]

어레이를 사용할 수도 있습니다.조건에 따라 값을 채울 경우 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]

즉, 모든 메서드 중 배열을 클래스의 인스턴스 변수로 선언하면 JVM이 기본값으로 0을 클릭합니다.더 이상 걱정하지 않아도 돼

예, 어레이의 int 값은 0으로 초기화됩니다.하지만 당신은 이것을 보장받지 못한다.Oracle 문서에는 이는 잘못된 코딩 관행이라고 나와 있습니다.

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

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

질문에서 올바르게 정의했습니다.C++와 거의 동일합니다.기본 데이터 유형에 대해 필요한 작업은 어레이를 초기화하기만 하면 됩니다.기본값은 int 0 입니다.

int[] intArray = new int[10];

다음 작업을 간단히 수행할 수 있습니다.

 int[] arrayOfZeros= new int[SizeVar];
    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-10123 -3-2-10123 -4-3-2-1012 -5-4-2-101 -6-5-4-3-2-10

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

반응형