Jawa 11
var (dalam lambda)
Mulai sekarang, kita boleh menentukan jenis parameter lambda atau meninggalkannya semasa menulis ungkapan lambda (ungkapan lambda yang ditaip secara tersirat):Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Anda juga boleh menambah anotasi pada parameter lambda tanpa perlu menulis nama jenis pembolehubah penuh:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z(ZGC)
ZGC ialah pengutip sampah baru yang tidak berfungsi. Ia memperuntukkan memori baharu tetapi tidak pernah memulakannya semula. ZGC berjanji untuk mengurus sejumlah besar memori dengan daya pemprosesan tinggi dan kependaman rendah (ZGC hanya tersedia pada platform 64-bit). Mewarna Rujukan - ZGC menggunakan penunjuk 64-bit dengan teknik yang dipanggil pewarna penunjuk. Penunjuk berwarna menyimpan maklumat tambahan tentang objek pada timbunan. Apabila memori menjadi berpecah-belah, ini membantu mengelakkan kemerosotan prestasi apabila GC perlu mencari ruang untuk peruntukan baharu. Pengumpulan sampah menggunakan ZGC terdiri daripada langkah-langkah berikut:- dunia berhenti: kami mencari titik permulaan untuk mencapai objek pada timbunan (seperti pembolehubah tempatan atau medan statik);
- persilangan graf objek bermula daripada pautan akar. Kami menandakan setiap objek yang kami capai (ZGC berjalan melalui graf objek dan memeriksa penunjuk berwarna, menandakan objek yang tersedia);
- mengendalikan beberapa kes kelebihan, seperti pautan lemah;
- menggerakkan objek hidup, membebaskan kawasan besar timbunan untuk mempercepatkan peruntukan.
- apabila fasa bergerak bermula, ZGC membahagikan timbunan kepada halaman dan berfungsi satu halaman pada satu masa;
- ZGC menamatkan pergerakan mana-mana akar dan pergerakan selebihnya berlaku.
- Pengenalan kepada ZGC: Pengumpul Sampah JVM Kependaman Rendah Boleh Skala dan Eksperimen
- Pengumpul sampah buatan sendiri untuk JDK Terbuka
- Z Garbage Collector (ZGC) baharu Java sangat mengujakan
Epsilon GC
Epsilon ialah pengumpul sampah yang mengendalikan peruntukan memori tetapi tidak melaksanakan sebarang mekanisme pemulihan memori sebenar. Setelah timbunan Java yang tersedia habis, JVM akan ditutup. Iaitu, jika anda mula mencipta objek dalam tatasusunan tak terhingga tanpa mengikat rujukan dengan pengumpul sampah ini, aplikasi akan ranap dengan OutOfMemoryError (dan jika dengan yang lain, ia tidak akan, kerana ia akan membersihkan objek tanpa rujukan) . Mengapa ia diperlukan? Inilah sebabnya:- Ujian prestasi.
- Ujian tekanan ingatan.
- Menguji antara muka VM.
- Kerja yang sangat singkat.
- Penambahbaikan kependaman penurunan terakhir.
- Penurunan terakhir peningkatan throughput.
- GC Epsilon baharu. Java mungkin tidak mempunyai kutipan sampah. Terkejut. Sensasi
- Pengenalan kepada Epsilon GC: Pengumpul Sampah Eksperimen Tanpa Op
ByteArrayOutputStream
mendapat kaedahvoid writeBytes(byte [])
yang menulis semua bait daripada hujah keOutputStream
.FileReader
danFileWriter
mendapat pembina baharu yang membolehkan anda menentukan Charset.Path
meraih dua kaedah baharu,of(String, String [])
mengembalikanPath
daripada hujah rentetan laluan atau urutan rentetan yang apabila digabungkan membentuk rentetan laluan danof(URI)
: mengembalikan Laluan daripada URI.Pattern
— menerima kaedahasMatchPredicate()
yang menyemak sama ada rentetan input yang diberikan sepadan dengan corak yang diberikan (sama ada ia membenarkan anda mencipta predikat menggunakan ungkapan biasa supaya anda boleh, contohnya, menapis data dalam strim).String
Saya mengambil banyak kaedah berguna, seperti:String strip()
: akan mengembalikan kami rentetan yang merupakan rentetan ini, dengan semua ruang pada permulaan dan penghujung rentetan dikeluarkan (serupa dengan trim(), tetapi mentakrifkan ruang secara berbeza);String stripLeading()
: akan mengembalikan kami rentetan yang merupakan rentetan ini, mengalih keluar sebarang ruang utama daripada rentetan;String stripTrailing()
: akan mengembalikan kami rentetan yang merupakan rentetan ini, mengalih keluar sebarang ruang di hujung rentetan;Stream lines()
: akan mengembalikan kamiStream
daripadaString
, diekstrak daripada rentetan ini, dipisahkan oleh pemisah baris;String repeat(int)
: akan mengembalikan kita rentetan yang merupakan gabungan rentetan ini, diulang beberapa kali.boolean isBlank()
: akan kembali benar jika rentetan kosong atau mengandungi hanya ruang, palsu sebaliknya.
Thread
— kaedah destroy() dan stop(Throwable) telah dialih keluar.Files
mendapat beberapa kaedah baru:String readString(Path)
: membaca semua data daripada fail ke dalam rentetan, manakala penyahkodan daripada bait kepada aksara menggunakan pengekodan UTF-8;String readString(Path, Charset)
: sama seperti dalam kaedah di atas, dengan perbezaan bahawa penyahkodan daripada bait kepada aksara berlaku menggunakan Charset yang ditentukan;Path writeString (Path, CharSequence, OpenOption [])
: Menulis urutan aksara pada fail. Aksara dikodkan ke dalam bait menggunakan pengekodan UTF-8;Path writeString(Path, CharSequence,Charset, OpenOption [])
: Kaedah yang sama seperti di atas, hanya aksara yang dikodkan ke dalam bait menggunakan pengekodan yang dinyatakan dalam Charset.
Jawa 12
Enam bulan berlalu dan kita melihat peringkat seterusnya dalam evolusi Java. Jadi, sudah tiba masanya untuk mengeluarkan sekop ilmu dan menggali.Kemas kini G1
Penambahbaikan berikut telah dibuat untuk G1:-
Tuntut semula memori yang diperuntukkan yang tidak digunakan
Dalam ingatan timbunan Java terdapat perkara seperti memori yang tidak digunakan (atau dengan kata lain, tidak aktif). Di Java 12 mereka memutuskan untuk menyelesaikan masalah ini, sekarang:
- G1 mengembalikan ingatan daripada timbunan dalam GC penuh atau semasa gelung selari; G1 cuba menghalang GC penuh dan memulakan gelung selari berdasarkan peruntukan timbunan. Kita perlu memaksa G1 untuk mengembalikan ingatan dari timbunan.
Peningkatan ini memfokuskan pada prestasi dengan mengembalikan memori secara automatik daripada timbunan ke OS apabila G1 tidak digunakan.
-
Menggugurkan koleksi bercampur apabila masa jeda melebihi
G1 menggunakan enjin analisis untuk memilih jumlah kerja yang diperlukan untuk kutipan sampah. Ia mengumpul objek hidup tanpa berhenti selepas menentukan set dan memulakan pembersihan. Ini menyebabkan pemungut sampah melebihi sasaran masa jedanya. Sebenarnya, masalah ini diselesaikan dengan penambahbaikan, kerana jika masa yang diperlukan untuk menyelesaikan langkah seterusnya melebihi had yang munasabah, langkah ini boleh diganggu.
Penanda aras mikro
Java 12 memperkenalkan ujian penanda aras mikro supaya prestasi JVM boleh diuji dengan mudah menggunakan penanda aras sedia ada. Ini akan sangat berguna untuk sesiapa sahaja yang ingin mengusahakan JVM itu sendiri. Ujian tambahan dibuat menggunakan Java Microbenchmark Harness (JMH). Ujian ini membolehkan ujian prestasi berterusan pada JVM. JEP 230 mencadangkan pengenalan kira-kira 100 ujian, dengan ujian baharu diperkenalkan apabila versi Java baharu dikeluarkan. Berikut ialah contoh ujian yang ditambah .Shenandoah
Ini ialah algoritma kutipan sampah (GC) yang bertujuan untuk menjamin masa tindak balas yang rendah (had bawah ialah 10-500 ms). Ini mengurangkan masa jeda GC apabila melakukan kerja pembersihan serentak dengan menjalankan benang Java. Di Shenandoah, masa jeda adalah bebas daripada saiz timbunan. Ini bermakna masa jeda akan sama tanpa mengira saiz timbunan anda. Ini adalah ciri percubaan dan tidak termasuk dalam binaan standard (Oracle) OpenJDK.Perbaiki Suis
Java 12 telah menambah baik ungkapan Suis untuk padanan corak. Sintaks baharu L → telah diperkenalkan. Berikut ialah senarai perkara utama suis baharu :- Sintaks baharu menghapuskan keperluan untuk penyataan rehat untuk mengelakkan ralat.
- Tukar ungkapan tidak lagi gagal.
- Selain itu, kita boleh menentukan berbilang pemalar dalam satu label.
- kes lalai kini diperlukan dalam ungkapan suis.
- break digunakan dalam ungkapan Suis untuk mengembalikan nilai daripada daftar itu sendiri (sebenarnya, suis boleh mengembalikan nilai).
var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
Panduan Definitif Untuk Menukar Ungkapan Dalam Java 13 Ciri baharu yang lain:
-
String:
transform(Function f)
- Menggunakan fungsi yang disediakan pada rentetan. Hasilnya mungkin bukan rentetan.indent(int x)
— menambah x ruang pada rentetan. Jika parameter negatif, maka bilangan ruang utama ini akan dialih keluar (jika boleh). -
Files
- mengambil kaedah sepertimismatch()
, yang, seterusnya, mencari dan mengembalikan kedudukan bait pertama yang tidak sepadan dalam kandungan dua fail, atau -1L jika tiada ketidakpadanan. -
Kelas baharu telah muncul -
CompactNumberFormat
untuk memformat nombor perpuluhan dalam bentuk padat. Contoh bentuk padat ini ialah 1M dan bukannya 1,000,000. Oleh itu, hanya dua dua diperlukan dan bukannya sembilan aksara. -
Terdapat juga yang baru
enum
,NumberFormatStyle
yang mempunyai dua nilai - PANJANG dan PENDEK. -
InputStream
mendapat kaedahskipNBytes(long n)
: langkau bilangan bait ke-n dari aliran input.
- Java 12 ada di sini: apa yang baharu?
- Apa yang baharu dalam Java 12
- Apa yang baharu dalam Java 12 (daripada blog Notes of a Witcher Programmer)
Jawa 13
Dunia tidak diam, ia bergerak, ia berkembang, sama seperti Java - Java 13.Blok teks
Java sentiasa menderita sedikit apabila ia datang untuk menentukan rentetan. Jika kita perlu mentakrifkan baris dengan ruang, pemisah baris, petikan atau sesuatu yang lain, ini menyebabkan beberapa kesukaran, jadi kami terpaksa menggunakan aksara khas: contohnya, \n untuk pemisah baris atau melarikan diri daripada beberapa baris sendiri. Ini dengan ketara mengurangkan kebolehbacaan kod dan mengambil masa tambahan apabila menulis baris sedemikian. Ini menjadi ketara apabila menulis rentetan yang memaparkan JSON, XML, HTML, dll. Akibatnya, jika kita ingin menulis Json kecil, ia akan kelihatan seperti ini:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Dan kemudian Java 13 datang ke tempat kejadian dan menawarkan kami penyelesaiannya dalam bentuk petikan berganda tiga sebelum dan selepas teks (yang mereka panggil blok teks). Mari lihat contoh json sebelumnya menggunakan inovasi ini:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
Lebih mudah dan lebih jelas, bukan? String
Tiga kaedah baharu turut ditambah, masing-masing, untuk menguruskan blok ini:
stripIndent()
: Mengalih keluar ruang rawak daripada rentetan. Ini berguna jika anda membaca rentetan berbilang baris dan ingin menggunakan jenis pengecualian ruang putih rawak yang sama yang berlaku dengan pengisytiharan eksplisit (pada asasnya mensimulasikan pengkompil untuk mengalih keluar ruang putih rawak);formatted(Object... args )
: serupa denganformat(String format, Object... arg)
, tetapi untuk blok teks;translateEscapes()
: Mengembalikan rentetan dengan urutan melarikan diri (seperti \r) diterjemahkan kepada nilai Unikod yang sepadan.
Perbaiki Suis
Ungkapan suis telah diperkenalkan dalam Java 12, dan 13 memperhalusinya. Dalam 12 anda mentakrifkan nilai pulangan menggunakan rehat. Dalam 13, nilai pulangan digantikan dengan hasil. Sekarang ungkapan suis yang kami ada di bahagian Java 12 boleh ditulis semula sebagai:var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
yield "Please insert a valid day.";
else
yield "Looks like a Sunday.";
}
};
Walaupun adalah perkara biasa bagi kami pengaturcara yang sudah biasa dengan Java untuk menerima rehat, namun ia agak pelik. Apa yang break true cuba beritahu saya? Kata kunci hasil baharu (agak baharu) lebih jelas dan mungkin muncul di tempat lain pada masa hadapan di mana nilai dikembalikan. Bagi mereka yang sangat berminat dengan topik ini, saya mengesyorkan agar anda membiasakan diri dengan bahan-bahan ini:
Arkib CDS Dinamik
CDS - Perkongsian Data Kelas. Membolehkan anda membungkus satu set kelas yang biasa digunakan ke dalam arkib yang kemudiannya boleh dimuatkan oleh berbilang kejadian JVM. Mengapa kita memerlukan ini? Hakikatnya ialah dalam proses memuatkan kelas, JVM melakukan banyak tindakan intensif sumber, seperti kelas membaca, menyimpannya dalam struktur dalaman, menyemak ketepatan kelas membaca, mencari dan memuatkan kelas bergantung, dsb. ., dan hanya selepas semua ini kelas sedia untuk berfungsi. Maklumlah, banyak sumber dibazirkan, kerana kejadian JVM selalunya boleh memuatkan kelas yang sama. Contohnya String, LinkedList, Integer. Nah, atau kelas aplikasi yang sama, dan semua ini adalah sumber. Jika kami melakukan semua langkah yang diperlukan sekali sahaja dan kemudian meletakkan kelas yang direka bentuk semula dalam arkib yang boleh dimuatkan ke dalam ingatan beberapa JVM, ini boleh menjimatkan ruang memori dengan ketara dan mengurangkan masa permulaan aplikasi. Sebenarnya, CDS membolehkan anda membuat arkib sedemikian. Java 9 hanya membenarkan kelas sistem untuk ditambahkan pada arkib. Java 10 - masukkan kelas aplikasi dalam arkib. Penciptaan arkib sedemikian terdiri daripada:- mencipta senarai kelas yang dimuatkan oleh aplikasi;
- mencipta arkib yang sangat diperlukan dengan kelas yang kami temui.
Kemas kini API Soket
API Soket ( java.net.Socket dan java.net.ServerSocket ) pada asasnya merupakan bahagian penting Java sejak penubuhannya, tetapi soket tidak pernah dikemas kini dalam dua puluh tahun yang lalu. Ditulis dalam C dan Java, mereka sangat, sangat besar dan sukar untuk dikekalkan. Tetapi Java 13 memutuskan untuk membuat pelarasan sendiri terhadap keseluruhan perkara ini dan menggantikan pelaksanaan asas. Kini, bukannya PlainSocketImpl, antara muka pembekal digantikan dengan NioSocketImpl . Pelaksanaan berkod baharu ini adalah berdasarkan infrastruktur bahagian belakang yang sama seperti java.nio . Pada asasnya kelas menggunakan cache penimbal java.util.concurrent dan mekanisme penguncian (yang berasaskan segmen) dan bukannya kaedah yang disegerakkan. Ia tidak lagi memerlukan kod asli, menjadikannya lebih mudah untuk dipindahkan ke platform yang berbeza. Namun, kami mempunyai cara untuk kembali menggunakan PlainSocketImpl , tetapi mulai sekarang NioSocketImpl digunakan secara lalai .Pulangan Memori untuk ZGC
Seperti yang kita ingat, pemungut sampah Z telah diperkenalkan di Java 11 sebagai mekanisme pengumpulan sampah kependaman rendah supaya jeda GC tidak pernah melebihi 10 ms. Tetapi pada masa yang sama, tidak seperti HotSpot GC maya lain, seperti Shenandoah dan G1, ia boleh mengembalikan memori dinamik yang tidak digunakan kepada OS. Pengubahsuaian ini menambahkan keupayaan J ini kepada ZGC. Sehubungan itu, kami mendapat jejak memori yang dikurangkan bersama-sama dengan prestasi yang dipertingkatkan, dan ZGC kini mengembalikan memori yang tidak terikat kepada sistem pengendalian secara lalai sehingga saiz timbunan minimum yang ditentukan dicapai. Seperkara lagi: ZGC kini mempunyai saiz timbunan maksimum yang disokong sebanyak 16 TB. Sebelum ini, 4TB adalah hadnya. Inovasi lain:javax.security
- menambah hartajdk.sasl.disabledMechanisms
untuk melumpuhkan mekanisme SASL.java.nio
- kaedah telah ditambahFileSystems.newFileSystem (Path, Map <String,?>)
- masing-masing, untuk mencipta fail baharu.- Kelas
java.nio
kini mempunyai kaedah mutlak (berbanding relatif)get
danset
-kaedah. Mereka, seperti kelas abstrak asasBuffer
, termasuk kaedahslice()
untuk mendapatkan semula sebahagian daripada penimbal. - Kaedah tambahan
javax.xml.parsers
untuk membuat instantiating kilang DOM dan SAX (dengan sokongan ruang nama). - Sokongan Unicode telah dikemas kini kepada versi 12.1.
- Java 13: Ciri Baharu
- Semua tentang Java 13: menyelami dunia kemas kini
- 81 Ciri dan API Baharu dalam JDK 13
GO TO FULL VERSION