Java 11
var (дар лямбда)
Минбаъд, мо метавонем намудҳои параметрҳои лямбдаро муайян кунем ё ҳангоми навиштани ифодаи лямбда (ифодаҳои ба таври возеҳ чопшудаи ламбда) онҳоро сарфи назар кунем:Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Шумо инчунин метавонед ба параметрҳои лямбда эзоҳҳо илова кунед, бидуни навиштани номи навъи тағирёбанда:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z(ZGC)
ZGC як коллектори нави ахлот аст, ки кор намекунад. Он хотираи нав ҷудо мекунад, аммо ҳеҷ гоҳ онро бозоғоз намекунад. ZGC ваъда медиҳад, ки миқдори зиёди хотираро бо қобorяти баланд ва таъхири паст идора мекунад (ZGC танҳо дар платформаҳои 64-бит дастрас аст). Рангкунии истинод - ZGC нишондиҳандаҳои 64-битаро бо усуле истифода мебарад, ки рангкунии нишондиҳанда ном дорад. Нишондиҳандаҳои ранга маълумоти иловагиро дар бораи an objectҳои теппа нигоҳ медоранд. Вақте ки хотира пора мешавад, ин барои пешгирӣ кардани таназзули кор кӯмак мекунад, вақте ки GC бояд ҷойеро барои тақсимоти нав пайдо кунад. Ҷамъоварии партовҳо бо истифода аз ZGC аз қадамҳои зерин иборат аст:- ҷаҳон таваққуф мекунад: мо барои расидан ба an objectҳои теппа (ба монанди тағирёбандаҳои маҳаллӣ ё майдонҳои статикӣ) нуқтаҳои ибтидоиро меҷӯем;
- чорроҳаи графикҳои an objectӣ, ки аз пайвандҳои реша оғоз мешаванд. Мо ҳар як an objectи ба мо расидаро қайд мекунем (ZGC аз графики an object мегузарад ва аломатҳои рангаро месанҷад, an objectҳои мавҷударо нишон медиҳад);
- коркарди баъзе ҳолатҳои канорӣ, ба монанди пайвандҳои заиф;
- кӯчонидани an objectҳои зинда, озод кардани майдонҳои калони тӯда барои тезонидани тақсимот.
- вақте ки марҳилаи интиқол оғоз меёбад, ZGC теппаро ба саҳифаҳо тақсим мекунад ва дар як вақт як саҳифа кор мекунад;
- ZGC ҳаракати ҳама гуна решаҳоро анҷом медиҳад ва боқимондаи ҳаракат ба амал меояд.
- Муқаддима ба ZGC: Ҷамъоварии партовҳои JVM-и миқёспазир ва таҷрибавии камдаромад
- Ҷамъоварии партовҳои хонагӣ барои Open JDK
- Ҷамъоварии нави Z Garbage Java (ZGC) хеле ҳаяҷоновар аст
Epsilon GC
Epsilon як коллектори ахлот аст, ки тақсимоти хотираро идора мекунад, аммо ягон механизми барқарорсозии хотираро амалӣ намекунад. Вақте ки теппаи мавҷудаи Java тамом мешавад, JVM хомӯш мешавад. Яъне, агар шумо эҷод кардани an objectро дар массиви беохир бидуни пайвастшавӣ ба истинод бо ин коллектори ахлот оғоз кунед, барнома бо OutOfMemoryError садама мезанад (ва агар бо ягон дигараш, ин кор намекунад, зеро он an objectҳоро бе истинодҳо тоза мекунад) . Чаро он лозим аст? Ана чаро:- Санҷиши иҷроиш.
- Санҷиши фишори хотира.
- Санҷиши интерфейси VM.
- Кори бениҳоят кӯтоҳ.
- Такмилдиҳии таъхири охирин.
- Такмor интиқоли охирин.
- GC нави Epsilon. Java метавонад ҷамъоварии партовҳоро надошта бошад. Шок. Ҳиссиёт
- Муқаддима ба Epsilon GC: Ҷамъоварии партовҳои таҷрибавии ғайрифаъол
ByteArrayOutputStream
усуле гирифтvoid writeBytes(byte [])
, ки тамоми byteҳоро аз далел тоOutputStream
.FileReader
ваFileWriter
конструкторҳои нав гирифтанд, ки ба шумо имкон медиҳанд Charset-ро муайян кунед.Path
ду усули навро гирифт, аз як аргументи сатр роҳ ё пайдарпаии сатрҳороof(String, String [])
бармегардонад , ки ҳангоми якҷояшавӣ сатри роҳро ташкил медиҳанд ва : Роҳро аз URI бармегардонад.Path
of(URI)
Pattern
— усуле гирифта шудаастasMatchPredicate()
, ки тафтиш мекунад, ки оё сатри вуруди додашуда ба намунаи додашуда мувофиқат мекунад (оё он ба шумо имкон медиҳад, ки бо истифода аз ифодаи муқаррарӣ предикат эҷод кунед, то шумо метавонед, масалан, маълумотро дар ҷараён филтр кунед).String
Ман бисёр усулҳои муфидро интихоб кардам, ба монанди:String strip()
: ба мо сатрро бармегардонад, ки ин сатр аст ва ҳамаи фосилаҳо дар аввал ва охири сатр хориҷ карда шудаанд (монанд ба trim(), аммо фосилаҳоро ба таври дигар муайян мекунад);String stripLeading()
: сатрро, ки ин сатр аст, ба мо бармегардонад ва ҳама гуна фосилаҳои пешро аз сатр хориҷ мекунад;String stripTrailing()
: сатрро, ки ин сатр аст, ба мо бармегардонад ва ҳама гуна фосилаҳоро дар охири сатр хориҷ мекунад;Stream lines()
Stream
: моро азString
, истихроҷшуда аз ин сатр, ки бо ҷудокунакҳои сатр ҷудо шудааст, бармегардонад ;String repeat(int)
: ба мо сатреро бармегардонад, ки пайвастагии ин сатр аст ва чанд маротиба такрор мешавад.boolean isBlank()
: ҳақиқӣ бар мегардонад, агар сатр холӣ бошад ё танҳо фосила дошта бошад, дар акси ҳол дурӯғ.
Thread
— усулҳои destroy() ва stop(Throwable) хориҷ карда шуданд.Files
як қатор усулҳои нав гирифт:String readString(Path)
: ҳама маълумотро аз файл ба сатр мехонад, ҳангоми рамзкушоӣ аз byteҳо ба аломатҳо бо истифода аз рамзгузории UTF-8;String readString(Path, Charset)
: ҳамон тавре ки дар усули дар боло овардашуда, бо фарқияти он, ки рамзкушоӣ аз byteҳо ба аломатҳо бо истифода аз Charset муайяншуда сурат мегирад;Path writeString (Path, CharSequence, OpenOption [])
: пайдарпайии аломатҳоро ба файл менависад. Аломатҳо бо истифода аз рамзгузории UTF-8 ба byteҳо рамзгузорӣ карда мешаванд;Path writeString(Path, CharSequence,Charset, OpenOption [])
: Усули дар боло зикршуда, танҳо аломатҳо бо истифода аз рамзгузории дар Charset муайяншуда ба byte рамзгузорӣ карда мешаванд.
Java 12
Шаш моҳ мегузарад ва мо марҳилаи навбатии эволютсияи Java-ро мебинем. Пас, вақти он расидааст, ки бели донишро бароварда кобед.Навсозии G1
Барои G1 беҳбудиҳои зерин анҷом дода шуданд:-
Хотираи ҷудошудаи истифоданашударо барқарор кунед
Дар хотираи теппаи Java чунин чизе вуҷуд дорад, ки хотираи истифоданашуда (ё ба ибораи дигар, ғайрифаъол). Дар Java 12 онҳо тасмим гирифтанд, ки ин мушкилотро ҳал кунанд, ҳоло:
- G1 хотираро аз тӯда дар GC пурра ё дар давоми як даври мувозӣ бармегардонад; G1 кӯшиш мекунад, ки GC-и пурраро пешгирӣ кунад ва дар асоси тақсимоти теппа як ҳалқаи мувозиро оғоз кунад. Мо бояд G1-ро маҷбур кунем, ки хотираро аз тӯда баргардонад.
Ин такмилдиҳӣ ба иҷроиш тавассути баргардонидани хотира ба таври худкор аз тӯда ба OS, вақте ки G1 истифода намешавад, тамаркуз мекунад.
-
Қатъи коллексияҳои омехта ҳангоми гузаштани вақти таваққуф
G1 муҳаррики таҳлorро барои интихоби ҳаҷми кор барои ҷамъоварии партовҳо истифода мебарад. Он an objectҳои зиндаро бидуни таваққуф пас аз муайян кардани маҷмӯа ва оғози тозакунӣ ҷамъ меорад. Ин боиси он мегардад, ки ҷамъкунандаи ахлот аз вақти таваққуф таъиншуда зиёд мешавад. Воқеан, ин мушкилот бо такмилдиҳӣ ҳал карда мешавад, зеро агар вақти зарурӣ барои анҷом додани қадами оянда аз ҳудуди оқилона зиёд бошад, ин қадамро қатъ кардан мумкин аст.
Микробенчмарк
Java 12 санҷишҳои микробенчмаркингро ҷорӣ кард, то иҷрои JVM-ро бо истифода аз меъёрҳои мавҷуда ба осонӣ санҷидан мумкин аст. Ин барои ҳар касе, ки мехоҳад дар худи JVM кор кунад, хеле муфид хоҳад буд. Санҷишҳои иловагӣ бо истифода аз Java Microbenchmark Harness (JMH) сохта шудаанд. Ин санҷишҳо имкон медиҳанд, ки санҷиши доимии иҷроиш дар JVM. JEP 230 ҷорӣ намудани тақрибан 100 санҷишро пешниҳод мекунад ва санҷишҳои нав ҳангоми баровардани versionҳои нави Java ҷорӣ карда мешаванд. Ин аст мисоли санҷишҳои иловашуда .Шенандоа
Ин як алгоритми ҷамъоварии ахлот (GC) мебошад, ки ҳадафи он кафолат додани вақти вокуниши кам (ҳадди поёнии 10-500 мс) мебошад. Ин вақти таваққуфи GC-ро ҳангоми иҷрои корҳои тозакунӣ ҳамзамон бо риштаҳои Java кам мекунад. Дар Шенандоа, вақти таваққуф аз андозаи теппа новобаста аст. Ин маънои онро дорад, ки вақти таваққуф новобаста аз андозаи теппаи шумо якхела хоҳад буд. Ин хусусияти таҷрибавӣ аст ва ба сохтори стандартии (Oracle) OpenJDK дохил карда нашудааст.Гузаришро беҳтар кунед
Java 12 ифодаҳои Switchро барои мувофиқати намуна такмил додааст. Синтаксиси нави L → ҷорӣ карда шуд. Дар ин ҷо як рӯйхати нуқтаҳои асосии гузариш нав аст :- Синтаксиси нав зарурати изҳороти танаффусро барои пешгирии хатогиҳо аз байн мебарад.
- Ифодаҳои ивазкунӣ дигар ноком намешаванд.
- Илова бар ин, мо метавонем константаҳои сершуморро дар як нишона муайян кунем.
- ҳолати пешфарз ҳоло дар ифодаҳои гузариш талаб карда мешавад.
- танаффус дар ифодаҳои Гузариш барои баргардонидани арзишҳо аз худи реестр истифода мешавад (дар асл, коммутатор метавонад арзишҳоро баргардонад).
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 Дигар хусусиятҳои нав:
-
String:
transform(Function f)
- Функсияи додашударо ба сатр татбиқ мекунад. Натиҷа метавонад сатр набошад.indent(int x)
— ба сатр фосилаи x илова мекунад. Агар параметр манфӣ бошад, пас ин шумораи ҷойҳои пешбари хориҷ карда мешаванд (агар имконпазир бошад). -
Files
- усули ба мисли -ро гирифтmismatch()
, ки дар навбати худ мавқеи byteи аввал номувофиқро дар мӯҳтавои ду файл ё -1L дар сурати мавҷуд набудани номувофиқӣ пайдо ва бармегардонад. -
Синфи нав пайдо шуд -
CompactNumberFormat
барои формат кардани адади даҳӣ дар шакли паймон. Намунаи ин шакли паймон 1М ба ҷои 1,000,000 аст. Ҳамин тариқ, ба ҷои нӯҳ аломат танҳо ду ду лозим аст. -
Инчунин як чизи нав мавҷуд аст
enum
,NumberFormatStyle
ки ду арзиш дорад - LONG ва SHORT. -
InputStream
усул гирифтskipNBytes(long n)
: шумораи n-уми byteро аз ҷараёни вуруд гузаред.
- Java 12 дар ин ҷост: чӣ нав аст?
- Дар Java 12 чӣ нав аст
- Чӣ нав дар Java 12 (аз блоги Notes of a Witcher Programmer)
Java 13
Ҷаҳон дар як ҷо намеистад, ҳаракат мекунад, инкишоф меёбад, мисли Java - Java 13.Блоки матн
Вақте ки сухан дар бораи муайян кардани сатр меравад, Java ҳамеша каме азоб мекашид. Агар ба мо лозим ояд, ки сатрро бо фосила, танаффуси сатр, иқтибос ё чизи дигар муайян кунем, ин боиси баъзе мушкилот гардид, бинобар ин мо маҷбур шудем, ки аломатҳои махсусро истифода барем: масалан, \n барои танаффуси сатр, ё аз баъзе сатр раҳо шудан худаш. Ин хониши рамзро ба таври назаррас коҳиш медиҳад ва ҳангоми навиштани чунин сатр вақти иловагӣ мегирад. Ин махсусан ҳангоми навиштани сатрҳое намоён мешавад, ки JSON, XML, HTML ва ғайраро намоиш медиҳанд. Дар натиҷа, агар мо хоҳем, ки Json-и хурдро нависем, он чунин хоҳад буд:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Ва он гоҳ Java 13 ба саҳна меояд ва ба мо ҳалли худро дар шакли нохунакҳои сегонаи дугона пеш аз ва пас аз матн пешниҳод мекунад (ки онҳоро блокҳои матнӣ меноманд). Биёед ба мисоли қаблии json бо истифода аз ин навоварӣ назар кунем:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
Хеле соддатар ва равшантар, ҳамин тавр не? String
Барои идоракунии ин блокҳо мутаносибан се усули нав илова карда шуданд :
stripIndent()
: Ҷойҳои тасодуфиро аз сатр хориҷ мекунад. Ин муфид аст, агар шумо сатрҳои бисёрсатрро хонда истода бошед ва мехоҳед, ки ҳамон як истиснои фосилаи тасодуфиро, ки бо эъломияи возеҳ рух медиҳад, татбиқ кунед (аслан моделсозии компилятор барои нест кардани фазои тасодуфӣ);formatted(Object... args )
: монанд баformat(String format, Object... arg)
, аммо барои блокҳои матнӣ;translateEscapes()
: Сатрро бо пайдарпаии фирор (ба монанди \r) ба арзиши мувофиқи Юниcodeи тарҷумашуда бармегардонад.
Гузаришро беҳтар кунед
Ифодаҳои гузариш дар Java 12 ҷорӣ карда шуданд ва 13 онҳоро такмил медиҳад. Дар 12 шумо бо истифода аз танаффус арзишҳои бозгаштро муайян мекунед. Дар 13, арзиши бозгашт бо ҳосил иваз карда шуд. Акнун ифодаи гузаришро, ки мо дар бахши Java 12 доштем, метавон чунин навишт: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.";
}
};
Ҳарчанд қабули танаффус барои мо барномасозоне, ки аллакай бо Java шинос буданд, муқаррарӣ буд, аммо ин хеле аҷиб буд. Кӯшиши ба ман гуфтани ҳақиқӣ чист? Калимаи нави даромад (нисбатан нав) равшантар аст ва метавонад дар дигар ҷойҳое пайдо шавад, ки арзишҳо баргардонида мешаванд. Барои онҳое, ки ба ин мавзӯъ таваҷҷӯҳи амиқ доранд, ман тавсия медиҳам, ки бо ин маводҳо шинос шавед:
Архивҳои динамикии CDS
CDS - Мубодилаи маълумот дар синф. Ба шумо имкон медиҳад, ки маҷмӯи синфҳои маъмулан истифодашавандаро дар бойгонӣ баста кунед, ки баъдтар метавонанд аз ҷониби якчанд мисолҳои JVM бор карда шаванд. Чаро ба мо ин лозим аст? Гап дар он аст, ки JVM дар ҷараёни боркунии синфҳо амалҳои зиёди захиравиро иҷро мекунад, ба монанди хондани синфҳо, нигоҳ доштани онҳо дар сохторҳои дохилӣ, тафтиши дурустии синфҳои хондашуда, ҷустуҷӯ ва боркунии синфҳои вобаста ва ғайра. , ва танхо баъди хамаи ин синфхо ба кор омода мешаванд. Фаҳмост, ки захираҳои зиёде сарф мешаванд, зеро мисолҳои JVM аксар вақт як синфҳоро бор мекунанд. Масалан, String, LinkedList, Integer. Хуб, ё синфҳои ҳамон як барнома ва ҳамаи инҳо захираҳо мебошанд. Агар мо ҳама қадамҳои заруриро танҳо як маротиба иҷро кунем ва баъд синфҳои аз нав тарҳрезишударо дар бойгонӣ ҷойгир кунем, ки он метавонад ба хотираи якчанд JVM бор карда шавад, ин метавонад фазои хотираро ба таври назаррас сарфа кунад ва вақти оғози барномаро кам кунад. Дар асл, CDS имкон медиҳад, ки маҳз чунин бойгонӣ эҷод карда шавад. Java 9 танҳо иҷозат дод, ки синфҳои системавӣ ба бойгонӣ илова карда шаванд. Java 10 - синфҳои барномаро дар бойгонӣ дохил кунед. Таъсиси чунин архив аз инҳо иборат аст:- эҷод кардани рӯйхати синфҳои аз ҷониби барнома боршуда;
- эҷод кардани бойгонии хеле зарурӣ бо синфҳое, ки мо ёфтем.
Навсозии API Socket
API-и Socket ( java.net.Socket ва java.net.ServerSocket ) аслан як ҷузъи ҷудонашавандаи Java аз замони пайдоишаш мебошад, аммо розеткаҳо дар бист соли охир ҳеҷ гоҳ нав карда нашудаанд. Дар C ва Java навишта шуда буданд, онҳо хеле ва хеле калон буданд ва нигоҳдорӣ душвор буданд. Аммо Java 13 тасмим гирифт, ки ба ин масъала ислоҳоти худро ворид кунад ва татбиқи асосиро иваз кард. Ҳоло, ба ҷои PlainSocketImpl, интерфейси провайдер бо NioSocketImpl иваз карда шудааст . Ин татбиқи нави рамзгузорӣ ба ҳамон инфрасохтори пуштибонии java.nio асос ёфтааст . Аслан синф кэши буферии java.util.concurrent ва механизми қулфкуниро (ки ба сегмент асос ёфтааст) истифода мебарад, на усулҳои ҳамоҳангшуда. Он дигар codeи модариро талаб намекунад ва интиқолро ба платформаҳои гуногун осон мекунад. Бо вуҷуди ин, мо роҳи баргаштан ба истифодаи PlainSocketImpl дорем , аммо аз ҳоло NioSocketImpl ба таври нобаёнӣ истифода мешавад .Бозгашти хотира барои ZGC
Тавре ки мо дар хотир дорем, коллектори партовҳои Z дар Java 11 ҳамчун механизми ҷамъоварии партовҳои камдаромад ҷорӣ карда шуд, то таваққуфи GC ҳеҷ гоҳ аз 10 мс зиёд набошад. Аммо дар айни замон, бар хилофи дигар нуқтаҳои виртуалии GC, ба монанди Shenandoah ва G1, он метавонад хотираи динамикии истифоданашударо ба ОС баргардонад. Ин тағирот ин қобorяти J-ро ба ZGC илова мекунад. Мутаносибан, мо изофаи хотираи камшударо дар баробари беҳтар шудани кор ба даст меорем ва ZGC ҳоло хотираи номаҳдудро ба системаи оператсионӣ ба таври нобаёнӣ бармегардонад, то он даме, ки андозаи ҳадди ақали тӯдаи муайяншуда ба даст ояд. Боз як чизи дигар: ZGC ҳоло андозаи ҳадди аксар дастгирӣшавандаи 16 TB дорад. Пештар, 4TB маҳдудият буд. Дигар инноватсияҳо:javax.security
- хосиятjdk.sasl.disabledMechanisms
барои хомӯш кардани механизмҳои SASL илова карда шуд.java.nio
- усул илова карда шудFileSystems.newFileSystem (Path, Map <String,?>)
- мутаносибан барои сохтани файли нав.- Синфҳо
java.nio
ҳоло мутлақ (бар хилофи нисбӣ)get
ваset
-методҳо доранд. Онҳо, ба монанди синфи абстрактии базавӣBuffer
, усулиslice()
ҷустуҷӯи қисми буферро дар бар мегиранд. - Усулҳои иловашуда
javax.xml.parsers
барои эҷоди заводҳои DOM ва SAX (бо дастгирии фазои ном). - Дастгирии Юниcode ба versionи 12.1 навсозӣ шудааст.
- Java 13: Хусусиятҳои нав
- Ҳама дар бораи Java 13: ғарқ шудан ба ҷаҳони навсозиҳо
- 81 Хусусиятҳои нав ва API дар JDK 13
GO TO FULL VERSION