에서 C/C++내가 할하는 데 사용
int arr[10] = {0};
... 모든 배열 요소를 0으로 초기화합니다.
Java에도 비슷한 단축키가 있습니까?
루프 사용을 피하고 싶습니다. 가능합니까?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 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의 경우 기본값은 00입니다.
1 차원 배열을 다른 값으로 초기화하려는 경우 java.util.Arrays.fill ()을 사용할 수 있습니다 ( 물론 내부적으로 루프를 사용함).
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);
List<Integer>에 Integer[]에 int[]? 조금 복잡합니다.
Arrays.fill방법으로 2D 배열을 초기화하면 문제가 발생하고 오류가 발생합니다.
자바의 모든 요소 (프리미티브 정수 타입은 byte short, int, long) 기본적으로 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;
그러나 그렇게하면 쓸모없는 기계 사이클 손실이 발생합니다. 많은 어레이가있는 애플리케이션에서 사용하고 각 어레이에 대해 수행하면 애플리케이션 성능이 상당한 수준까지 영향을 미칩니다.
기계 사이클을 많이 사용할수록 ==> 데이터 처리에 더 많은 시간이 소요됩니다 ==> 출력 시간이 크게 증가 합니다. 따라서 응용 프로그램 데이터 처리는 낮은 수준 (일부 수준까지 느림)으로 간주 될 수 있습니다.
기존 배열 크기로 빈 배열을 새로 만들어 배열에 다시 할당 할 수 있습니다. 이것은 다른 것보다 빠를 수 있습니다. 스 니펫 :
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다른 사람들이 언급했듯이 사용할 수도 있습니다 . 스마트 JVM에서 사용할 Arrays.fill 수memcpy 는 있지만 아마도 Java 루프 일 뿐이며 그에 대한 경계 검사입니다.
물론 최적화를 벤치마킹하십시오.
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));
}
}
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]