Adakah pintasan untuk menginisialisasi semua elemen array ke nol?


282

Di C/C++dulu saya lakukan

int arr[10] = {0};

... untuk menginisialisasi semua elemen array saya ke 0.

Apakah ada jalan pintas serupa di Jawa?

Saya ingin menghindari menggunakan loop, apakah mungkin?

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

2
java.util.Arrays.fill () int [] arr = new int [10]; dan int arr [10] = {0}; semua menggunakan loop internal.
Kevin Kostlan

Jawaban:


574

Nilai default 0 untuk array tipe integral dijamin oleh spesifikasi bahasa :

Setiap variabel kelas, variabel instan, atau komponen array diinisialisasi dengan nilai default ketika dibuat (§15.9, §15.10) [...] Untuk tipe int, nilai default adalah nol, yaitu 0,.  

Jika Anda ingin menginisialisasi array satu dimensi ke nilai yang berbeda, Anda dapat menggunakan java.util.Arrays.fill () (yang tentu saja akan menggunakan loop secara internal).


@MichaelBorgwardt Adalah jawaban yang membantu saya. Apakah itu memiliki biaya yang sama untuk melakukannya dibandingkan dengan untuk loop?
maytham-ɯɐɥʇʎɐɯ

@ maytham-ɯɐɥıλɐɯ: Anda dapat melihat kode sumbernya, ia datang dengan JDK. Persis sama, metodenya terdiri dari apa pun kecuali yang normal, langsung untuk loop.
Michael Borgwardt

@MichaelBorgwardt Bagaimana dengan nilai-nilai array 2 dimensi lokal? Apakah itu termasuk dalam "komponen array?"
Rishi

Arrays.filltidak harus menggunakan loop.
NateS

@NateS: dapatkah Anda memberikan contoh implementasi Java yang tidak?
Michael Borgwardt

105

Sementara jawaban lain benar (nilai array int secara default diinisialisasi ke 0), jika Anda ingin melakukannya secara eksplisit (misalnya, jika Anda ingin array diisi dengan nilai 42), Anda dapat menggunakan metode fill () dari yang Array kelas:

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

Atau jika Anda penggemar 1-liners, Anda dapat menggunakan Collections.nCopies()rutin:

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

Akan memberikan nilai arr:

[42, 42, 42]

(meskipun begitu Integer, dan tidak int, jika Anda membutuhkan tipe primitif, Anda dapat menunda rutin Apache CommonsArrayUtils.toPrimitive() :

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

9
Satu-liners yang baik, tapi List<Integer>untuk Integer[]ke int[]? Itu agak berbelit-belit.
dhardy

2
@ Hardy Tentu, tapi itu sebabnya ada versi 2-line dalam jawabannya juga (jika Anda khawatir tentang faktor "berbelit-belit").
Adam Parkin

menginisialisasi array 2d dengan Arrays.fillmetode menciptakan masalah dan kesalahan terjadi.
AKS

39

Dalam java semua elemen (tipe integer primitif byte short, int, long) yang dijalankan untuk 0 secara default. Anda dapat menyimpan loop.


2
Saya kira ini berlaku untuk tipe primitif ?!
Olimpiu POP

1
Tipe java primitif, seperti int, tidak diinisialisasi.
Mirko Ebert

8
@ tfb785: Ini salah. Seperti yang dinyatakan di atas oleh Michael Borgwardt: tipe integer primitif (pendek, int, panjang) diinisialisasi ke 0.
Arne Deutsch

1
Ya, array java primitif seperti int [] dimulai dengan 0. Tidak, satu tipe java primitif tidak dimulai dengan 0.
Mirko Ebert

3
Ok, tepatnya: anggota kelas primitif (statis atau tidak) diinisialisasi dengan 0. Variabel lokal tidak.
Arne Deutsch

23

Bagaimana Mengurangi Kinerja aplikasi Anda ....? Baca Mengikuti.

Dalam Spesifikasi Bahasa Jawa, Nilai Default / Awal untuk Objek apa pun dapat diberikan sebagai Berikut.

Untuk tipe byte , nilai default adalah nol , yaitu nilai (byte) adalah 0 .

Untuk tipe pendek , nilai default adalah nol , yaitu nilai (pendek) adalah 0 .

Untuk tipe int , nilai standarnya adalah nol , yaitu 0 .

Untuk tipe long , nilai default adalah nol , yaitu 0L .

Untuk tipe float , nilai defaultnya adalah nol positif , yaitu, 0,0f .

Untuk tipe ganda , nilai default adalah nol positif , yaitu, 0,0d .

Untuk tipe char , nilai default adalah karakter nol , yaitu, ' \ u0000 '.

Untuk jenis boolean , yang nilai default adalah palsu .

Untuk semua jenis referensi , nilai standarnya adalah nol .

Dengan Mempertimbangkan semua ini, Anda tidak perlu menginisialisasi dengan nilai nol untuk elemen array karena secara default semua elemen array adalah 0 untuk array int.

Karena sebuah array adalah objek kontainer yang menyimpan sejumlah nilai tetap dari satu tipe. Sekarang Jenis array untuk Anda adalah int jadi pertimbangkan nilai default untuk semua elemen array akan secara otomatis 0 Karena memegang jenis int .

Sekarang mempertimbangkan dengan array yang untuk jenis String sehingga semua elemen array memiliki nilai default adalah nol .

Kenapa tidak melakukan itu ......?

Anda dapat menetapkan nilai nol dengan menggunakan lingkaran seperti yang Anda sarankan dalam Pertanyaan Anda.

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

Tetapi jika Anda melakukannya maka itu akan kehilangan siklus mesin yang tidak berguna. dan jika Anda gunakan dalam aplikasi Anda di mana Anda memiliki banyak array dan Anda melakukannya untuk setiap array maka itu akan mempengaruhi Kinerja Aplikasi hingga tingkat yang cukup tinggi.

Semakin banyak penggunaan siklus mesin ==> Semakin banyak waktu untuk Memproses data ==> Waktu keluaran akan meningkat secara signifikan . sehingga pemrosesan data aplikasi Anda dapat dianggap sebagai level rendah (Perlambat naik ke level tertentu).


17

Anda dapat menyimpan loop, inisialisasi sudah dibuat ke 0. Bahkan untuk variabel lokal.

Tapi tolong perbaiki tempat Anda menempatkan tanda kurung, agar mudah dibaca (praktik terbaik yang diakui):

int[] arr = new int[10];

14

Jika Anda menggunakan Float atau Integer maka Anda dapat menetapkan nilai default seperti ini ...

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

6

Anda dapat membuat array kosong baru dengan ukuran array yang ada, dan Anda dapat menetapkannya kembali ke array Anda. Ini mungkin lebih cepat dari yang lain. Snipet:

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

Hasil:

0
0
0
0
0    
0
0
0
0

1

Ya, nilai int dalam array diinisialisasi ke nol. Tetapi Anda tidak dijamin akan hal ini. Dokumentasi Oracle menyatakan bahwa ini adalah praktik pengkodean yang buruk.


Menurut spesifikasi Bahasa Jawa, bagian 15.10.2 , jika array dibuat dengan pengecualian pembuatan array yang tidak memberikan nilai awal, maka semua elemen array diinisialisasi ke nilai default untuk tipe komponen array - yaitu 0 dalam kasus char []. Ini adalah jaminan; Saya cukup terkejut melihat Oracle menganggapnya sebagai praktik yang buruk.
Ian Robertson

1

Nilai int sudah nol setelah inisialisasi, seperti yang disebutkan semua orang. Jika Anda memiliki situasi di mana Anda sebenarnya perlu mengatur nilai array menjadi nol dan ingin mengoptimalkannya, gunakan 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);

Ini digunakan di memcpybawah perlindungan di sebagian besar atau semua implementasi JRE. Perhatikan penggunaan statis seperti ini aman bahkan dengan beberapa utas, karena kasus terburuk adalah banyak utas yang dialokasikan kembali zerossecara bersamaan, yang tidak melukai apa pun.

Anda juga bisa menggunakan Arrays.fillsebagaimana beberapa orang lain sebutkan. Arrays.fill bisa digunakan memcpydalam JVM cerdas, tetapi mungkin hanya loop Java dan batas memeriksa yang memerlukan.

Benchmark optimisasi Anda, tentu saja.


1

Namun pendekatan lain dengan menggunakan lambda di atas java 8

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

1

Dalam c / cpp tidak ada jalan pintas kecuali untuk menginisialisasi semua array dengan nol subskrip.Ex:

  int arr[10] = {0};

Tetapi di java ada alat ajaib yang disebut Arrays.fill () yang akan mengisi semua nilai dalam array dengan integer pilihan Anda.Ex:

  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

Inisialisasi tidak diperlukan dalam hal nol karena nilai default int di Java adalah nol. Untuk nilai selain nol java.util.Arraysmenyediakan sejumlah opsi, yang paling sederhana adalah metode pengisian.

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]

Kita juga dapat menggunakan Arrays.setAll () jika kita ingin mengisi nilai berdasarkan kondisi:

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

mendeklarasikan array sebagai variabel instan dalam kelas yaitu keluar dari setiap metode dan JVM akan memberikannya 0 sebagai nilai default. Anda tidak perlu khawatir lagi


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.