JavaRush /Java Blog /Random-ID /Analisis tanya jawab dari wawancara untuk pengembang Java...

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 6

Dipublikasikan di grup Random-ID
Halo Dunia! Terus berkembang sangat penting bagi pengembang mana pun. Lagi pula, jika Anda berhenti, ada risiko tidak diklaim dan sepenuhnya keluar dari pasar: dunia TI terus berkembang dan bergerak maju, dan Anda harus ikut bergerak. Namun pada saat yang sama, seseorang tidak bisa hanya fokus pada teknologi baru dan segar, agar tidak melupakan, bisa dikatakan, tentang hal-hal klasik (topik klasik). Hari ini saya ingin melanjutkan analisis saya atas pertanyaan tentang topik “klasik” untuk pengembang Java. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 1Saya perhatikan bahwa jawaban saya bukanlah otoritas akhir - ini adalah cara saya melihat jawaban yang benar atas pertanyaan-pertanyaan ini, dan Anda mungkin tidak setuju dengan beberapa di antaranya. Ini adalah hal yang normal, jadi silakan sampaikan pendapat Anda di kolom komentar. Tautan ke bagian analisis ada di akhir artikel.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 2

Perpustakaan dan standar

52. Apa itu Hibernasi? Apa perbedaan antara JPA dan Hibernasi?

Saya rasa untuk menjawab pertanyaan ini, pertama-tama kita perlu memahami apa itu JPA . JPA adalah spesifikasi yang menjelaskan pemetaan objek-relasional dari objek Java sederhana dan menyediakan API untuk menyimpan, mengambil, dan memanipulasi objek tersebut. Artinya, seperti yang kita ingat, database relasional (DB) disajikan dalam bentuk banyak tabel yang saling berhubungan. Dan JPA adalah standar yang diterima secara luas yang menjelaskan bagaimana objek dapat berinteraksi dengan database relasional. Seperti yang Anda lihat, JPA adalah sesuatu yang abstrak dan tidak berwujud. Ini seperti idenya sendiri, pendekatannya. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 3Pada saat yang sama, Hibernate adalah perpustakaan khusus yang mengimplementasikan paradigma JPA . Artinya, dengan bantuan perpustakaan ini Anda bisa bekerja dengan database relasional melalui objek yang mewakili data dari database (Entitas). Seperti yang mereka katakan, perpustakaan ini sangat dekat dengan cita-cita JPA dan mungkin itulah sebabnya perpustakaan ini menjadi populer. Dan seperti yang Anda pahami, popularitas penggunaan adalah argumen yang baik untuk pengembangan dan peningkatan lebih lanjut. Selain itu, di balik seringnya penggunaan terdapat komunitas besar yang telah menyelesaikan semua pertanyaan yang mungkin dan tidak mungkin terkait dengan alat ini. Berikut adalah contoh buku yang mengkaji secara detail semua sudut gelap teknologi ini. Artinya, Hibernate telah dipelajari semaksimal mungkin dan ternyata dapat diandalkan. Sebenarnya, bukan tanpa alasan bahkan implementasi JPA yang ideal di sisi Spring biasanya menggunakan Hibernate.

53. Apa itu mengalir? Bagaimana cara menggunakannya di Hibernate?

Seperti yang saya katakan sebelumnya, dalam Hibernate komunikasi dilakukan melalui objek data yang disebut entitas . Entitas ini mewakili beberapa tabel tertentu dalam database, dan seperti yang Anda ingat, kelas Java dapat berisi referensi ke kelas lain. Hubungan ini tercermin dalam database. Dalam database, biasanya, ini adalah kunci asing (untuk OneToOne, OneToMany, ManyToOne) atau tabel perantara (untuk ManyToMany). Anda dapat membaca lebih lanjut tentang hubungan antar entitas di artikel ini . Jika entitas Anda memiliki tautan ke entitas terkait lainnya, anotasi ditempatkan di atas tautan ini untuk menunjukkan jenis koneksi: @OneToOne, @OneToMany, @ManyToOne, @ManyToMane, yang parameternya dapat Anda tentukan nilai propertinya - cascade - the jenis kaskade untuk koneksi ini. JPA memiliki metode khusus untuk berinteraksi dengan entitas (bertahan, menyimpan, menggabungkan...) . Tipe cascading secara tepat digunakan untuk menunjukkan bagaimana seharusnya data terkait berperilaku ketika metode ini digunakan pada entitas target. Lantas, apa saja strategi cascading (jenis-jenis cascading)? Standar JPA menyiratkan penggunaan enam jenis cascading:
  • PERSIST - operasi penyimpanan akan terjadi secara berjenjang (untuk metode save() dan persist() ). Artinya, jika kita menyimpan suatu entitas yang terkait dengan entitas lain, maka entitas tersebut juga disimpan di database (jika belum ada)

  • MERGE - operasi pembaruan akan terjadi secara berjenjang (untuk metode merge() )

  • HAPUS - operasi penghapusan terjadi secara berjenjang ( metode hapus() )

  • SEMUA - berisi tiga operasi kaskade sekaligus - PERSIST - MERGE - REMOVE

JPA memiliki konsep entitas persisten - entitas yang terkait dengan datanya dalam database, yang dikendalikan oleh sesi saat ini (koneksi) . Jika Anda mengubahnya, tetapi tidak menyimpan perubahannya ke database, datanya di database akan tetap berubah.
  • DETACH - entitas terkait tidak akan dikelola oleh sesi ( metode detach() ). Artinya, ketika mereka berubah, tidak akan ada perubahan otomatis pada data mereka di database - mereka ditransfer dari status persistensi ke status terpisah (entitas yang tidak dikelola oleh JPA)

  • REFRESH - setiap kali suatu entitas diperbarui dengan data dari database ( refresh() - memperbarui objek yang terpisah), entitas terkait diperbarui dengan cara yang sama. Misalnya, Anda entah bagaimana mengubah data yang diambil dari database dan ingin mengembalikan nilai aslinya. Dalam hal ini, operasi ini akan bermanfaat bagi Anda.

Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 4Hibernate mendukung semua operasi cascading standar ini, tetapi juga memperkenalkan tiga operasinya sendiri:
  • REPLICATE - Digunakan ketika kita memiliki lebih dari satu sumber data dan kita ingin datanya disinkronkan (metode Hibernate - replikasi). Semua entitas harus memiliki pengidentifikasi (id) agar tidak ada masalah dalam pembuatannya (agar entitas yang sama tidak memiliki id yang berbeda untuk database yang berbeda)

  • SAVE_UPDATE - simpan/hapus bertingkat (untuk metode Hibernate - saveOrUpdate )

  • LOCK adalah operasi kebalikan dari DETACHED : ini mentransfer entitas yang terlepas kembali ke status persistensi , yaitu. entitas akan dilacak lagi oleh sesi saat ini

Jika tipe cascading tidak dipilih, tidak ada operasi pada suatu entitas yang akan berdampak pada entitas lain yang terkait dengannya.

54. Bisakah kelas Entitas bersifat abstrak?

Dalam spesifikasi JPA di paragraf 2.1 Kelas Entitas terdapat baris: “ Kelas abstrak dan kelas konkret dapat menjadi entitas .” Jadi jawabannya adalah ya, kelas abstrak dapat berupa entitas dan dapat dianotasi dengan @Entity.

55. Apa yang dimaksud dengan manajer entitas? Apa tanggung jawabnya?

Pertama-tama, saya ingin mencatat bahwa EntityManager adalah salah satu komponen kunci JPA , yang digunakan untuk berinteraksi dengan entitas dengan database. Secara umum, ini memanggil metode interaksi antara entitas dan database (bertahan, menggabungkan, menghapus, melepaskan)... Namun saya juga mencatat bahwa komponen ini, sebagai suatu peraturan, bukan satu untuk keseluruhan aplikasi: paling sering itu ringan dan sering dihapus dan yang baru dibuat menggunakan EntityManagerFactory . Jika kita menggambar paralel dengan JDBC , di mana EntityManagerFactory akan menjadi analog dari DataSource , maka EntityManager, pada gilirannya, akan menjadi analog dari Connection . Sebelumnya saya telah menyebutkan entitas persistensi , sebagai entitas yang dikendalikan oleh koneksi saat ini. Jadi: entitas ini dikelola secara tepat oleh EntityManager , yang terkait erat dengan koneksi saat ini dan TransactionManager , yang bertanggung jawab atas pembukaan/penutupan transaksi. Selanjutnya pada gambar di bawah ini Anda dapat melihat siklus hidup suatu entitas: Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 5EntityManager mengelola entitas ketika berada pada tahap Managed (saat ini bersifat persisten, karena memiliki koneksi dengan EntityManager). Artinya, sudah bukan barang baru lagi dan belum dihilangkan. Kita dapat mengatakan bahwa ketika suatu entitas baru atau dihapus, maka entitas tersebut juga terlepas, karena itu tidak dikelola oleh EntityManager. Ada strategi berbeda untuk EntityManager. Artinya, mungkin ada satu EntityManager tunggal untuk seluruh aplikasi, atau yang baru dapat dibuat setiap kali, untuk setiap koneksi. Jika Anda menggunakan Spring, maka pembuatan/penghapusan EntityManager dikontrol secara otomatis (tetapi ini tidak berarti Anda tidak dapat menyesuaikannya ^^). Perlu dikatakan bahwa satu atau lebih EntityManagers membentuk konteks persistensi . Konteks persistensi adalah lingkungan di mana instance entitas disinkronkan dengan entitas serupa di database (seperti yang saya katakan, ini hanya berfungsi untuk entitas persisten). Jika Anda mempelajari JPA lebih dalam (yang sangat saya rekomendasikan), Anda akan sangat sering menemukan konsep ini.

56. Apa yang dimaksud dengan kelas Assert? Mengapa menggunakannya?

Saya belum pernah mendengar kelas seperti itu di JPA , jadi saya berasumsi ini mengacu pada kelas perpustakaan JUnit yang digunakan untuk pengujian unit kode. Kelas perpustakaan ini, Assert , digunakan untuk memeriksa hasil eksekusi kode ( menegaskan adalah pernyataan bahwa Anda memiliki keadaan/data tertentu di tempat tertentu). Misalnya, Anda sedang menguji metode yang seharusnya membuat seekor kucing. Anda menjalankan suatu metode dan mendapatkan beberapa hasil:
Cat resultOfTest = createCat();
Tapi Anda perlu memastikan itu dibuat dengan benar, bukan? Oleh karena itu, sebelumnya Anda membuat cat tertentu - ExpectCat - secara manual dengan parameter persis seperti yang Anda harapkan dari cat yang diperoleh dari metode createCat() . Selanjutnya, Anda menggunakan kelas Assert untuk memverifikasi hasilnya:
Assert.assertEquals(resultOfTest, expectedCat);
Jika kucingnya berbeda, pengecualian AssertionError akan dilempar , yang memberi tahu kita bahwa hasil yang diharapkan tidak menyatu. Kelas Assert memiliki banyak metode berbeda yang mencakup banyak tugas memverifikasi hasil yang diharapkan. Berikut beberapa di antaranya:
  • menegaskanTrue(<boolean>) - nilai yang diharapkan yang diterima sebagai argumen harus benar

  • menegaskanFalse(<boolean>) - nilai yang diharapkan yang diterima sebagai argumen harus salah

  • menegaskanNotEquals(<object1>, <object2>) - objek yang diterima sebagai argumen harus berbeda jika dibandingkan menggunakan sama dengan ( false )

  • menegaskanThrows(<ClassNameOfException>.class, <ExceptionObject>) - argumen kedua diharapkan menjadi pengecualian dari kelas yang ditentukan oleh argumen pertama (yaitu, sebagai aturan, sebagai ganti argumen kedua, sebuah metode dipanggil yang seharusnya melempar pengecualian dari tipe yang diperlukan)

Rangkaian

57. Karakterisasi String di Java

String adalah kelas standar di Java, bertanggung jawab untuk menyimpan dan memanipulasi nilai string (urutan karakter), adalah kelas yang tidak dapat diubah ( saya menulis tentang yang tidak dapat diubah sebelumnya ), yaitu. Data objek kelas ini tidak dapat diubah setelah pembuatan. Saya ingin segera mencatat bahwa kelas StringBuilder dan StringBuffer adalah dua kelas yang hampir identik, dengan satu-satunya perbedaan adalah bahwa salah satunya dimaksudkan untuk digunakan dalam lingkungan multi-thread (StringBuffer). Kelas-kelas ini analog dengan String , tetapi tidak seperti itu, kelas-kelas ini bisa berubah . Artinya, objek, setelah dibuat, memungkinkan modifikasi string yang diwakilinya tanpa membuat objek baru. Sebenarnya, metodenya berbeda dengan metode String standar dan ditujukan untuk memenuhi kebutuhan perubahan string (bukan tanpa alasan mereka disebut pembangun). Baca lebih lanjut tentang String , StringBuffer dan StringBuilder di artikel ini .

58. Apa sajakah cara untuk membuat objek String? Dimana itu dibuat?

Cara paling umum untuk membuat string adalah dengan menentukan nilai yang kita perlukan dalam tanda kurung ganda:
String str = "Hello World!";
Anda juga dapat melakukan ini secara langsung melalui new :
String str = new String("Hello World!");
Anda dapat membuat string mulai dari array karakter:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Sebagai hasil dari metode toString yang berjalan pada beberapa objek:
String str = someObject.toString();
Seperti hasil dari metode lainnya, metode ini mengembalikan representasi string. Misalnya:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str =  reader.readLine();
Seperti yang Anda pahami, ada banyak sekali cara untuk membuat string. Saat objek String dibuat, objek tersebut disimpan di kumpulan string , yang akan kita bahas lebih detail di salah satu pertanyaan di bawah.

59. Bagaimana cara membandingkan dua string di Java dan cara mengurutkannya?

Untuk membandingkan nilai di Java, digunakan tanda sama dengan ganda == . Jika kami perlu membandingkan beberapa nilai sederhana seperti int , kami akan menggunakannya. Tetapi metode ini tidak berlaku untuk membandingkan objek secara utuh. Dalam hal ini yang akan dilakukan hanyalah perbandingan referensi apakah menunjuk pada objek yang sama atau tidak. Artinya, ketika membandingkan dua objek dengan nilai bidang internal yang persis sama, perbandingan melalui == akan memberikan hasil salah : meskipun bidang objeknya sama, objek itu sendiri menempati sel memori yang berbeda. Dan objek dari kelas String , meskipun terlihat sederhana, tetaplah objek. Dan perbandingan melalui == juga tidak berlaku untuk mereka (meskipun ada kumpulan string). Di sini metode standar kelas Object berperan - sama dengan , yang harus ditimpa di kelas agar dapat berfungsi dengan benar (jika tidak, secara default akan dibandingkan dengan menggunakan == ). Itu ditimpa di kelas String , jadi kita ambil saja dan gunakan:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 6Kita berbicara tentang perbandingan yang cocok, sekarang mari kita lihat perbandingan pengurutan. Lagi pula, untuk mengurutkan sesuatu, kita perlu mengetahui prinsip apa yang harus diurutkan. Untuk melakukan ini, Anda dapat menggunakan kumpulan terurut standar - TreeSet . Anda dapat membaca lebih lanjut tentang berbagai koleksi di Java di artikel ini . Daftar ini bekerja berdasarkan algoritma pohon merah-hitam dan mengurutkan kumpulan sesuai dengan prinsip pengurutan yang ditentukan. Seperti yang saya katakan sebelumnya, Anda perlu memahami cara mengurutkan objek dengan tipe tertentu. Pembanding digunakan untuk mengatur metode perbandingan untuk penyortiran . Biasanya hal ini perlu diimplementasikan untuk kelas yang ingin Anda urutkan, namun dalam kasus String hal ini sudah diimplementasikan. Oleh karena itu, kita cukup menambahkan baris yang kita perlukan ke TreeSet , dan itu akan mengurutkannya:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Keluaran konsol:
A B C

60. Berikan algoritma untuk mengubah string menjadi karakter. Tulis kode yang sesuai

Seperti yang saya katakan sebelumnya, objek kelas String memiliki banyak metode berguna yang berbeda. Salah satunya adalah toCharArray . Metode ini mengubah string menjadi array karakter:
String str = "Hello world";
char[] charArr = str.toCharArray();
Selanjutnya kita memiliki array karakter yang bisa kita panggil berdasarkan indeks:
char firstChar = charArr[0]; // H

61. Bagaimana cara mengubah string menjadi array byte dan sebaliknya? Tulis kode yang sesuai

Mirip dengan metode toCharArray , kelas String memiliki metode getBytes yang mengembalikan array byte dari string:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Bagian analisis hari ini telah mencapai akhir yang logis. Terima kasih atas perhatian Anda!Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 6 - 7
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION