Array Java dua dimensi. Array Jawa. Array di Jawa. Jawa untuk pemula. Mengembalikan array dari metode

adalah kumpulan nilai yang diurutkan, atau daftar bernomor link yang dieksekusi dengan nama umum. Ini bisa berupa nilai primitif, objek, atau bahkan array lain, tetapi semua nilai array harus bertipe sama. Tipe array identik dengan tipe nilai yang dikandungnya.

Array adalah tipe data referensi, sebenarnya, seperti semua tipe lainnya, kecuali tipe primitif. Izinkan saya mengingatkan Anda lagi bahwa di Java segala sesuatu adalah objek, kecuali tipe primitif.

Array bisa satu dimensi atau multi dimensi.

Proses pembuatan array dapat dibagi menjadi tiga tahap:

  • Pengumuman ( pernyataan)
  • Penciptaan ( instan)
  • Inisialisasi ( inisialisasi)

Deklarasi array

Pada tahap ini baru ditentukan tipe variabel link (referensi) ke susunan , berisi tipe array. Untuk melakukan ini, tuliskan nama jenis elemen array, tanda kurung siku menunjukkan hal itu referensi ke array dideklarasikan , bukan variabel sederhana, dan nama variabel tipe referensi dicantumkan, misalnya:

angka ; // angka merujuk pada array int
Rangkaian str ; // str referensi ke array string
byte
duaBytes ; // referensi duaBytes ke array dua dimensi byte
arang
surat , angka ; //referensi huruf dan angka ke array karakter

Pada dasarnya, mendeklarasikan array adalah operasi yang sama persis dengan mendeklarasikan tipe data lainnya, meskipun memiliki sintaks yang sedikit berbeda, karena ini masih berupa array.

Java mendukung sintaks deklarasi variabel array lain yang menyediakan kompatibilitas dengan C dan C++. Menurut sintaksis ini, satu atau lebih pasang tanda kurung siku mengikuti nama variabel, bukan nama tipe:

arrayOfBytes ; // Sama seperti byte arrayOfBytes
byte arrayOfArrayOfBytes ; // Sama seperti byte arrayOfArrayOfBytes
byte arrayOfArrayOfBytes ; // Sama seperti byte arrayOfArrayOfBytes

Namun, sintaksis ini sering kali membingungkan dan harus dihindari. Dalam contoh berikut, mudah untuk membingungkan apa yang dimaksud:

tarif , tingkat maksimal ; // mungkin mereka ingin mendeklarasikan dua array?

Sintaks ini tidak disarankan untuk digunakan, karena telah dikatakan membingungkan, selain itu, dalam konvensi pemformatan kode Java, disarankan menggunakan sintaks yang diberikan terlebih dahulu, yaitu tanda kurung siku segera ikuti jenis array yang dideklarasikan.

DI DALAM dalam hal ini Array nilai tipe float dengan nama rates dan variabel float – maxRate – dideklarasikan.

Artinya, jika tanda kurung siku muncul tepat setelah tipe array yang dideklarasikan, maka semua variabel yang dideklarasikan pada baris ini adalah referensi ke array dengan tipe yang dideklarasikan, dan jika tanda kurung muncul di sebelah kanan variabel, maka hanya itu saja referensi ke array dari tipe yang dideklarasikan.

Perlu dipahami hal itu operasi ini mendeklarasikan array belum membuat array, tetapi hanya mendeklarasikan variabel yang menjadi referensinya, yang tidak dapat digunakan dalam program tanpa inisialisasi, karena kompiler akan menghasilkan kesalahan karena variabel array tidak diinisialisasi.

Meskipun variabel array yang dideklarasikan tidak terdefinisi, variabel tersebut dapat berisi (jika Anda menetapkan) suatu nilai batal. Dan hanya setelah definisi itu akan berisi tautan ke objek tertentu.

Tidak mungkin untuk menentukan panjang array ketika mendeklarasikan variabel array karena ukurannya sepenuhnya merupakan fungsi dari objek array, bukan referensinya.

Instansiasi array

Pada tahap ini, jumlah elemen array, yang disebut ukurannya, ditunjukkan, ruang dialokasikan untuk array RAM, variabel referensi ditetapkan oleh operator = alamat susunan. Semua tindakan ini dilakukan oleh operator baru diikuti oleh jenis elemen susunan. Misalnya:

= baru arang [ 10 ] ;

Namun perlu dicatat sekali lagi bahwa sebelum ini, variabel huruf harus dideklarasikan sebagai array. Untuk lebih jelasnya dapat direpresentasikan seperti ini:

surat ; // mendeklarasikan huruf sebagai referensi ke array char
surat = baru arang [ 10 ] ; // membuat array karakter dengan ukuran 10 elemen

Saat Anda membuat array dengan sintaks ini, semua elemen array secara otomatis diinisialisasi ke nilai default. Ini salah untuk nilai boolean, "\u0000" untuk nilai char, 0 untuk nilai integer, 0,0 untuk nilai float, dan null untuk objek atau array.

Di Java, ukuran array bersifat tetap. Array yang dibuat tidak dapat ditambah atau dikurangi. Ukuran yang diinginkan dari array yang dibuat ditentukan oleh bilangan bulat non-negatif. Tapi kapan saja tipe variabel array dapat dipetakan ke array baru dengan ukuran berbeda. Artinya, referensi ke array lain dengan tipe yang sama dengan variabel yang dideklarasikan dapat diberikan.

Indeks array selalu dimulai dari 0.

Dua operasi pertama: mendeklarasikan dan membuat array dapat digabungkan menjadi satu operator. Misalnya:

surat = baru arang [ 10 ] ;

Operator ini setara dengan dua operator di atas.

Setelah operasi ini, variabel huruf sudah berisi referensi ke array dan jika kita mencoba menampilkan nilainya, kita akan mendapatkan nilai seperti ;
ke dalam B = A;

Namun kita harus ingat bahwa variabel A Dan B arahkan ke array yang sama. Ini mungkin membingungkan pada awalnya, tetapi jika Anda ingat bahwa kita berurusan dengan tipe data referensi, maka semuanya akan beres. Jika poin ini tidak jelas, maka nanti kita akan menganalisis semua ini dengan contoh.

= batal ;

Setelah ini, array menunjuk ke tautan ini, hilang jika tidak ada referensi lain terhadapnya.

Ukuran atau panjang array dapat diperoleh dengan menggunakan konstanta panjang , yang ditentukan untuk setiap larik dan mengembalikan panjangnya. Kami telah menggunakannya lebih dari sekali dalam contoh ketika kami bekerja dengan argumen yang diteruskan baris perintah.

Anda dapat membuat dan menggunakan array dengan panjang nol (array kosong). Misalnya:

bit = baru boolean [ 0 ] ;

Tidak mungkin untuk menginisialisasi array seperti itu, karena array tersebut tidak memiliki elemen yang dapat diinisialisasi. Pertanyaan segera muncul: mengapa mereka membutuhkan array kosong ini? Tapi itu penting dan bahkan sangat berguna!

Merupakan kebiasaan untuk menggunakan array kosong di tempat-tempat dalam program yang tidak diketahui sebelumnya apakah akan ada elemennya atau tidak. Jika ada elemen, maka array yang tidak kosong dikembalikan; jika tidak ada elemen, array kosong dikembalikan. Contohnya adalah array string yang diteruskan ke metode main() dan berisi argumen baris perintah, dan jika tidak ada, maka array kosong akan dikembalikan.

Array kosong lebih baik daripada batal, karena tidak memerlukan if yang terpisah untuk diproses. Hal yang sama berlaku untuk daftar dan koleksi lainnya.

Inisialisasi array

Pada tahap ini, elemen array menerima nilai awal. Ada beberapa cara untuk menginisialisasi elemen array dengan nilai:

  1. Tetapkan nilai tertentu untuk setiap elemen array (ini bisa dilakukan, misalnya, dalam satu loop, tetapi sebelum itu array harus sudah dideklarasikan dan dibuat)
  2. Inisialisasi array dengan mencantumkan nilai elemennya dalam kurung kurawal (ini dapat dilakukan pada tahap deklarasi dan tahap pembuatan, tetapi sintaksnya berbeda)

Anda dapat mengakses elemen array tertentu berdasarkan indeksnya, yang dimulai dari awal, seperti yang telah disebutkan.

Indeks dapat ditentukan dengan ekspresi bilangan bulat apa pun kecuali tipe panjang , misalnya a , a , a[++i] . Pertunjukan sistem Jawa memastikan bahwa nilai ekspresi ini tidak melebihi panjang array. Jika jalan keluar terjadi, juru bahasa Java akan berhenti menjalankan program dan menampilkan pesan di konsol yang menunjukkan bahwa indeks array telah melampaui batas definisinya ( ArrayIndexOutOfBoundsException).

Mari kita lihat contoh metode inisialisasi pertama:

ar = baru ke dalam [ 2 ] ;
ar[ 0 ] = 1 ;
ar[ 1 ] = 2 ;

Metode inisialisasi kedua dapat diimplementasikan dengan berbagai cara.

Inisialisasi array dapat dikombinasikan dengan tahap pembuatan, tetapi sebelum operasi ini array harus sudah dideklarasikan. Misalnya:

ar ; // deklarasi array
ar = baru ke dalam { 1 , 2 } ; // pembuatan dan inisialisasi

Sebelum membuat dan menginisialisasi array ar itu sudah diumumkan.

Anda juga dapat menginisialisasi array pada tahap mendeklarasikannya menggunakan sintaks berikut:

ar = { 1 , 2 } ; // deklarasi, pembuatan dan inisialisasi array

Perhatian! Sintaks inisialisasi array ini hanya berfungsi ketika mendeklarasikan array dan menggabungkan ketiga operasi: deklarasi, pembuatan, dan inisialisasi. Jika array sudah dideklarasikan, maka sintaks ini tidak dapat digunakan. Kompiler akan membuat kesalahan. Yaitu:

ke dalam ar ; // deklarasi array
ar = { 1 , 2 } ; // KESALAHAN!!! membuat dan menginisialisasi array

Tindakan seperti ini tidak akan berhasil.

Anda juga dapat melakukan inisialisasi pada tahap deklarasi dan sedikit berbeda:

ar = baru ke dalam { 1 , 2 } ; // deklarasi, pembuatan dan inisialisasi

Meskipun sintaks ini lebih panjang. Jika Anda perhatikan, sintaks ini juga merupakan kombinasi dari ketiga operasi: deklarasi, pembuatan, dan inisialisasi.

Java menyediakan sintaks yang mendukung array anonim (tidak ditugaskan ke variabel dan karenanya tidak memiliki nama). Terkadang Anda hanya perlu menggunakan array satu kali (misalnya, meneruskannya ke suatu metode), jadi Anda tidak ingin membuang waktu untuk menugaskannya ke variabel, sehingga Anda dapat langsung menggunakan hasil operator baru. Misalnya:

. keluar . cetakln( baru arang { "H", "e", "aku", "aku", "Hai"}) ;

Sintaks untuk menginisialisasi array menggunakan kurung kurawal disebut literal karena literal array digunakan untuk inisialisasi.

Penting untuk dipahami bahwa array literal dibuat dan diinisialisasi selama eksekusi program, dan bukan selama kompilasi.. Pertimbangkan literal array berikut:

Angka sempurna = { 6 , 28 } ;

Ini dikompilasi ke bytecode Java seperti ini:

Angka sempurna = baru ke dalam [ 2 ] ;
Angka sempurna[ 0 ] = 6 ;
Angka sempurna[ 1 ] = 28 ;

Oleh karena itu, jika Anda perlu menempatkannya program Jawa banyak data, lebih baik tidak memasukkannya langsung ke dalam array karena kompiler Java harus membuat banyak bytecode inisialisasi array dan kemudian juru bahasa Java harus dengan susah payah mengeksekusi semua kode itu. Dalam kasus seperti itu, lebih baik menyimpan data di dalamnya berkas eksternal dan membacanya ke dalam program selama eksekusinya.

Namun, fakta bahwa Java menginisialisasi array pada saat runtime memiliki konsekuensi penting. Ini berarti bahwa elemen array literal adalah ekspresi arbitrer yang dievaluasi saat runtime, bukan ekspresi konstan yang dievaluasi oleh kompiler. Misalnya:

poin = { lingkaran1.getCenterPoint () , lingkaran2.getCenterPoint () } ;

Sekarang mari kita berlatih sedikit.

Metode main() yang terkenal menggunakan kemampuan untuk mengembalikan array dengan panjang nol jika tidak ada argumen pada baris perintah, sehingga menghindari penggunaan pernyataan if untuk memeriksa null guna menghindari kesalahan selama eksekusi program.

Artinya, kita bisa langsung menggunakan array dalam satu loop, meskipun mengikuti aturan agar tidak melampaui indeks maksimal.

Di awal program, kita mencetak panjang array, dan kemudian pada loop pertama kita mencetak semua nilai elemen array secara berurutan. Putaran kedua melakukan hal yang sama, tetapi dengan cara yang memutarbalikkan.

Contoh kedua, saya ucapkan halo, untuk menyenangkan otak Anda, untuk memperluas kesadaran Anda, Anda tidak bosan, Anda tahu apa yang boleh Anda lakukan, tetapi apa yang tidak boleh Anda lakukan, dan murni untuk tujuan pendidikan. Mungkin di waktu luang Anda bisa mengetahui cara kerja siklus kedua.

Program ini menghasilkan output berikut:

Dalam kasus pertama, kami tidak memasukkan argumen apa pun, jadi kami mendapatkan array dengan panjang nol, yang tidak diproses dalam loop karena tidak memenuhi kondisi loop.

Dalam kasus kedua, kami meneruskan argumen pada baris perintah dan oleh karena itu array diproses dalam loop.

  • tutorial

Saya rasa hanya sedikit dari mereka yang mempersiapkan wawancara pertama mereka, ketika melamar pekerjaan pertama mereka sebagai programmer (pra) junior, akan menjawab pertanyaan ini dengan negatif. Atau setidaknya meragukan jawaban positifnya. Tentu saja, struktur data sederhana dengan akses indeks langsung - tidak ada trik! Tidak, dalam beberapa bahasa Tipe JavaScript atau array PHP, tentu saja, diimplementasikan dengan cara yang sangat menarik dan pada dasarnya lebih dari sekedar array. Tapi ini bukan yang kita bicarakan, tapi tentang implementasi array "tradisional" dalam bentuk "memori berkelanjutan". Dalam hal ini, berdasarkan indeks dan ukuran satu elemen, alamat dihitung secara sederhana dan nilai terkait diakses. Apa susahnya?
Mari kita cari tahu. Misalnya saja di Pulau Jawa. Meminta pemohon yang tidak menaruh curiga untuk membuat array bilangan bulat N X N. Orang tersebut dengan percaya diri menulis sesuatu seperti:
int g = baru int[n][n];
Besar. Sekarang kami meminta Anda untuk menginisialisasi elemen array dengan sesuatu. Setidaknya dalam satuan, setidaknya sebagai jumlah indeks. Kami mendapatkan:
untuk(int saya = 0; saya< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
Mereka bahkan lebih sering menulis
untuk(int saya = 0; saya< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
yang juga merupakan alasan untuk berdiskusi, tetapi sekarang kita membicarakan hal lain. Kami mencoba mencari tahu apa yang diketahui seseorang dan melihat bagaimana dia berpikir. Oleh karena itu, kami menarik perhatiannya pada fakta bahwa nilainya terletak secara simetris dan memintanya untuk menghemat iterasi loop. Tentu saja, mengapa harus melewati semua nilai indeks jika Anda hanya bisa melewati segitiga terbawah? Subjek biasanya dengan mudah menyetujui dan dengan bijak menyorot diagonal utama, dengan hati-hati menulis sesuatu seperti:
untuk(int saya = 0; saya< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
Dari pada g[i][i] = 2* i;<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: sering ditulis g[i][i] = i + i; atau g[i][i] = saya
Seberapa cepat program ini akan berjalan? N. Alasan yang umum adalah sebagai berikut: perhitungan indeks hampir 2 kali lebih sedikit; perhitungan nilai hampir 2 kali lebih sedikit (penjumlahan); jumlah tugas yang sama. Ini berarti 30 persen lebih cepat. Jika seseorang memiliki latar belakang matematika yang baik, Anda bahkan dapat melihat jumlah pasti operasi yang disimpan dan penilaian yang lebih masuk akal mengenai efektivitas pengoptimalan.

Sekarang adalah waktunya untuk pukulan utama. Kami menjalankan kedua versi kode pada nilai yang cukup besar

(sekitar beberapa ribu), misalnya seperti ini.< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


Kode yang dikontrol waktu
kelas A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;
Apa yang kita lihat? Versi yang dioptimalkan bekerja 10-100 kali lebih lambat! Kini saatnya mengamati reaksi kandidat terhadap posisi tersebut. Apa reaksi terhadap situasi stres yang tidak biasa (lebih tepatnya, biasa dalam praktik pengembang). Jika wajah terdakwa menunjukkan kegembiraan dan dia mulai menekan tombol, untuk sementara melupakan keberadaan Anda, maka ini pertanda baik. Sampai batas tertentu. Anda tidak ingin mempekerjakan seorang peneliti yang tidak peduli dengan hasil proyek, bukan? Maka jangan tanyakan padanya pertanyaan "Mengapa?" Minta mereka untuk mengerjakan ulang opsi kedua agar benar-benar bekerja lebih cepat daripada opsi pertama.

Sekarang Anda dapat menjalankan bisnis Anda dengan aman untuk sementara waktu. Dalam setengah jam Anda akan memiliki cukup materi untuk menilai kualitas dasar pribadi dan profesional pelamar.

Waktu program; menggunakanWindows;


var mulai, selesai, res: int64;
n, saya, j: Bilangan bulat;
g: Array dari Array Integer; mulai n:= 10.000;
SetPanjang(g, n, n);

QueryPerformanceFrequency(res); N QueryPerformanceCounter (mulai);
untuk i:=1 sampai n-1 lakukan untuk j:=1 sampai n-1 lakukan g := i + j;

QueryPerformanceCounter (selesai);

writeln("Waktu per baris:", (selesai - mulai) / res, " detik");
QueryPerformanceCounter (mulai);
untuk i:=1 sampai n-1 lakukan untuk j:=1 sampai n-1 lakukan g := i + j;
Sebenarnya, saya memperhatikan efek ini justru sehubungan dengan tugas pemrosesan gambar yang sebenarnya. Situasinya agak membingungkan dan saya tidak langsung mengerti mengapa fps saya turun drastis setelah refactoring. Secara umum, setiap orang mungkin memiliki banyak momen indah seperti itu.

Sejauh ini versi terdepan adalah cache prosesor yang menjadi penyebabnya. Itu. akses berurutan pada opsi pertama berfungsi dalam hash, yang diperbarui ketika bergerak melampaui batas tertentu. Saat mengakses berdasarkan kolom, hash dipaksa untuk terus diperbarui dan ini membutuhkan banyak waktu. Mari kita periksa versi ini dalam bentuknya yang paling murni. Mari kita membuat array dan membandingkan mana yang lebih cepat - memproses semua elemen dalam satu baris atau memproses elemen array dengan nomor acak dalam jumlah yang sama? Program ini adalah ideone.com/tMaR2S. Untuk 100.000 elemen array, akses acak biasanya terasa lebih cepat. Apa artinya ini?
Di sini dengan tepat ditunjukkan kepada saya (Big_Lebowski) bahwa mengatur ulang loop akan mengubah hasil yang mendukung opsi berurutan. Demi kemurnian eksperimen, saya harus menyiapkan siklus pemanasan. Pada saat yang sama, saya melakukan beberapa pengulangan untuk mendapatkan waktu pengoperasian rata-rata seperti yang disarankan Leventov. Ternyata seperti ini ideone.com/yN1H4g. Itu. Akses acak ke elemen array besar ~10% lebih lambat dibandingkan akses berurutan. Mungkin cache sebenarnya memainkan peran tertentu. Namun, dalam situasi awal, kinerjanya turun secara signifikan. Jadi ada hal lain.

Secara bertahap, versi tentang tindakan tambahan saat berpindah dari satu baris array ke baris lainnya menjadi yang terdepan. Dan itu benar. Masih mencari tahu apa yang sebenarnya terjadi di sana.

Tag: Tambahkan tag

Himpunan adalah struktur data yang dirancang untuk menyimpan data dengan tipe yang sama. Array bekerja secara berbeda di Java dibandingkan di C/C++. Keunikan:

  • Karena array adalah objek, kita dapat mengetahui panjangnya. Ini berbeda dengan C/C++ di mana kita mencari panjangnya menggunakan sizeof.
  • Variabel array juga bisa berupa .
  • Variabelnya diurutkan dan memiliki indeks mulai dari 0.
  • Dapat juga digunakan sebagai bidang statis, variabel lokal, atau parameter metode.
  • Ukuran array harus ditentukan sebagai int, bukan panjang atau pendek.
  • Superkelas langsung dari tipe array adalah Object.
  • Setiap tipe array mengimplementasikan antarmuka Cloneable dan java.io.Serializable.

Inisialisasi dan akses array

Array Satu Dimensi: Bentuk Umum Deklarasi

Ketik nama-var; atau ketik nama-var;

Deklarasi terdiri dari dua komponen: tipe dan nama. type mendeklarasikan tipe elemen array. Tipe elemen menentukan tipe data setiap elemen.

Selain tipe int, kita juga bisa membuat array dari tipe data lain seperti char, float, double atau tipe data yang ditentukan pengguna (objek kelas). Misalnya:

// keduanya merupakan deklarasi yang valid int intArray; atau int intArray; byte byteArray; celana pendekArray; boolean booleanArray; array panjang; mengapung floatArray; ganda gandaArray; char charArray; // array referensi ke objek // kelas MyClass (kelas yang dibuat oleh // pengguna) MyClass myClassArray; Objek ao, // array Koleksi Objek ca; // array Koleksi // tipenya tidak diketahui

Meskipun deklarasi pertama di atas menetapkan fakta bahwa intArray adalah variabel array, array sebenarnya tidak ada. Ini hanya memberi tahu kompiler bahwa variabel ini bertipe integer.

Untuk mengasosiasikan array int dengan array fisik bilangan bulat yang sebenarnya, Anda perlu menandainya dengan new dan menugaskannya ke int.

Cara membuat array di Java

Saat mendeklarasikan array, hanya referensi ke array yang dibuat. Untuk benar-benar membuat atau mengalokasikan memori ke sebuah array, Anda perlu membuat array seperti ini: Bentuk umum new ketika diterapkan pada array satu dimensi adalah sebagai berikut:
var-nama = tipe baru;

Di sini tipe menunjukkan tipe data, ukuran adalah jumlah elemen dalam array, dan nama var adalah nama variabel array.

intArray; //deklarasi intArray = int baru; // alokasi memori

Int intArray = int baru; // persatuan

Penting untuk diketahui bahwa elemen array yang dialokasikan oleh fungsi baru secara otomatis diinisialisasi ke nol (untuk tipe numerik), false (untuk tipe Boolean), atau nol (untuk tipe referensi).
Mendapatkan array adalah proses dua langkah. Pertama, Anda perlu mendeklarasikan variabel dengan tipe yang diinginkan. Kedua, Anda perlu mengalokasikan memori yang akan berisi array menggunakan yang baru dan menugaskannya ke variabel. Jadi, di Java, semua array dialokasikan secara dinamis.

Array literal

Dalam situasi dimana ukuran array dan variabel sudah diketahui, literal dapat digunakan.

Int intArray = int baru( 1,2,3,4,5,6,7,8,9,10 );

  • // Mendeklarasikan array secara literal
  • Panjang array ini menentukan panjang array yang dibuat.

Tidak perlu menulis int di Java versi terbaru

Setiap elemen array diakses melalui indeksnya. Indeks dimulai dari 0 dan berakhir pada (ukuran total)-1. Semua elemen dapat diakses menggunakan for loop.

Untuk (int saya = 0; saya< arr.length; i++) System.out.println("Element at index " + i + " : "+ arr[i]);

// Contoh untuk mengilustrasikan pembuatan array
// bilangan bulat, memasukkan beberapa nilai ke dalam array,
// dan mencetak setiap nilai.

kelas GFG
{
{
ke dalam arr;

// mengalokasikan memori untuk 5 bilangan bulat.
arr = int baru;


arr = 10;


arr = 20;

//segera...
arr = 30;
arr = 40;
arr = 50;

// mengakses elemen array yang ditentukan
untuk (int saya = 0; saya< arr.length; i++)
System.out.println("Elemen pada indeks " + i +
" : "+ arr[i]);
}
}
Hasilnya kita mendapatkan:

Elemen pada indeks 0:10 Elemen pada indeks 1:20 Elemen pada indeks 2:30 Elemen pada indeks 3:40 Elemen pada indeks 4:50

Array objek

Array objek dibuat dengan cara yang sama seperti elemen data sebagai berikut:

Siswa arr = Siswa baru;

StudentArray berisi tujuh elemen memori masing-masing kelas siswa, di mana alamat tujuh objek Siswa dapat disimpan. Objek siswa harus dibuat menggunakan konstruktor kelas siswa dan referensinya harus ditetapkan ke elemen array sebagai berikut:

Siswa arr = Siswa baru;

// Program Java untuk mengilustrasikan pembuatan array
// objek

siswa kelas
{
publik int roll_no;
nama String publik;
Siswa(int roll_no, Nama string)
{
this.roll_no = roll_no;
ini.nama = nama;
}
}

// Elemen array adalah objek dari kelas Siswa.
GFG kelas publik
{
public static void main (String args)
{
// mendeklarasikan Array bilangan bulat.
Arr siswa;

// mengalokasikan memori untuk 5 objek bertipe Student.
arr = Siswa baru;

// inisialisasi elemen pertama array
arr = Siswa baru(1,"aman");

// inisialisasi elemen kedua dari array
arr = Siswa baru(2,"vaibhav");

//segera...
arr = Siswa baru(3,"shikar");
arr = Siswa baru(4,"dharmesh");
arr = Siswa baru(5,"mohit");

// mengakses elemen array yang ditentukan
untuk (int saya = 0; saya< arr.length; i++)
System.out.println("Elemen pada " + i + " : " +
arr[i].roll_no +" "+ arr[i].nama);
}
}

Kami mendapatkan:

Elemen pada 0:1 aman Elemen pada 1:2 vaibhav Elemen pada 2:3 shikar Elemen pada 3:4 dharmesh Elemen pada 4:5 mohit

Apa yang terjadi jika kita mencoba mengakses elemen di luar array?
Kompiler menampilkan ArrayIndexOutOfBoundsException yang menunjukkan bahwa array diakses pada indeks yang tidak valid. Indeksnya bisa negatif atau lebih besar atau sama dengan ukuran array.

Multidimensi

Array multidimensi adalah array dari array yang setiap elemennya berisi referensi ke array lain. Dibuat dengan menambahkan satu set tanda kurung siku () untuk setiap dimensi. Mari kita lihat sebuah contoh:

Int intArray = int baru; //array atau matriks 2D int intArray = int baru; //sebuah susunan 3D

Kelas multidimensi
{
public static void main (String args)
{
// mendeklarasikan dan menginisialisasi array 2D
int arr = ( (2,7,9),(3,6,1),(7,4,2) );

// mencetak larik 2D
untuk (int i=0; i< 3 ; i++)
{
untuk (int j=0; j< 3 ; j++)
Sistem.keluar.cetak(arr[i][j] + " ");

Sistem.keluar.println();
}
}
}

Keluaran: 2 7 9 3 6 1 7 4 2


Melewati array ke suatu metode

Sama seperti variabel, kita bisa meneruskan array ke metode.

// Program Java untuk mendemonstrasikan // meneruskan array ke kelas metode Test ( // Metode driver public static void main(String args) ( int arr = (3, 1, 2, 5, 4); // meneruskan array ke metode m1 sum(arr); ) public static void sum(int arr) ( // mendapatkan jumlah nilai array int sum = 0; for (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

Pada output kita mendapatkan:

jumlah nilai array: 15

Mengembalikan array dari metode

Seperti biasa, metode ini juga dapat mengembalikan sebuah array. Misalnya, program di bawah ini mengembalikan array dari metode m1.

// Program Java untuk mendemonstrasikan // pengembalian array dari kelas metode Test ( // Metode driver public static void main(String args) ( int arr = m1(); for (int i = 0; i< arr.length; i++) System.out.print(arr[i]+" "); } public static int m1() { // returning array return new int{1,2,3}; } }

Objek kelas

Setiap array memiliki objek kelas terkait yang dibagikan dengan semua array lain dengan tipe komponen yang sama.

// Program Java untuk mendemonstrasikan // Objek Kelas untuk Array class Test ( public static void main(String args) ( int intArray = int baru; byte byteArray = byte baru; short shortsArray = short baru; // array dari String String strArray = String baru; Sistem.keluar.println(intArray.getClass()); Sistem.keluar.println(intArray.getClass().getSuperclass()); Sistem.keluar.println(byteArray.getClass()); getClass()); Sistem.keluar.println(strArray.getClass());

kelas +" "); ) ) )

Kloning dari larik multidimensi (seperti Object ) adalah salinan, artinya ia hanya membuat satu larik baru dengan setiap elemen dan referensi ke larik elemen asli, namun larik bertumpuk digunakan bersama.

// Program Java untuk mendemonstrasikan // mengkloning array multidimensi class Test ( public static void main(String args) ( int intArray = ((1,2,3),(4,5)); int cloneArray = intArray. clone(); // akan mencetak false System.out.println(intArray == cloneArray); // akan mencetak true saat salinan dangkal dibuat // yaitu sub-array dibagikan System.out.println(intArray == cloneArray) ; Sistem.keluar.println(intArray == cloneArray) )

PALSU
BENAR
BENAR


Belajar untuk menjadi "Pengembang Game" + pekerjaan

Array Java

Array adalah struktur data yang menyimpan nilai dengan tipe yang sama. Elemen array individual diakses menggunakan indeks integer. Misalnya, jika a adalah larik bilangan bulat, maka nilai ekspresi a[i] sama dengan bilangan bulat ke-i dalam larik tersebut.

Sebuah array dideklarasikan sebagai berikut: pertama, tipe array ditunjukkan, yaitu tipe elemen yang terdapat dalam array, diikuti dengan sepasang tanda kurung siku kosong, dan kemudian nama variabel. Misalnya, berikut cara mendeklarasikan array yang terdiri dari bilangan bulat:
ke dalam;

Namun, pernyataan ini hanya mendeklarasikan variabel a, tanpa menginisialisasinya dengan array sebenarnya. Untuk membuat array, Anda perlu menggunakan operator baru.

Operator ini membuat array yang terdiri dari 100 bilangan bulat. Elemen array ini diberi nomor dari 0 hingga 99 (bukan dari 1 hingga 100). Setelah dibuat, array dapat diisi, misalnya menggunakan loop.

int a = int baru;
untuk (int saya = 0; saya< 100; i++)
a[saya] = saya; // Mengisi array dengan angka dari 0 hingga 99.

Jika Anda mencoba mengakses elemen a (atau elemen lain yang indeksnya berada di luar rentang 0 hingga 99) dengan membuat array yang terdiri dari 100 elemen, program akan berhenti karena akan terjadi pengecualian indeks array di luar rentang.
Untuk menghitung jumlah elemen dalam array, gunakan metode nameMass.
va.panjang.

Misalnya,

untuk (int saya = 0; saya< a. length; i++ System.out.println (a[i]);

Setelah array dibuat, ukurannya tidak dapat diubah (walaupun tentu saja Anda dapat mengubah elemen individualnya). Jika Anda perlu sering mengubah ukuran array selama eksekusi program, lebih baik menggunakan struktur data lain yang disebut daftar array.

Sebuah array dapat dideklarasikan dengan dua cara:

ke dalam;
atau
ke dalam;

Kebanyakan programmer Java lebih memilih gaya pertama karena lebih jelas memisahkan tipe array int dari nama variabel.

Inisialisasi array dan array yang tidak disebutkan namanya

Java memiliki fasilitas untuk membuat array dan menginisialisasinya secara bersamaan. Berikut adalah contoh struktur sintaksis tersebut:

int bilangan prima kecil = ( 2, 3, 5, 7, 11, 13);

Perhatikan bahwa dalam hal ini tidak perlu menggunakan operator baru. Selain itu, Anda bahkan dapat menginisialisasi array yang tidak disebutkan namanya:

int baru (16, 19, 23, 29, 31, 37)

Ekspresi ini mengalokasikan memori untuk array baru dan mengisinya dengan angka yang ditentukan dalam kurung kurawal. Dalam hal ini, jumlahnya dihitung dan, dengan demikian, ukuran array ditentukan. Konstruksi sintaksis ini mudah digunakan untuk menginisialisasi ulang array tanpa membuat variabel baru. Misalnya saja ungkapan

smallPrimes = int baru (17, 19, 23, 29, 31, 37 );
adalah ekspresi singkat
int anonim = (17, 19, 23, 29, 31, 37 );
smailPrimes = anonim;

Anda dapat membuat array berukuran nol. Array seperti itu dapat berguna ketika menulis metode yang mengevaluasi array yang ternyata kosong. Array dengan panjang nol dideklarasikan sebagai berikut:

tipe elemen baru

Perhatikan bahwa array seperti itu tidak setara dengan objek nol.

Menyalin array

Satu array dapat disalin ke array lain, tetapi kedua variabel akan merujuk ke array yang sama.

int angka keberuntungan = smailPrimes;
angka beruntung = 12; // Sekarang elemen smailPrimes juga 12.

Hasilnya ditunjukkan pada Gambar. 3.14. Jika Anda perlu menyalin semua elemen dari satu array ke array lainnya, Anda harus menggunakan metode arraycopy dari kelas System. Panggilannya terlihat seperti ini:

System.arraycopy(dari, darilndex, ke, tolndex, hitung);

Array to harus cukup besar untuk menampung semua elemen yang akan disalin.

Beras. 3.14. Menyalin array

Misalnya, operator yang ditunjukkan di bawah ini, yang hasilnya ditunjukkan pada Gambar. 3.15, buat dua larik, lalu salin empat elemen terakhir larik pertama ke larik kedua. Penyalinan dimulai dari posisi kedua dalam larik sumber, dan elemen yang disalin ditempatkan di larik target mulai dari posisi ketiga.

int smailPrimes = (2, 3, 5, 7, 11, 13);
int angka keberuntungan = (1001, 1002, 1003, 1004, 1005, 1006, 1007);
System.aggausor(smailPrimes, 2, luckyNumbers, 3, 4);
untuk (int saya = 0; saya< luckyNumbers.length; i++)
System.println(i +.": " + luckyNumbersfi]);

Mengeksekusi pernyataan ini menghasilkan hasil sebagai berikut.

0: 1001
1: 1002
2: 1003
3: 5
4: 7
5: 11
6: 13

Beras. 3.15. Menyalin Elemen Array

Array di Java sangat berbeda dengan array di C++. Namun, secara praktis sama dengan penunjuk ke array dinamis. Artinya operator

int a = int baru; //Jawa
setara dengan operator
i n t * = baru i n t [ 1 0 0 ] ; // C++,
dan tidak
ke dalam; // C++

Di Java, default no operator memeriksa rentang indeks. Selain itu, Java tidak memiliki aritmatika penunjuk—Anda tidak dapat menambah penunjuk untuk mengakses elemen berikutnya dalam array.

  • Jawa,
  • Algoritma
    • tutorial

    Saya rasa hanya sedikit dari mereka yang mempersiapkan wawancara pertama mereka, ketika melamar pekerjaan pertama mereka sebagai programmer (pra) junior, akan menjawab pertanyaan ini dengan negatif. Atau setidaknya meragukan jawaban positifnya. Tentu saja, struktur data sederhana dengan akses indeks langsung - tidak ada trik! Tidak, dalam beberapa bahasa seperti JavaScript atau PHP, array tentu saja diimplementasikan dengan cara yang sangat menarik dan pada dasarnya lebih dari sekedar array. Tapi ini bukan yang kita bicarakan, tapi tentang implementasi array "tradisional" dalam bentuk "memori berkelanjutan". Dalam hal ini, berdasarkan indeks dan ukuran satu elemen, alamat dihitung secara sederhana dan nilai terkait diakses. Apa susahnya?
    Mari kita cari tahu. Misalnya saja di Pulau Jawa. Meminta pemohon yang tidak menaruh curiga untuk membuat array bilangan bulat N X N. Orang tersebut dengan percaya diri menulis sesuatu seperti:
    int g = baru int[n][n];
    Besar. Sekarang kami meminta Anda untuk menginisialisasi elemen array dengan sesuatu. Setidaknya dalam satuan, setidaknya sebagai jumlah indeks. Kami mendapatkan:
    untuk(int saya = 0; saya< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Mereka bahkan lebih sering menulis
    untuk(int saya = 0; saya< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    yang juga merupakan alasan untuk berdiskusi, tetapi sekarang kita membicarakan hal lain. Kami mencoba mencari tahu apa yang diketahui seseorang dan melihat bagaimana dia berpikir. Oleh karena itu, kami menarik perhatiannya pada fakta bahwa nilainya terletak secara simetris dan memintanya untuk menghemat iterasi loop. Tentu saja, mengapa harus melewati semua nilai indeks jika Anda hanya bisa melewati segitiga terbawah? Subjek biasanya dengan mudah menyetujui dan dengan bijak menyorot diagonal utama, dengan hati-hati menulis sesuatu seperti:
    untuk(int saya = 0; saya< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    Dari pada g[i][i] = 2* i;<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: sering ditulis g[i][i] = i + i; atau g[i][i] = saya
    Seberapa cepat program ini akan berjalan? N. Alasan yang umum adalah sebagai berikut: perhitungan indeks hampir 2 kali lebih sedikit; perhitungan nilai hampir 2 kali lebih sedikit (penjumlahan); jumlah tugas yang sama. Ini berarti 30 persen lebih cepat. Jika seseorang memiliki latar belakang matematika yang baik, Anda bahkan dapat melihat jumlah pasti operasi yang disimpan dan penilaian yang lebih masuk akal mengenai efektivitas pengoptimalan.

    Sekarang adalah waktunya untuk pukulan utama. Kami menjalankan kedua versi kode pada nilai yang cukup besar

    (sekitar beberapa ribu), misalnya seperti ini.< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    Kode yang dikontrol waktu
    kelas A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;
    Apa yang kita lihat? Versi yang dioptimalkan bekerja 10-100 kali lebih lambat! Kini saatnya mengamati reaksi kandidat terhadap posisi tersebut. Apa reaksi terhadap situasi stres yang tidak biasa (lebih tepatnya, biasa dalam praktik pengembang). Jika wajah terdakwa menunjukkan kegembiraan dan dia mulai menekan tombol, untuk sementara melupakan keberadaan Anda, maka ini pertanda baik. Sampai batas tertentu. Anda tidak ingin mempekerjakan seorang peneliti yang tidak peduli dengan hasil proyek, bukan? Maka jangan tanyakan padanya pertanyaan "Mengapa?" Minta mereka untuk mengerjakan ulang opsi kedua agar benar-benar bekerja lebih cepat daripada opsi pertama.

    Sekarang Anda dapat menjalankan bisnis Anda dengan aman untuk sementara waktu. Dalam setengah jam Anda akan memiliki cukup materi untuk menilai kualitas dasar pribadi dan profesional pelamar.

    Waktu program; menggunakanWindows;


    var mulai, selesai, res: int64;
    n, saya, j: Bilangan bulat;
    g: Array dari Array Integer; mulai n:= 10.000;
    SetPanjang(g, n, n);

    QueryPerformanceFrequency(res); N QueryPerformanceCounter (mulai);
    untuk i:=1 sampai n-1 lakukan untuk j:=1 sampai n-1 lakukan g := i + j;

    QueryPerformanceCounter (selesai);

    writeln("Waktu per baris:", (selesai - mulai) / res, " detik");
    QueryPerformanceCounter (mulai);
    untuk i:=1 sampai n-1 lakukan untuk j:=1 sampai n-1 lakukan g := i + j;
    Sebenarnya, saya memperhatikan efek ini justru sehubungan dengan tugas pemrosesan gambar yang sebenarnya. Situasinya agak membingungkan dan saya tidak langsung mengerti mengapa fps saya turun drastis setelah refactoring. Secara umum, setiap orang mungkin memiliki banyak momen indah seperti itu.

    Sejauh ini versi terdepan adalah cache prosesor yang menjadi penyebabnya. Itu. akses berurutan pada opsi pertama berfungsi dalam hash, yang diperbarui ketika bergerak melampaui batas tertentu. Saat mengakses berdasarkan kolom, hash dipaksa untuk terus diperbarui dan ini membutuhkan banyak waktu. Mari kita periksa versi ini dalam bentuknya yang paling murni. Mari kita membuat array dan membandingkan mana yang lebih cepat - memproses semua elemen dalam satu baris atau memproses elemen array dengan nomor acak dalam jumlah yang sama? Program ini adalah ideone.com/tMaR2S. Untuk 100.000 elemen array, akses acak biasanya terasa lebih cepat. Apa artinya ini?
    Di sini dengan tepat ditunjukkan kepada saya (Big_Lebowski) bahwa mengatur ulang loop akan mengubah hasil yang mendukung opsi berurutan. Demi kemurnian eksperimen, saya harus menyiapkan siklus pemanasan. Pada saat yang sama, saya melakukan beberapa pengulangan untuk mendapatkan waktu pengoperasian rata-rata seperti yang disarankan Leventov. Ternyata seperti ini ideone.com/yN1H4g. Itu. Akses acak ke elemen array besar ~10% lebih lambat dibandingkan akses berurutan. Mungkin cache sebenarnya memainkan peran tertentu. Namun, dalam situasi awal, kinerjanya turun secara signifikan. Jadi ada hal lain.

    Secara bertahap, versi tentang tindakan tambahan saat berpindah dari satu baris array ke baris lainnya menjadi yang terdepan. Dan itu benar. Masih mencari tahu apa yang sebenarnya terjadi di sana.

    Tag:

    • Pemrograman
    • array
    • ingatan
    Tambahkan tag
    • Sergei Savenkov

      semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat