Java 11
var (lambdada)
Bundan buyon biz lambda parametrlarining turlarini belgilashimiz yoki lambda ifodasini yozishda ularni o'tkazib yuborishimiz mumkin (bevosita terilgan lambda ifodalari):Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Oʻzgaruvchining toʻliq nomini yozmasdan ham lambda parametrlariga izoh qoʻshishingiz mumkin:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z(ZGC)
ZGC - bu ishlamaydigan yangi axlat yig'uvchi. U yangi xotira ajratadi, lekin uni hech qachon qayta ishga tushirmaydi. ZGC katta hajmdagi xotirani yuqori o'tkazuvchanlik va past kechikish bilan boshqarishni va'da qiladi (ZGC faqat 64 bitli platformalarda mavjud). Yo'naltiruvchi rang berish - ZGC 64-bitli ko'rsatkichlarni ko'rsatgichni ranglash deb ataladigan texnikadan foydalanadi. Rangli ko'rsatkichlar to'plamdagi ob'ektlar haqida qo'shimcha ma'lumotlarni saqlaydi. Xotira parchalanib ketganda, bu GC yangi ajratish uchun joy topishi kerak bo'lganda unumdorlikning pasayishini oldini olishga yordam beradi. ZGC yordamida axlat yig'ish quyidagi bosqichlardan iborat:- dunyo to'xtash joylari: biz to'plamdagi ob'ektlarga (masalan, mahalliy o'zgaruvchilar yoki statik maydonlar) erishish uchun boshlang'ich nuqtalarni qidiramiz;
- ildiz bog'lanishlardan boshlanadigan ob'ekt grafiklarining kesishishi. Biz erishgan har bir ob'ektni belgilaymiz (ZGC ob'ekt grafigi bo'ylab yuradi va rangli markerlarni tekshiradi, mavjud ob'ektlarni belgilaydi);
- zaif havolalar kabi ba'zi chekka holatlar bilan ishlash;
- tirik ob'ektlarni ko'chirish, ajratishni tezlashtirish uchun uyumning katta maydonlarini bo'shatish.
- ko'chirish bosqichi boshlanganda, ZGC to'plamni sahifalarga ajratadi va bir vaqtning o'zida bir sahifa ishlaydi;
- ZGC har qanday ildizlarning harakatini tugatadi va harakatning qolgan qismi sodir bo'ladi.
- ZGC ga kirish: kengaytiriladigan va eksperimental past kechikishli JVM axlat yig'uvchisi
- Open JDK uchun uy qurilishi axlat yig'uvchi
- Java-ning yangi Z axlat yig'uvchisi (ZGC) juda hayajonli
Epsilon GC
Epsilon - bu xotirani taqsimlash bilan shug'ullanadigan, lekin haqiqiy xotirani tiklash mexanizmini amalga oshirmaydigan axlat yig'uvchi. Mavjud Java to'plami tugagach, JVM o'chadi. Ya'ni, agar siz ushbu axlat yig'uvchi bilan mos yozuvlar bilan bog'lanmasdan cheksiz massivda ob'ekt yaratishni boshlasangiz, dastur OutOfMemoryError bilan ishlamay qoladi (va agar boshqasi bo'lsa, u ishlamay qoladi, chunki u ob'ektlarni havolalarsiz tozalaydi) . Nima uchun kerak? Buning sababi:- Ishlash testi.
- Xotira bosimini tekshirish.
- VM interfeysi sinovdan o'tkazilmoqda.
- Juda qisqa ish.
- Oxirgi tushishning kechikishi yaxshilandi.
- Oxirgi pasayish tezligi yaxshilandi.
- Yangi GC Epsilon. Java-da axlat yig'ish bo'lmasligi mumkin. Shok. Sensatsiya
- Epsilon GC ga kirish: ishlamaydigan eksperimental axlat yig'uvchi
ByteArrayOutputStream
void writeBytes(byte [])
argumentdan barcha baytlarni yozadigan usulga ega bo'ldiOutputStream
.FileReader
vaFileWriter
Charset ni belgilash imkonini beruvchi yangi konstruktorlar oldi.Path
ikkita yangi usulni qo'lga kiritdi, string argumentidan birlashganda yo'l qatorini tashkil etuvchi yo'l yoki satrlar ketma-ketliginiof(String, String [])
qaytaradi va : URI dan Path ni qaytaradi.Path
of(URI)
Pattern
— berilgan kiritish satri berilgan naqshga mos kelishini tekshiradigan usul oldiasMatchPredicate()
(masalan, oqimdagi maʼlumotlarni filtrlash uchun muntazam ifoda yordamida predikat yaratishga imkon beradimi yoki yoʻqmi).String
Men juda ko'p foydali usullarni tanladim, masalan:String strip()
: bizga ushbu satr bo'lgan satrni qaytaradi, satrning boshida va oxiridagi barcha bo'shliqlar olib tashlanadi (trim() ga o'xshash, lekin bo'shliqlarni boshqacha belgilaydi);String stripLeading()
: bizga ushbu satr bo'lgan satrni qaytaradi, satrdan oldingi bo'shliqlarni olib tashlaydi;String stripTrailing()
: satr oxiridagi barcha bo'shliqlarni olib tashlagan holda, bizga ushbu satr bo'lgan satrni qaytaradi;Stream lines()
Stream
: bizni dan qaytaradiString
, bu qatordan ajratilgan, qator ajratgichlar bilan ajratilgan;String repeat(int)
: bizga bir necha marta takrorlangan ushbu satrning birikmasi bo'lgan qatorni qaytaradi.boolean isBlank()
: agar satr bo'sh bo'lsa yoki faqat bo'sh joy bo'lsa, true qiymatini qaytaradi, aks holda false.
Thread
— destroy() va stop(Throwable) usullari olib tashlandi.Files
bir qator yangi usullar mavjud:String readString(Path)
: UTF-8 kodlash yordamida baytlardan belgilargacha dekodlashda fayldan barcha ma'lumotlarni satrga o'qiydi;String readString(Path, Charset)
: yuqoridagi usulda bo'lgani kabi, baytlardan belgilarga dekodlash belgilangan Charset yordamida amalga oshiriladigan farq bilan;Path writeString (Path, CharSequence, OpenOption [])
: Faylga belgilar ketma-ketligini yozadi. Belgilar UTF-8 kodlash yordamida baytlarga kodlangan;Path writeString(Path, CharSequence,Charset, OpenOption [])
: Yuqoridagi usul bilan bir xil, faqat belgilar Charsetda ko'rsatilgan kodlash yordamida baytlarga kodlanadi.
- Java 11: nima yangilik? Yangi xususiyatlar va imkoniyatlar
- Java-ning o'n bitta yashirin marvaridlari 11
Java 12
Olti oy o'tadi va biz Java evolyutsiyasining keyingi bosqichini ko'ramiz. Shunday qilib, bilim belkurakini olib, qazish vaqti keldi.G1-ni yangilang
G1 uchun quyidagi yaxshilanishlar kiritildi:-
Ishlatilmagan ajratilgan xotirani tiklang
Java yig'ma xotirasida foydalanilmagan xotira (yoki boshqacha aytganda, faol emas) kabi narsa mavjud. Java 12 da ular ushbu muammoni hal qilishga qaror qilishdi, endi:
- G1 xotirani to'liq GCda yoki parallel sikl davomida to'pdan qaytaradi; G1 to'liq GC ni oldini olishga harakat qiladi va yig'ish taqsimotiga asoslangan parallel tsiklni boshlaydi. Biz G1 ni xotirani yig'ishdan qaytarishga majbur qilishimiz kerak.
Ushbu takomillashtirish G1 ishlatilmayotganda xotirani yig'ishdan OTga avtomatik ravishda qaytarish orqali ishlashga qaratilgan.
-
Pauza vaqti oshib ketganda aralash kollektsiyalarni bekor qilish
G1 axlat yig'ish uchun zarur bo'lgan ish hajmini tanlash uchun tahlil mexanizmidan foydalanadi. U to'plamni belgilab, tozalashni boshlagandan so'ng to'xtamasdan jonli ob'ektlarni to'playdi. Bu axlat yig'uvchining pauza vaqtidan oshib ketishiga olib keladi. Aslida, bu muammoni takomillashtirish orqali hal qilinadi, chunki keyingi bosqichni bajarish uchun zarur bo'lgan vaqt oqilona chegaralardan tashqarida bo'lsa, bu qadam to'xtatilishi mumkin.
Mikrobenchmark
Java 12 mikrobenchmarking testlarini joriy qildi, shunda JVM ish faoliyatini mavjud ko'rsatkichlar yordamida osongina sinab ko'rish mumkin. Bu JVM ning o'zida ishlashni istagan har bir kishi uchun juda foydali bo'ladi. Qo'shilgan testlar Java Microbenchmark Harness (JMH) yordamida yaratilgan. Ushbu testlar JVMda uzluksiz ishlash testlarini o'tkazish imkonini beradi. JEP 230 100 ga yaqin testlarni joriy etishni taklif qiladi, Java-ning yangi versiyalari chiqarilganda yangi testlar kiritiladi. Bu erda qo'shilayotgan testlarga misol .Shenandoah
Bu axlat yig'ish (GC) algoritmi bo'lib, uning maqsadi past javob vaqtlarini kafolatlashdir (pastki chegara 10-500 ms). Bu Java iplarini ishga tushirish bilan bir vaqtda tozalash ishlarini bajarishda GC pauza vaqtini qisqartiradi. Shenandoahda pauza vaqti to'p hajmiga bog'liq emas. Bu sizning to'plamingiz hajmidan qat'i nazar, pauza vaqti bir xil bo'lishini anglatadi. Bu eksperimental xususiyatdir va OpenJDK standart (Oracle) tuzilishiga kiritilmagan.Switch-ni yaxshilash
Java 12 naqshni moslashtirish uchun Switch ifodalarini yaxshilagan. Yangi L → sintaksisi kiritildi. Mana yangi kalitning asosiy nuqtalari ro'yxati :- Yangi sintaksis xatolarning oldini olish uchun break bayonotiga ehtiyojni yo'q qiladi.
- Ifodalarni almashtirish endi muvaffaqiyatsiz tugadi.
- Bundan tashqari, biz bitta yorliqda bir nechta konstantalarni belgilashimiz mumkin.
- kommutator iboralarida endi standart holat talab qilinadi.
- break registrning o'zidan qiymatlarni qaytarish uchun Switch iboralarida ishlatiladi (aslida kalit qiymatlarni qaytarishi mumkin).
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.";
}
};
Java 13 da ifodalarni almashtirish bo'yicha aniq qo'llanma Boshqa yangi xususiyatlar:
-
String:
transform(Function f)
- Taqdim etilgan funktsiyani satrga qo'llaydi. Natija qator bo'lmasligi mumkin.indent(int x)
— satrga x boʻsh joy qoʻshadi. Agar parametr salbiy bo'lsa, unda bu etakchi bo'shliqlar soni o'chiriladi (agar iloji bo'lsa). -
Files
- kabi usulni qo'lga kiritdimismatch()
, bu esa o'z navbatida ikkita fayl mazmunidagi birinchi mos kelmaydigan baytning o'rnini topadi va qaytaradi yoki mos kelmaydigan bo'lsa -1L. -
Yangi sinf paydo bo'ldi -
CompactNumberFormat
o'nlik sonni ixcham shaklda formatlash uchun. Ushbu ixcham shaklga misol 1 000 000 o'rniga 1M. Shunday qilib, to'qqizta belgi o'rniga faqat ikkita ikkita belgi talab qilinadi. -
Shuningdek , ikkita qiymatga ega bo'lgan yangisi mavjud - UZOQ va QISQA.
enum
NumberFormatStyle
-
InputStream
usulni oldiskipNBytes(long n)
: kirish oqimidan baytlarning n-sonini o'tkazib yuboring.
- Java 12 bu yerda: nima yangilik?
- Java 12 da nima yangiliklar
- Java 12-da nima yangiliklar (Witcher Programmerining Notes blogidan)
Java 13
Dunyo xuddi Java - Java 13 kabi bir joyda turmaydi, harakat qiladi, rivojlanadi.Matn bloki
Java har doim satrlarni belgilashda biroz azob chekdi. Agar qatorni boʻsh joy, qator uzilishi, tirnoq yoki boshqa biror narsa bilan belgilashimiz kerak boʻlsa, bu baʼzi qiyinchiliklarga sabab boʻldi, shuning uchun biz maxsus belgilardan foydalanishga majbur boʻldik: masalan, qator uzilishi uchun \n yoki qatorning bir qismidan qochishimiz kerak edi. o'zi. Bu kodning o'qilishini sezilarli darajada kamaytiradi va bunday qatorni yozishda qo'shimcha vaqt talab etiladi. Bu JSON, XML, HTML va hokazolarni aks ettiruvchi satrlarni yozishda ayniqsa seziladi. Natijada, agar biz kichik Json yozmoqchi bo'lsak, u quyidagicha ko'rinadi:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Va keyin Java 13 sahnaga chiqadi va bizga matndan oldin va keyin (ular matn bloklari deb atalgan) uch qo'sh tirnoq shaklida o'z yechimini taklif qiladi. Keling, ushbu yangilikdan foydalangan holda oldingi json misolini ko'rib chiqaylik:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
Bu ancha sodda va tushunarli, shunday emasmi? String
Ushbu bloklarni boshqarish uchun mos ravishda uchta yangi usul qo'shildi :
stripIndent()
: Satrdan tasodifiy bo'shliqlarni olib tashlaydi. Agar siz ko'p qatorli satrlarni o'qiyotgan bo'lsangiz va aniq deklaratsiya bilan yuzaga keladigan bir xil turdagi tasodifiy bo'shliqni istisno qilishni xohlasangiz foydali bo'ladi (asosan tasodifiy bo'shliqni olib tashlash uchun kompilyatorni simulyatsiya qilish);formatted(Object... args )
: ga o'xshashformat(String format, Object... arg)
, lekin matn bloklari uchun;translateEscapes()
: Tegishli Unicode qiymatiga tarjima qilingan qochish ketma-ketliklari (masalan, \r) bilan satrni qaytaradi.
Switch-ni yaxshilash
Switch iboralari Java 12 da joriy qilingan va 13 tasi ularni yaxshilaydi. 12-da siz qaytish qiymatlarini break yordamida aniqlaysiz. 13-da, qaytarish qiymati rentabellik bilan almashtirildi. Endi Java 12 bo'limida mavjud bo'lgan switch ifodasi quyidagicha qayta yozilishi mumkin: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.";
}
};
Biz Java-ni yaxshi bilgan dasturchilar uchun tanaffusni qabul qilish odatiy hol bo'lsa-da, bu juda g'alati edi. Menga aytmoqchi bo'lgan haqiqat nima? Yangi (nisbatan yangi) yield kalit so'zi aniqroq va kelajakda qiymatlar qaytariladigan boshqa joylarda paydo bo'lishi mumkin. Ushbu mavzuga chuqur qiziqqanlar uchun men sizga ushbu materiallar bilan tanishishingizni tavsiya qilaman:
Dinamik CDS arxivlari
CDS - sinf ma'lumotlarini almashish. Tez-tez ishlatiladigan sinflar to'plamini keyinchalik bir nechta JVM nusxalari tomonidan yuklanishi mumkin bo'lgan arxivga joylashtirish imkonini beradi. Nega bizga bu kerak? Gap shundaki, sinflarni yuklash jarayonida JVM juda ko'p resurs talab qiladigan harakatlarni amalga oshiradi, masalan, darslarni o'qish, ularni ichki tuzilmalarda saqlash, o'qilgan sinflarning to'g'riligini tekshirish, qaram sinflarni qidirish va yuklash va h.k. ., va shundan keyingina darslar ishlashga tayyor. JVM nusxalari ko'pincha bir xil sinflarni yuklashi mumkinligi sababli, ko'p resurslar isrof bo'lishi tushunarli. Masalan, String, LinkedList, Integer. Xo'sh, yoki bir xil dasturning sinflari va bularning barchasi resurslardir. Agar biz barcha kerakli amallarni bir marta bajargan bo'lsak va keyin qayta ishlangan sinflarni bir nechta JVM xotirasiga yuklanishi mumkin bo'lgan arxivga joylashtirsak, bu xotira maydonini sezilarli darajada tejash va ilovalarni ishga tushirish vaqtini qisqartirishi mumkin. Aslida, CDS aynan shunday arxivni yaratishga imkon beradi. Java 9 faqat tizim sinflarini arxivga qo'shishga ruxsat berdi. Java 10 - arxivga dastur sinflarini kiritish. Bunday arxivni yaratish quyidagilardan iborat:- ilova tomonidan yuklangan sinflar ro'yxatini yaratish;
- topilgan sinflar bilan juda kerakli arxiv yaratish.
Socket API-ni yangilang
Socket API ( java.net.Socket va java.net.ServerSocket ) mohiyatan Java tilining yaratilganidan beri ajralmas qismi hisoblanadi, biroq soketlar oxirgi yigirma yil ichida hech qachon yangilanmagan. C va Java tillarida yozilgan, ular juda, juda katta hajmli va ularga xizmat ko'rsatish qiyin edi. Ammo Java 13 bu masalaga o'z tuzatishlarini kiritishga qaror qildi va asosiy dasturni almashtirdi. Endi PlainSocketImpl o'rniga provayder interfeysi NioSocketImpl bilan almashtirildi . Ushbu yangi kodlangan dastur java.nio bilan bir xil back-end infratuzilmasiga asoslangan . Asosan, sinf sinxronlashtirilgan usullardan ko'ra java.util.concurrent bufer keshini va qulflash mexanizmidan (segmentga asoslangan) foydalanadi. U endi mahalliy kodni talab qilmaydi, bu esa turli platformalarga portlashni osonlashtiradi. Shunga qaramay, bizda PlainSocketImpl dan foydalanishga qaytishning yo'li bor , ammo bundan buyon NioSocketImpl sukut bo'yicha ishlatiladi .ZGC uchun xotirani qaytarish
Esingizda bo'lsa, Z axlat yig'uvchisi Java 11-da GC pauzasi hech qachon 10 ms dan oshmasligi uchun past kechikishli axlat yig'ish mexanizmi sifatida taqdim etilgan. Biroq, shu bilan birga, Shenandoah va G1 kabi boshqa virtual GC Hotspots-dan farqli o'laroq, u foydalanilmagan dinamik xotirani OTga qaytarishi mumkin. Ushbu modifikatsiya ushbu J qobiliyatini ZGC-ga qo'shadi. Shunga ko'ra, biz yaxshilangan ishlash bilan birga qisqargan xotira maydoniga ega bo'lamiz va ZGC endi belgilangan minimal yig'ish hajmiga yetguncha sukut bo'yicha operatsion tizimga sozlanmagan xotirani qaytaradi. Yana bir narsa: ZGC endi maksimal qo'llab-quvvatlanadigan yig'ma hajmi 16 TB. Ilgari 4TB chegara edi. Boshqa innovatsiyalar:javax.security
jdk.sasl.disabledMechanisms
- SASL mexanizmlarini o'chirish uchun xususiyat qo'shildi .java.nio
FileSystems.newFileSystem (Path, Map <String,?>)
- mos ravishda yangi fayl yaratish usuli qo'shildi .- Sinflar
java.nio
endi mutlaq (nisbiydan farqli o'laroq)get
vaset
-metodlarga ega. Ular, asosiy abstrakt sinf kabi , buferning bir qismini olishBuffer
usulini o'z ichiga oladi .slice()
- DOM va SAX zavodlarini yaratish uchun qo'shilgan
javax.xml.parsers
usullar (nomlar maydonini qo'llab-quvvatlash bilan). - Unicode qo'llab-quvvatlashi 12.1 versiyasiga yangilandi.
- Java 13: Yangi xususiyatlar
- Java 13 haqida hamma narsa: yangilanishlar dunyosiga sho'ng'ish
- JDK 13 da 81 ta yangi xususiyatlar va API
GO TO FULL VERSION