Bagaimana kelas String berfungsi di Jawa
Sumber:
DZone Saya baru-baru ini menemui soalan berikut di forum: "Berapa banyak objek
String yang dicipta di sini ? Satu atau dua?".
String langName = new String("Java");
Saya ingin tahu bagaimana orang lain menjawabnya, mengetahui bahawa ia adalah soalan yang kompleks, terutamanya jika seseorang itu tidak begitu berpengetahuan tentang cara kelas
String berfungsi di Jawa. Jadi, saya terjun ke bahagian komen.
Terkejut saya, dalam kalangan pengulas ada orang yang memilih "Satu" sebagai jawapan yang betul, tetapi ramai lagi yang menjawab "Dua". Untuk seketika, saya juga mula meragui pengetahuan saya tentang
Strings . Jawapan yang betul ialah semuanya bergantung pada keadaan. Persoalannya tidak cukup jelas dan memberi ruang untuk dibahaskan. Saya akan mengulanginya seperti ini:
1. Berapa banyak objek Java String yang dicipta dalam ingatan apabila pernyataan ini dilaksanakan?
Hanya ada satu jawapan.
Berapa banyak objek Java String yang akan kekal dalam ingatan selepas melaksanakan pernyataan ini?
Jawapannya dua. Mudah-mudahan ketidakpastian itu hilang sebaik sahaja saya menyemak pembuangan memori program dengan pernyataan seperti contoh di atas.
Lambakan memori program dalam imej di atas menunjukkan kewujudan dua objek
String dengan kandungan yang sama. Ini membuktikan bahawa memanggil pembina kelas
String dan menghantar rentetan literal sebagai argumen mengakibatkan dua objek ditambahkan ke timbunan memori: satu dalam memori biasa (bukan kolam), dan satu lagi dalam String Constant Pool (SCP), sebuah kawasan dalam ingatan yang juga merupakan sebahagian daripada timbunan. Kesukaran bermula selepas menambah. Memanggil pembina sentiasa menyebabkan objek baru diletakkan di kawasan bukan kolam. Tetapi hujah pembina, yang merupakan rentetan literal, juga merupakan objek, dan ia dicipta dan disimpan dalam SCP semasa pemuatan kelas, dengan syarat kolam rentetan tidak mengandungi rentetan dengan kandungan yang sama. Spesifikasi
Bahasa Java menyatakan bahawa "huruf rentetan—atau, lebih umum, Rentetan yang merupakan nilai ungkapan malar (§15.28)—adalah "dilatih" untuk berkongsi kejadian unik menggunakan kaedah String .
intern ". Oleh kerana rentetan dalam Java adalah literal dan oleh itu mewakili nilai ungkapan malar, ia dikumpulkan. Untuk menjadikannya lebih jelas, mari kita tulis semula kod yang dibentangkan pada permulaan artikel seperti berikut:
String java = "Java";
String langName = new String(java);
Sekarang mari kita kembali kepada soalan utama. Adakah pernyataan berikut akan mencipta satu atau dua objek
String :
String langName = new String("Java");
Untuk menjawab soalan ini dan membuang sebarang syak wasangka, mari lihat kod bait kaedah utama:
public static main([Ljava/lang/String;)V
L0
LINENUMBER 11 L0
NEW java/lang/String
DUP
LDC "Java"
INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
ASTORE 1
L1
LINENUMBER 14 L1
FRAME APPEND [java/lang/String]
GOTO L1
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
MAXSTACK = 3
MAXLOCALS = 2
Pada baris 6 anda boleh melihat arahan LDC (Load Constant). Ia memuatkan elemen daripada kolam pemalar rentetan ke dalam timbunan. Ini bermakna bahawa pada masa pembina dipanggil, literal Java, yang juga objek, telah ditambahkan ke kolam. Ini berlaku semasa memuatkan kelas. Oleh itu, memanggil pembina kelas
String dengan literal rentetan mencipta hanya satu objek dan meletakkannya di lokasi memori yang tidak terkumpul.
Ketahui cara melaksanakan antara muka web dalam Java
Sumber:
Dev.to Dunia JavaScript menawarkan rangka kerja web yang berguna dan menyeronokkan, tidak ada keraguan mengenainya. Terdapat alternatif yang menarik untuk pembangun Java - rangka kerja
Vaadin sumber terbuka . Dengan itu, anda boleh dengan mudah melaksanakan
antara muka pengguna grafik (GUI) untuk web hanya menggunakan bahasa pengaturcaraan Java dan tiada yang lain. Anda tidak perlu menulis satu baris HTML atau JavaScript. Sekeping gambar bernilai seribu perkataan:
Bagaimanakah Vaadin berfungsi?
Di sebelah kiri tangkapan skrin anda melihat kelas Java. Kod ini berjalan pada pelayan seperti Apache Tomcat, Eclipse Jetty atau mana-mana bekas servlet lain. Anda boleh menggunakan API yang disediakan oleh platform untuk mencipta
komponen antara muka pengguna (UI) seperti medan teks, kotak kombo, grid data, pemilih tarikh, medan muat naik dan banyak lagi. Anda boleh menggabungkan komponen ini untuk membuat paparan (juga dikenali sebagai halaman atau UI), menggunakan reka letak untuk menyusun komponen antara muka pengguna (UI) secara menegak, mendatar atau apa-apa cara lain menggunakan CSS. Dalam contoh sebelumnya, kami mencipta
TextField dan
Button dengan menambahkannya pada
VerticalLayout . Setelah paparan sedia, anda boleh membukanya melalui URL menggunakan anotasi
@Route . Dalam contoh ini, kami menyediakannya di http://localhost:8080/hello menggunakan
@Route("hello") . Aplikasi Vaadin ialah aplikasi web dalam Java. Rangka kerja menyediakan pelaksanaan Servlet (
VaadinServlet ) yang mengendalikan permintaan dan respons HTTP untuk anda. Servis ini mengimbas kelas Java yang ditandai dengan anotasi
@Route untuk memaparkan paparan yang betul dalam penyemak imbas. Apabila aplikasi Vaadin pertama kali diminta, Vaadin membalas dengan fail JavaScript ringan yang berfungsi sebagai enjin pelanggan. Enjin ini mengurus acara pemprosesan dalam penyemak imbas dan menghantarnya ke pelayan sebagai mesej JSON. Objek
VaadinServlet memproses permintaan dan begitu juga mengembalikan respons JSON kepada enjin sisi klien. Enjin kemudian menggunakan mesej ini untuk mengemas kini elemen pada halaman yang perlu dikemas kini, jika ada. Vaadin menggunakan sesi HTTP untuk menyimpan pokok komponen yang mengandungi keadaan antara muka pengguna. Perkara seperti komponen membentuk perwakilan dan keadaannya (didayakan/dilumpuhkan, kapsyen, nilai, dsb.). Ini semua menyediakan tahap keselamatan yang patut disebut. Memandangkan logik antara muka pengguna berada pada pelayan, ia tidak boleh diakses oleh penyerang. Pemeriksaan dilakukan pada pelayan. Contohnya, jika Butang dinyahdayakan menggunakan
setEnabled(false) , maka ini bukan sekadar ciri kosmetik dalam penyemak imbas - pelayan tidak akan menjalankan sebarang logik dalam pendengar klik yang ditambahkan pada butang dilumpuhkan, menghalang penyerang daripada mengeksploitasi alat pembangun dalam penyemak imbas untuk menukar keadaan yang didayakan atau hubungi
VaadinServlet untuk mensimulasikan klik tetikus (acara klik).
Adakah Vaadin percuma untuk digunakan?
ya. Vaadin ialah rangka kerja sumber terbuka yang diterbitkan di bawah Lesen Apache 2.0. Anda tidak perlu membeli apa-apa untuk membuat aplikasi web lengkap dengannya. Terdapat komponen komersial yang meningkatkan prestasi, tetapi ia tidak diperlukan. Sebagai contoh, terdapat
pereka bentuk visual dan komponen CRUD untuk membantu anda membuat paparan dengan lebih pantas. Anda boleh mencuba komponen ini secara percuma sebelum melanggan.
Adakah Vaadin pengganti JSP dan JSF?
ya. Ia boleh digunakan sebagai pengganti JSP, JSF dan juga rangka kerja JavaScript seperti Angular. Ramai pelanggan Vaadin telah berjaya berhijrah daripada teknologi ini kepada Vaadin.
Adakah Vaadin mempunyai sokongan untuk Spring dan Jakarta EE?
ya. Vaadin mempunyai integrasi rasmi dengan Spring dan Jakarta EE (dahulunya Java EE). Anda boleh menambah Vaadin sebagai kebergantungan apabila mencipta projek Spring Boot baharu menggunakan Spring Initializr. Untuk Jakarta EE, anda boleh memuat turun contoh Hello, World yang mudah yang menggunakan Jakarta EE. Pada masa menulis artikel ini, hanya Jakarta EE versi 8 disokong.
Siapa yang menggunakan Vaadin?
Banyak syarikat Fortune 500 menggunakan Vaadin, serta syarikat permulaan yang berjaya dan lebih 200 ribu pembangun di seluruh dunia. Lihat
Panduan Mula Pantas dan
dokumentasi Vaadin yang lain.
GO TO FULL VERSION