{"id":310734,"date":"2020-09-30T15:00:39","date_gmt":"2020-09-30T15:00:39","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=310734"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=310734","title":{"rendered":"\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Java 9-16"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/521240\/\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Java, \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u044e\u0442. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0439\u00bb: \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c, \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u044f \u043d\u0430\u0448 \u043a\u043e\u0434 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044f \u0432\u0437\u0430\u043c\u0435\u043d, \u0430 \u043c\u044b \u0434\u0430\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u043d\u0438\u0445 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c!<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <strong>\u0422\u0430\u0433\u0438\u0440 \u0412\u0430\u043b\u0435\u0435\u0432<\/strong> (<a href=\"https:\/\/habr.com\/ru\/users\/lany\/\" class=\"user_link\">lany<\/a>), \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043e \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043d \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u043d\u0430 Joker 2019 \u0441 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u00abJava 9-14: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\u00bb, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=5Y0Alqb9H_I\">\u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c<\/a>. \u0417\u0430\u0442\u0435\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c, \u043d\u0430 JPoint 2020 \u043e\u043d <a href=\"https:\/\/www.youtube.com\/watch?v=NXh98XRi2is\">\u0440\u0430\u0437\u0432\u0438\u043b \u0442\u0435\u043c\u0443<\/a>. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u0441\u0442 \u0434\u043b\u044f \u0425\u0430\u0431\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u043e \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_h\/fc\/ry\/_hfcryb_u6klly9azo79yrlyuis.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0442 \u043b\u0438\u0446\u0430 \u0441\u043f\u0438\u043a\u0435\u0440\u0430. <\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"vstuplenie\">\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u044f\u043c\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435: \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e. \u041c\u044b \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c API, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u043f\u043e\u0441\u043b\u0435 Java 8. \u0412\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0430\u0448 Java 8-\u043a\u043e\u0434 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u043e\u0439 JVM.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0434, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0443\u0447\u043d\u044b\u0435, \u043d\u043e \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u0432\u044b\u0432\u043e\u0434\u044b \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435. \u0422\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043d\u0430 Intel Core i7-6820HQ \u043f\u043e\u0434 Windows 10. \u0412\u0441\u0435 \u043e\u043d\u0438 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \u0441\u043c\u0435\u043d\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u043f\u0446\u0438\u044f +UseParallelGC. \u041d\u0430 \u0432\u0441\u0435\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435\u00bb.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/338732\/\">\u0434\u043e\u043a\u043b\u0430\u0434<\/a> \u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0428\u0438\u043f\u0438\u043b\u0451\u0432\u0430 \u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u00ab\u041a\u0440\u0438\u0432\u0443\u044e \u0438\u043c\u0435\u043d\u0438 \u0428.\u00bb \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0438\u043a\u0438\u043d\u0443\u0442\u044c, \u0433\u0434\u0435 \u043e\u043d\u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/102\/f32\/5f7\/102f325f7dc84c3391330c60fb562164.png\"><\/p>\n<p>  <\/p>\n<h2 id=\"stringhashcode\">String.hashCode<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0437\u0430\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 String.hashCode. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0438 <em>\u00ab\u0411\u0435\u0433\u0430\u0432\u0448\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b\u00bb<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public int calcHashCode() {   return &quot;\u0411\u0435\u0433\u0430\u0432\u0448\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b&quot;.hashCode(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 Java 12 \u0438 Java 13 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0o\/m0\/nv\/0om0nvrmdkxjjuujha-6rkxw9my.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 4 \u0440\u0430\u0437\u0430? \u0412\u0441\u0435 \u0434\u0435\u043b\u043e \u0432 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f. \u0412\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442\u0435 \u0432 \u043b\u043e\u0442\u0435\u0440\u0435\u044e, \u0447\u0435\u043c \u043d\u0430\u0442\u043a\u043d\u0451\u0442\u0435\u0441\u044c \u043d\u0430 \u0442\u0430\u043a\u0443\u044e. \u0421\u0440\u0430\u0432\u043d\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a: <em>\u00ab\u0411\u0435\u0433\u0430\u0432\u0448\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b\u00bb<\/em> \u0438 <em>\u00ab\u0411\u0435\u0433\u0430\u0432\u0448\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b\u00bb<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public int calcHashCode() {   return &quot;\u0411\u0435\u0433\u0430\u0432\u0448\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b&quot;.hashCode(); }  @Benchmark public int calcHashCode2() {   return &quot;\u0411\u0435\u0433\u0430\u0432\u0448\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b&quot;.hashCode(); }<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xy\/xz\/cj\/xyxzcjjfjukrqpac0qy3lagitns.png\"><\/p>\n<p>  <\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 Java 12, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043e\u043d\u00bb \u0443\u0436\u0435 \u0431\u0435\u0433\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u0431\u0430\u0440\u044b \u0431\u044b\u0441\u0442\u0440\u043e, \u00ab\u043e\u043d\u0430\u00bb \u0435\u0449\u0451 \u0431\u0435\u0433\u0430\u043b\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. \u041d\u043e \u0432 Java 13 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043e\u0432. \u0412 \u0447\u0451\u043c \u0434\u0435\u043b\u043e?<br \/>  \u0412 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430. \u0421 Java 9 \u043f\u043e Java 12 \u043c\u0435\u0442\u043e\u0434 hashCode() \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a (\u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0447\u0443\u0442\u044c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e Compact Strings):<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/** Cache the hash code for the string *\/ private int hash; \/\/ Default to 0  public int hashCode() {     int h = hash;     if (h == 0 &amp;&amp; value.length &gt; 0) {         hash = h = isLatin1() ? StringLatin1.hashCode(value)                               : StringUTF16.hashCode(value);     }     return h; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u0434\u0430\u0432\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0438 \u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c. \u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437 4 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 0. \u0418 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0445\u0435\u0448-\u043a\u043e\u0434 \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0445\u0435\u0448-\u043a\u043e\u0434 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u043d \u0438 \u0435\u0449\u0435 \u043d\u0435\u0442, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 0 \u043a\u0430\u043a \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0410 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u2014 \u043d\u0443 \u0447\u0442\u043e \u0436, \u0432\u044b \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0438\u043a, \u0431\u0443\u0434\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430 JPoint 2015 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0428\u0438\u043f\u0438\u043b\u0451\u0432 \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 <a href=\"https:\/\/www.youtube.com\/watch?v=SZFe3m1DV1A\">\u00ab\u041a\u0430\u0442\u0435\u0445\u0438\u0437\u0438\u0441 java.lang.String\u00bb<\/a>. \u041d\u0430 Java 8 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440 <em>\u00ab\u0441\u0432\u0435\u0440\u0445\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0448\u0430\u044f\u00bb<\/em> \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0432\u0430\u043b \u0445\u0435\u0448-\u043a\u043e\u0434 0, \u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <em>\u00ab\u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0448\u0430\u044f \u0441\u0432\u0435\u0440\u0445\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c\u00bb<\/em> \u0434\u0430\u0432\u0430\u043b\u0430 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u043b \u043c\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0441\u0442\u043e\u0432, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 String \u0432\u044b\u0440\u043e\u0441 \u0431\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0441\u0442\u044b \u043f\u043e\u0431\u0435\u0434\u0438\u043b\u0438, \u043f\u0440\u0438\u0447\u0435\u043c \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0438\u043c \u043f\u043e\u043c\u043e\u0433.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 layout \u043e\u0431\u044a\u0435\u043a\u0442\u0430 String \u0432 Java 8. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0430 64-\u0431\u0438\u0442\u043d\u043e\u0439 JVM \u0432 String \u0438 \u0442\u0430\u043a \u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c 4 \u0431\u0430\u0439\u0442\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u0445\u043e\u0442\u044c \u0441\u043e \u0441\u0436\u0430\u0442\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438, \u0445\u043e\u0442\u044c \u0431\u0435\u0437. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c 1 \u0431\u0430\u0439\u0442. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ne\/ri\/dg\/neridg23gxbm0-ytug6stwan3oy.png\"><\/p>\n<p>  <\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432 32-\u0431\u0438\u0442\u043d\u043e\u0439 JVM \u043f\u043e\u0442\u0435\u0440\u044c \u043d\u0435 \u0431\u044b\u043b\u043e. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0435\u0449\u0435 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043b\u043e \u043c\u0435\u0441\u0442\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u0430 \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0432 Java 9 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u043b\u0430\u043b \u0441\u0430\u043c \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0428\u0438\u043f\u0438\u043b\u0451\u0432, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u043e. \u0414\u043b\u044f \u0438\u0445 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 Latin-1, \u0438\u043b\u0438 \u0436\u0435 \u0432 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c UTF-16 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0435\u0440\u044f\u0435\u0442 3 \u0431\u0430\u0439\u0442\u0430, \u0438 \u0432\u0440\u044f\u0434 \u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e VM, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 3 \u043b\u0438\u0448\u043d\u0438\u0445 \u0431\u0430\u0439\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 0. \u0410 \u0440\u0430\u0437 \u043e\u043d\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b, \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u043d\u044f\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445?<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432 Java 13, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u0443\u043b\u0435\u0432\u043e \u043f\u043e\u043b\u0435 <em>String.hashIsZero<\/em>:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n0\/ce\/lz\/n0celzoplizqc6ztibxwgl3icgy.png\"><\/p>\n<p>  <\/p>\n<p>\u0418 \u0435\u0449\u0435 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private int hash; \/\/ Default to 0 private boolean hashIsZero; \/\/ Default to false; public int hashCode() {     int h = hash;     if (h == 0 &amp;&amp; !hashIsZero) {         h = isLatin1() ? StringLatin1.hashCode(value)                        : StringUTF16.hashCode(value);         if (h == 0) {             hashIsZero = true;         } else {             hash = h;         }     }     return h; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435 <em>hashIsZero<\/em>? \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u043b\u043e\u0433\u0438\u0447\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u0435 <em>hashIsCalculated<\/em> \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 <em>true<\/em>, \u043a\u043e\u0433\u0434\u0430 \u0445\u0435\u0448 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d.<\/p>\n<p>  <\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u0435\u0442\u043e\u0434 <em>hashCode()<\/em> \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0433\u043e\u043d\u043a\u0430 \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0435 \u043e\u0434\u043d\u043e, \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0443\u0432\u0438\u0434\u0438\u0442 \u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0445\u0435\u0448-\u043a\u043e\u0434, \u043b\u0438\u0431\u043e 0 (\u0442\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e). \u041d\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0435\u0439 \u043d\u0435\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430, \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u0418 \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u0435 <em>hashIsCalculated<\/em> \u0438 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 <em>hashIsCalculated<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 true \u0438 \u0445\u0435\u0448, \u0440\u0430\u0432\u043d\u044b\u0439 0, \u0438 \u0432\u0435\u0440\u043d\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0445\u0435\u0448.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u044f\u0449\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0438\u0448\u0443\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 String: \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0434\u0440\u0443\u0433\u043e\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u043d\u0430 \u0440\u0435\u0432\u044c\u044e, \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0428\u0438\u043f\u0438\u043b\u0451\u0432 \u0434\u043e\u043b\u0433\u043e \u0432\u0441\u0435\u0445 \u0443\u0431\u0435\u0436\u0434\u0430\u043b, \u0447\u0442\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u041d\u043e \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0437\u043c \u043f\u043e\u0431\u0435\u0434\u0438\u043b.<\/p>\n<p>  <\/p>\n<h2 id=\"stringconcat\">String.concat<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 +, \u043d\u043e \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <em>String.concat()<\/em>. \u0412\u044b\u044f\u0441\u043d\u0438\u043c, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Param({&quot;&quot;, &quot;is a very very very very very very very very cool conference!&quot;}) String data;  @Benchmark public String concat() {   return &quot;JPoint &quot;.concat(data); }  @Benchmark public String plus() {   return &quot;JPoint &quot; + data; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fj\/lf\/s_\/fjlfs_vlg2yv8vb4mfrrxhanvsi.png\"><\/p>\n<p>  <\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u0435\u0442\u043e\u0434 <em>String.concat()<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Java 8-14 \u0437\u0430 ~3 \u043d\u0441, \u0430 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 + \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 15 \u043d\u0441, \u043f\u0440\u0438\u0447\u0435\u043c \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0434\u043e ~19 \u043d\u0441. \u041f\u043e\u0447\u0435\u043c\u0443? <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se14\/html\/jls-15.html#jls-15.18.1\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a> Java. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u0442 \u0441 \u0440\u0430\u043d\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0431\u044b breaking change. \u0410 <em>String.concat()<\/em> \u043d\u0435 \u0441\u043a\u043e\u0432\u0430\u043d \u044d\u0442\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c, \u0434\u0430\u0436\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0432 \u0435\u0433\u043e <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/14\/docs\/api\/java.base\/java\/lang\/String.html#concat(java.lang.String)\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u0447\u0435\u0442\u043a\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 0, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043b\u0435\u0432\u0430 \u043f\u0443\u0441\u0442\u0430\u044f, \u0442\u043e\u0433\u0434\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. <\/p>\n<p>  <\/p>\n<p>\u041f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u044b \u043d\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u0443\u0435\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0435. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4u\/53\/w8\/4u53w8rwizaulgdiyphhlvktvs8.png\"><\/p>\n<p>  <\/p>\n<p>\u0421 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u0432 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0435\u0441\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 Java 8 <em>String.concat()<\/em> \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u0434\u0432\u043e\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 +, \u0430 \u0432 Java 9 \u043e\u043d \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0414\u043e Java 12 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439, \u043d\u043e \u0432 Java 13 \u0438 Java 14 <em>String.concat()<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 + \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 10%.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043d\u0435 \u0441\u043f\u0435\u0448\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 <em>String.concat()<\/em>. \u0412 Java 9 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <a href=\"https:\/\/openjdk.java.net\/jeps\/280\">JEP 280<\/a> \u2014 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0447\u0435\u0440\u0435\u0437 invokedynamic-\u0432\u044b\u0437\u043e\u0432\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 + \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0430 \u043c\u0435\u0442\u043e\u0434 <em>String.concat()<\/em> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 JEP 280 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0441 \u0442\u0430\u0440\u0433\u0435\u0442\u043e\u043c Java 9 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0437\u0430\u043d\u043e\u0432\u043e:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/98\/tb\/gs\/98tbgswqi0n0p559nwcbkddxrps.png\"><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0442\u043e \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0432 \u0441\u0432\u0435\u0436\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Java \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c\u0441\u044f. \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0441 \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0434\u043e \u043f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0438 \u0441\u0440\u0430\u0432\u043d\u044f\u043b\u0430\u0441\u044c \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e <em>String.concat()<\/em>. \u0427\u0442\u043e \u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043a\u0430\u0447\u043a\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438?<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 <em>String.concat()<\/em> \u0432 Java 12:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public String concat(String str) {     if (str.isEmpty()) {         return this;     }     if (coder() == str.coder()) {         byte[] val = this.value;         byte[] oval = str.value;         int len = val.length + oval.length;         byte[] buf = Arrays.copyOf(val, len);         System.arraycopy(oval, 0, buf, val.length, oval.length);         return new String(buf, coder);     }     int len = length();     int olen = str.length();     byte[] buf = StringUTF16.newBytesFor(len + olen);     getBytes(buf, 0, UTF16);     str.getBytes(buf, len, UTF16);     return new String(buf, UTF16); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u0412\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e, \u0438 \u043d\u0435\u044f\u0441\u043d\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public String concat(String str) {     if (str.isEmpty()) {         return this;     }     return StringConcatHelper.simpleConcat(this, str); }  static String simpleConcat(Object first, Object second) {     String s1 = stringOf(first);     String s2 = stringOf(second);     \/\/ start &quot;mixing&quot; in length and coder or arguments, order is not     \/\/ important     long indexCoder = mix(initialCoder(), s2);     indexCoder = mix(indexCoder, s1);     byte[] buf =(indexCoder);     \/\/ prepend each argument in reverse order, since we prepending     \/\/ from the end of the byte array     indexCoder = prepend(indexCoder, buf, s2);     indexCoder = prepend(indexCoder, buf, s1);     return newString(buf, indexCoder); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 Java 13 \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <em>simpleConcat()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u0445 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0435\u0442\u043e\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u0435\u043d\u044c\u0448\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0438 \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u044b \u0432 \u043c\u0435\u0442\u043e\u0434\u044b <em>mix()<\/em> \u0438 <em>prepend()<\/em>. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <em>newArray()<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">static byte[] newArray(long indexCoder) {     byte coder = (byte)(indexCoder &gt;&gt; 32);     int index = (int)indexCoder;     return (byte[]) UNSAFE.allocateUninitializedArray(byte.class, index &lt;&lt; coder); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0431\u0438\u0442\u044b\u0439 \u043d\u0443\u043b\u044f\u043c\u0438. \u041d\u0430 \u044d\u0442\u043e\u043c \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c. \u0410 \u0432 Java 12 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <em>newArray()<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <em>copyOf()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043d\u0443\u043b\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<p>  <\/p>\n<h2 id=\"konkatenaciya-pustyh-strok\">\u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u043e\u043a<\/h2>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043d\u0435 \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u0434\u0430\u0432\u0430\u043b \u043f\u043e\u043a\u043e\u044f.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wo\/gg\/5z\/wogg5zng7kvuqffdtfnekdsduyg.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u043e 11 \u043d\u0441 \u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e. \u042f \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u043d\u0430\u0434 \u044d\u0442\u0438\u043c, \u0438 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0442\u0447 <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8247605\">JDK-8247605<\/a>, \u043f\u0440\u0438\u0447\u0435\u043c \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432 Java 16.<br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043d\u043e\u0432\u0430 \u043d\u0430 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 <em>simpleConcat()<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">static String simpleConcat(Object first, Object second) {     String s1 = stringOf(first);     String s2 = stringOf(second);     \/\/ start &quot;mixing&quot; in length and coder or arguments, order is not     \/\/ important     long indexCoder = mix(initialCoder(), s2);     indexCoder = mix(indexCoder, s1);     byte[] buf =(indexCoder);     \/\/ prepend each argument in reverse order, since we prepending     \/\/ from the end of the byte array     indexCoder = prepend(indexCoder, buf, s2);     indexCoder = prepend(indexCoder, buf, s1);     return newString(buf, indexCoder); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 <em>s1<\/em> \u0438\u043b\u0438 <em>s2<\/em> \u2014 \u043f\u0443\u0441\u0442\u0430\u044f. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. \u041d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u0434 \u043d\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0412\u0435\u0434\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043f\u0440\u044f\u0442\u0430\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">... String s1 = stringOf(first); String s2 = stringOf(second); if (s1.isEmpty()) {     \/\/ newly created string required, see JLS 15.18.1     return new String(s2); }    if (s2.isEmpty()) {     \/\/ newly created string required, see JLS 15.18.1     return new String(s1); }   ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0434\u0430\u0432\u043d\u0438\u0445 \u043f\u043e\u0440 \u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435. \u041d\u043e \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043d\u0430\u0448\u0438 \u0446\u0435\u043b\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0442\u0447 \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u0440\u0430\u043d\u043d\u0438\u0445 \u0441\u0431\u043e\u0440\u043e\u043a Java 16, \u0438 \u0438\u0445 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xv\/kf\/am\/xvkfam7gymadvvzvzzsogphm_fo.png\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u043f\u0440\u0438\u0447\u0435\u043c \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0441\u043f\u0440\u0430\u0432\u0430 \u0438\u043b\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430) \u0443\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 ~6 \u043d\u0441. <\/p>\n<p>  <\/p>\n<p>\u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a \u043c\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043f\u0430\u043c\u044f\u0442\u044c: \u0435\u0441\u043b\u0438 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u043c\u0438, \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u041d\u043e \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 target-\u0432\u0435\u0440\u0441\u0438\u044f Java 9 \u0438 \u0432\u044b\u0448\u0435. <\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0438 \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 invokedynamic \u2014 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0444\u0438\u0447\u0443, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"treemapcomputeifabsent-i-drugie-metody-kollekciy\">TreeMap.computeIfAbsent \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u043f\u044f\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0432 Java 8 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 <em>map<\/em>:<\/p>\n<p>  <\/p>\n<ul>\n<li>putIfAbsent()<\/li>\n<li>computeIfAbsent()<\/li>\n<li>computeIfPresent()<\/li>\n<li>compute()<\/li>\n<li>merge()<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 <em>map<\/em>, \u0438 \u0432\u0441\u0435, \u043a\u0440\u043e\u043c\u0435 <em>putIfAbsent()<\/em>, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043b\u044f\u043c\u0431\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <em>computeIfAbsent()<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">default V computeIfAbsent(K key,         Function&lt;? super K, ? extends V&gt; mappingFunction) {     Objects.requireNonNull(mappingFunction);     V v;     if ((v = get(key)) == null) {          V newValue;         if ((newValue = mappingFunction.apply(key)) != null) {             put(key, newValue);             return newValue;         }     }      return v; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <em>computeIfAbsent()<\/em> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 <em>map<\/em>, \u0435\u0441\u043b\u0438 \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e, \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0432\u043d\u043e null, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0435\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b: \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <em>get()<\/em> \u0438\u0449\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0435, \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <em>put()<\/em> \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438, \u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b 2 \u0440\u0430\u0437\u0430 \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0434\u0435\u0448\u0435\u0432\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u043d\u0435 \u0437\u043d\u0430\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e map. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 Java 8, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 map \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/h5\/v2\/of\/h5v2ofnepx5uvxfezf7cugxm1gg.png\"><\/p>\n<p>  <\/p>\n<p>\u0410 \u0434\u043b\u044f <em>TreeMap<\/em> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0442. \u0410 \u0432\u0435\u0434\u044c \u043f\u043e\u0438\u0441\u043a \u0432 \u043d\u0435\u043c \u2014 \u043d\u0435\u0434\u0435\u0448\u0435\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0451\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b, \u0445\u043e\u0442\u044f \u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0438\u0441\u043a\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0440\u0433\u0435\u0439 \u041a\u0443\u043a\u0441\u0435\u043d\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0435\u0449\u0435 \u0432 2017 \u0433\u043e\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0448\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 Java 10. \u0411\u044b\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u043d\u0430 Code Review, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u0434\u0435\u043b\u043e \u0437\u0430\u0433\u043b\u043e\u0445\u043b\u043e. \u0412 2019 \u0433\u043e\u0434\u0443 \u044f \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u0438\u043b \u043f\u0430\u0442\u0447 \u0438 \u0434\u043e\u0432\u0435\u043b \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0432 \u043e\u0434\u0438\u043d \u0431\u0430\u0433 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <em>merge()<\/em>, \u0442\u0435\u0441\u0442\u044b \u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438. \u041f\u0430\u0442\u0447 \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e Java 15, \u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e\u0439:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bv\/vm\/fj\/bvvmfjksxqmsit1mfu-wl7ni-g4.png\"><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043a\u043b\u044e\u0447\u0443. \u0422\u043e \u0435\u0441\u0442\u044c \u0432 map \u0432 <em>computeIfAbsent()<\/em> \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0431\u044b\u043b\u043e, \u0438 \u043e\u043d\u0438 \u0442\u0443\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u0410 \u0432 <em>computeIfPresent()<\/em> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0438, \u0438 \u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b\u0438. \u0414\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 map \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u043e 10-20 % \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u0436\u0435 \u043d\u0430 \u043d\u0438\u0445.<\/p>\n<p>  <\/p>\n<p>\u0423 \u043f\u0430\u0442\u0447\u0430 \u0435\u0441\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430. \u0427\u0442\u043e\u0431\u044b \u0435\u0435 \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0434\u0435\u043b\u0430\u044e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u2014 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0447\u0438\u0441\u0435\u043b \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438. <\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public BigInteger fibo(int arg) {     if (arg &lt; 1) {         throw new IllegalArgumentException();     }     if (arg &lt;= 2) {         return BigInteger.ONE;     }     return fibo(arg - 1).add(fibo(arg - 2)); }  public static void main(String[] args) {     Fibo fibo = new Fibo();     System.out.println(fibo.fibo(100)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0437 \u0441\u0442\u044b\u0434\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c 100. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0434\u043e\u043b\u0433\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0430\u0441\u044c, \u0438 \u0436\u0434\u0430\u0442\u044c \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435\u0442. \u0417\u0430\u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Map&lt;Integer, BigInteger&gt; map = new HashMap&lt;&gt;();  private BigInteger calcFibo(int arg) {     if (arg &lt; 1) {         throw new IllegalArgumentException();     }     if (arg &lt;= 2) {         return BigInteger.ONE;     }     return fibo(arg - 1).add(fibo(arg - 2)); }  public BigInteger fibo(int arg) {     BigInteger value = map.get(arg);     if (value == null) {         value = calcFibo(arg);         map.put(arg, value);     }     return value; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e, \u0430 \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c HashMap. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c <em>calcFibo()<\/em> \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043a\u044d\u0448\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0440\u044b\u0432\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u0434\u0430\u0441\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u043d\u0430\u0448 \u043a\u044d\u0448:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public static void main(String[] args) {     Fibo fibo = new Fibo();     System.out.println(fibo.fibo(100));     \/\/ 354224848179261915075     System.out.println(fibo.map.get(100));     \/\/ 354224848179261915075 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u043d\u0430\u0448\u0435 \u0447\u0438\u0441\u043b\u043e. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u043e\u0442 100, \u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 <em>map<\/em>. \u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u043d\u0430\u0448\u0435\u0439 <em>map<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">System.out.println(fibo.map.size()); \/\/ 100  <\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043d\u0435\u0439 \u0432\u0441\u0435\u0433\u043e 100 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u041f\u0440\u0438\u044f\u0442\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043a\u043e\u0434 \u0432 \u0441\u0442\u0438\u043b\u0435 Java 7. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0421\u0430\u043c\u0430 IntelliJ IDEA \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c if \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 fibo() \u043d\u0430 computeIfAbsent(), \u0447\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public BigInteger fibo(int arg) {     return map.computeIfAbsent(arg, this::calcFibo); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 \u0441\u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u0438\u0441\u043a \u043d\u0430\u0448\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u0435\u0448\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 null. \u0421\u0442\u0440\u0430\u043d\u043d\u043e. \u0420\u0430\u0437\u043c\u0435\u0440 map \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 185. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c. <\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u0448\u0430 map \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u043e\u0439, \u0438 \u0442\u0430\u043a\u043e\u0432\u0430 \u0446\u0435\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c <em>get()<\/em> \u0438 <em>put()<\/em>, \u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. <\/p>\n<p>  <\/p>\n<p>\u0423 \u043c\u0435\u0442\u043e\u0434\u0430 <em>computeIfAbsent()<\/em> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u0438\u0448\u044c \u043d\u0430 \u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0430\u0439\u0442\u0438 \u043c\u0435\u0441\u0442\u043e \u0432 \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043d\u0435\u0451.<\/li>\n<li>\u0418\u043d\u0430\u0447\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>mappingFunction()<\/em>.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0430 null, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null.<\/li>\n<li>\u0418\u043d\u0430\u0447\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0451 \u0432 \u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e.<\/li>\n<li>\u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/li>\n<li>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c <em>size<\/em> \u043d\u0430 1.<\/li>\n<li>\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u0448\u0430\u0433\u0435 3.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 map, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0440\u0435\u0434\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0447\u0438\u0441\u0435\u043b \u0438 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0442\u043e\u0436\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u0443\u0436\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0410 \u0437\u0434\u0435\u0441\u044c \u043d\u0430 \u0448\u0430\u0433\u0435 5 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0441\u0442\u0430\u0440\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. <\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u043b\u043e \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0443\u0436\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0441\u0443\u043d\u0443\u043b\u0438 \u0435\u0433\u043e \u0432 map, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 1. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 HashMap \u0441\u0442\u0430\u043b \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u043e\u043b\u043e\u043c\u043a\u0430 HashMap \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. <\/p>\n<p>  <\/p>\n<p>\u0412 Java 9, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0435\u0448\u0438\u043b\u0438. \u041d\u0443 \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u043b\u0438: \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0434 \u0441\u0442\u0430\u043b \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c <em>ConcurrentModificationException<\/em>. \u0417\u0430\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 HashMap \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u044b\u043c\u0438. <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0438\u043c <em>computeIfAbsent()<\/em>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TreeMap \u0432\u043c\u0435\u0441\u0442\u043e HashMap, \u0432\u0435\u0434\u044c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u043c\u0435\u0442\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0432 TreeMap \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Java 8-14, \u043d\u043e \u0432 Java 15 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u0442 \u0442\u0430 \u0436\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0432\u0435\u0434\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u0442\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u043e\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u043c\u0435\u0442\u043e\u0434 <em>computeIfAbsent()<\/em> \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0438 \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0430\u0441\u044c. \u0414\u0430\u0436\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e<\/p>\n<p>  <\/p>\n<blockquote><p>The mapping function should not modify this map during computation.<\/p><\/blockquote>\n<p>  <\/p>\n<h2 id=\"arraylistremoveif\">ArrayList.removeIf<\/h2>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <em>removeIf()<\/em> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 Java 8 \u0443 \u0432\u0441\u0435\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439, \u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">default boolean removeIf(Predicate&lt;? super E&gt; filter) {     Objects.requireNonNull(filter);     boolean removed = false;     final Iterator&lt;E&gt; each = iterator();     while (each.hasNext()) {         if (filter.test(each.next())) {             each.remove();             removed = true;         }     }     return removed; }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0431\u0435\u0436\u0438\u043c \u0438\u043c \u043f\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0437\u0430\u0442\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>Iterator.remove()<\/em> \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0448\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0431\u0443\u043b\u0435\u0432\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <em>removed<\/em>, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0434\u043e Java 8 \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u043b\u0435\u0441\u0442\u044c default-\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0412 ArrayList \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0435\u0449\u0435 \u0432 Java 8, \u043d\u043e \u0432 Java 9 \u0435\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438. \u0418\u0437\u043c\u0435\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u043c: \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c ArrayList, \u0437\u0430\u043a\u0438\u043d\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u0442 0 \u0434\u043e size-1 \u0438 \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">data = new ArrayList&lt;&gt;(); for (int i = 0; i &lt; size; i++) {   data.add(i); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u044d\u0442\u0430\u043b\u043e\u043d\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">removeAll:   list.removeIf(x -&gt; true); removeHalf:  list.removeIf(x -&gt; x % 2 == 0); removeLast:  list.removeIf(x -&gt; x == size - 1); removeFirst: list.removeIf(x -&gt; x == 0); removeNone:  list.removeIf(x -&gt; false);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 <em>ArrayList.removeIf()<\/em> \u0432 Java 8 \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 1000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6n\/-o\/73\/6n-o73cvpn8f1wum-ym8gl8cheo.png\"><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0437\u0443\u043c\u043d\u043e, \u0447\u0442\u043e removeAll \u043f\u043e\u0431\u0435\u0434\u0438\u043b removeHalf \u0438 removeFirst. \u041c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 ArrayList \u043b\u0435\u0436\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u043e \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043d\u0443\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u043d\u044f\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0445\u043e\u0442\u044f \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043d\u0443\u043b\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0435\u0440\u043d\u0435\u043c \u043d\u0430\u0448 ArrayList \u0432 subList, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hn\/qy\/sw\/hnqysw_p6_uumkks2frvyjj33g0.png\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u0430\u0445. \u0412 removeAll \u043c\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0432 20 \u0440\u0430\u0437, \u0432 removeHalf \u2014 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 6 \u0440\u0430\u0437. \u041d\u043e \u0437\u0430\u0442\u043e removeLast \u0438 removeFirst \u0441 subList \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0430\u0437\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0447\u0435\u043c \u0441\u0435\u043a\u0440\u0435\u0442 \u00ab\u0434\u043b\u0438\u043d\u043d\u044b\u0445\u00bb \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432? \u0412 Java 8 <em>subList(0, size).removeIf()<\/em> \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u043e\u043e\u0431\u0449\u0435, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f default-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0445\u0432\u043e\u0441\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0445 \u0436\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 Java 9:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ql\/hm\/wz\/qlhmwzefwldb6wzhbuy48unq30u.png\"><\/p>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 subList \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b, \u0438 \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Java 9 \u043e subList \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438. \u041f\u0440\u0438\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u0441\u0447\u0435\u0437\u043b\u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0432\u044b\u0431\u0440\u043e\u0441\u044b. \u0414\u0430 \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u043e\u0441\u0442\u043e\u0440\u0436\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430: removeLast \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0441\u043b\u0435 removeNone. \u0425\u043e\u0442\u044c \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u043e\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 subList \u0432 removeFirst \u0432 Java 8. \u0420\u0430\u0437\u0433\u0430\u0434\u0430\u0435\u043c \u0437\u0430\u0433\u0430\u0434\u043a\u0443 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. <\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <em>removeIf()<\/em> \u0432 Java 8 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043a\u0443\u0441\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public boolean removeIf(Predicate&lt;? super E&gt; filter) {     Objects.requireNonNull(filter);     \/\/ figure out which elements are to be removed     \/\/ any exception thrown from the filter predicate at this stage     \/\/ will leave the collection unmodified     int removeCount = 0;     final BitSet removeSet = new BitSet(size);     final int expectedModCount = modCount;     final int size = this.size;     for (int i=0; modCount == expectedModCount &amp;&amp; i &lt; size; i++) {         @SuppressWarnings(&quot;unchecked&quot;)         final E element = (E) elementData[i];         if (filter.test(element)) {             removeSet.set(i);             removeCount++;         }     }     if (modCount != expectedModCount) {         throw new ConcurrentModificationException();     }     \/\/ shift surviving elements left over the spaces     \/\/ left by removed elements     final boolean anyToRemove = removeCount &gt; 0;     if (anyToRemove) {         final int newSize = size - removeCount;         for (int i=0, j=0; (i &lt; size) &amp;&amp; (j &lt; newSize); i++, j++) {             i = removeSet.nextClearBit(i);             elementData[j] = elementData[i];         }         for (int k=newSize; k &lt; size; k++) {             elementData[k] = null; \/\/ Let gc do its work         }             this.size = newSize;         if (modCount != expectedModCount) {             throw new ConcurrentModificationException();         }         modCount++;     }      return anyToRemove; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u0443\u0441\u043a\u0435 \u043c\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440 \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c BitSet, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0431\u0438\u0442\u044b \u0442\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0438\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0435\u0437 BitSet, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0430\u0445 ArrayList \u0431\u044b\u043b \u0431\u044b \u043f\u043e\u043b\u043e\u043c\u0430\u043d. \u0422\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0439 ArrayList \u043c\u043e\u0433\u0443\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u0432\u043d\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438. \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f default-\u043c\u0435\u0442\u043e\u0434\u0430, \u0433\u0434\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0443 \u0432\u0438\u0434\u043d\u044b. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043c\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 BitSet \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0434\u0432\u0443\u0445 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0417\u0430\u0442\u0435\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u0437\u0430\u043d\u0443\u043b\u044f\u0435\u043c \u0445\u0432\u043e\u0441\u0442, \u0447\u0442\u043e\u0431\u044b GC \u0441\u043c\u043e\u0433 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. <\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 removeLast \u0431\u044b\u043b \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 BitSet \u0432 \u0446\u0438\u043a\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">for (int i=0, j=0; (i &lt; size) &amp;&amp; (j &lt; newSize); i++, j++) {     i = removeSet.nextClearBit(i);     elementData[j] = elementData[i]; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0438\u0442, \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u0447\u0438\u0442\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c, \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u0437\u0430\u043d\u0443\u043b\u044f\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. <\/p>\n<p>  <\/p>\n<p>\u0410 removeAll \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e newSize \u0440\u0430\u0432\u0435\u043d 0. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043d\u0443\u043b\u044f\u0435\u0442 \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">for (int k=newSize; k &lt; size; k++) {     elementData[k] = null; \/\/ Let gc do its work }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 Java 9? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u043e\u0431\u043e\u0439\u0442\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u043b\u044f subList.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">boolean removeIf(Predicate&lt;? super E&gt; filter, int i, final int end) {     Objects.requireNonNull(filter);     int expectedModCount = modCount;     final Object[] es = elementData;     \/\/ Optimize for initial run of survivors     for (; i &lt; end &amp;&amp; !filter.test(elementAt(es, i)); i++)         ;     \/\/ Tolerate predicates that reentrantly access the collection for     \/\/ read (but writers still get CME), so traverse once to find     \/\/ elements to delete, a second pass to physically expunge.     if (i &lt; end) {         \u2026     } else {         if (modCount != expectedModCount)             throw new ConcurrentModificationException();         return false;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 i \u043d\u0435\u0449\u0430\u0434\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0446\u0438\u043a\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u043e\u043f\u0440\u0435\u043a\u0438 \u0432\u0441\u0435\u043c \u043a\u0430\u043d\u043e\u043d\u0430\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043c\u044b \u043f\u0440\u043e\u043c\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 false. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0442, \u0442\u043e \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043c\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0435\u0441\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0448\u0435\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">if (i &lt; end) {     final int beg = i;     final long[] deathRow = nBits(end - beg); \/\/ new long[((n - 1) &gt;&gt; 6) + 1];     deathRow[0] = 1L; \/\/ set bit 0     for (i = beg + 1; i &lt; end; i++)         if (filter.test(elementAt(es, i)))             setBit(deathRow, i - beg); \/\/ bits[i &gt;&gt; 6] |= 1L &lt;&lt; i;     if (modCount != expectedModCount)         throw new ConcurrentModificationException();     modCount++;     int w = beg;     for (i = beg; i &lt; end; i++)         if (isClear(deathRow, i - beg)) \/\/ (bits[i &gt;&gt; 6] &amp; (1L &lt;&lt; i)) == 0;             es[w++] = es[i];     shiftTailOverGap(es, w, end);     return true; } else { \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0437\u0434\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u043d BitSet \u00ab\u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435\u00bb. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <em>nBits()<\/em>, <em>setBit()<\/em> \u0438 <em>isClear<\/em> \u043c\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 long \u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0435\u043c \u0431\u0438\u0442\u0430\u043c\u0438. \u0414\u0430, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043d\u0430 \u0441\u043f\u0438\u0447\u043a\u0430\u0445, \u043d\u043e \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u044d\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 BitSet \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u043d\u0435 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043f\u0438\u0441\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 removeLast \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0437\u0430\u043e\u0434\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0432 \u0436\u0438\u0437\u043d\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0443 \u043c\u0443\u0441\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0435 \u0432 \u0447\u0435\u043c \u043c\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b\u0438. \u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0439, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u0437\u043d\u0430\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0445\u0432\u043e\u0441\u0442 BitSet \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u043b\u0438 \u043f\u043e \u043d\u0435\u043c\u0443 \u0431\u0435\u0436\u0430\u0442\u044c. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0432 Java 9. \u0412 Java 9 \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0440\u043e\u0432\u043d\u043e\u0435 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0443\u0434\u0430\u043b\u044f\u0435\u043c. \u041c\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c, \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0418 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u044e \u0432 \u0434\u0440\u0443\u0433\u0438\u0445. <\/p>\n<p>  <\/p>\n<h2 id=\"hashsetremoveif\">hashSet.removeIf()<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0435 \u0438\u0437 ArrayList, \u0430 \u0438\u0437 HashSet. \u0421\u043f\u0435\u0440\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435. \u041f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 HashSet \u0441\u043f\u0438\u0441\u043a\u0438 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b: [], [0], [0, 1] \u0438 \u0442. \u0434.:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">HashSet&lt;List&lt;Integer&gt;&gt; set;  @Setup public void setup() {     set = IntStream.range(0, 1000)         .mapToObj(i -&gt; IntStream.range(0, i).boxed().collect(Collectors.toList()))         .collect(Collectors.toCollection(HashSet::new)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c HashSet \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public Set&lt;List&lt;Integer&gt;&gt; removeHalf() {     Set&lt;List&lt;Integer&gt;&gt; copy = new HashSet&lt;&gt;(set);     copy.removeIf(list -&gt; list.size() &gt; 500);     return copy; } @Benchmark public Set&lt;List&lt;Integer&gt;&gt; noRemove() {     return new HashSet&lt;&gt;(set); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442. \u041e\u0446\u0435\u043d\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Java 8:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/to\/rh\/0y\/torh0yb8cew7eiczgts7rsmsz68.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 + \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0441\u044f \u0432\u0434\u0432\u043e\u0435 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, \u0447\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gv\/rm\/s2\/gvrms2apwuvlofntto4ue9w9wwm.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 Java 9 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0438 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e 10 % \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u041a\u0430\u043a \u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c? \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u043d\u043e\u0432\u0430 \u0445\u0438\u0442\u0440\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <em>HashSet.removeIf()<\/em> \u0441\u0434\u0435\u043b\u0430\u043b\u0438? \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <em>Collection.removeIf()<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043a <em>HashSet.iterator().remove()<\/em>. <em>HashSet.iterator().remove()<\/em> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043b\u0435\u0435 \u043a <em>HashMap.keySet().iterator().remove()<\/em>. \u041a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0432 HashSet \u043b\u0435\u0436\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HashMap \u0441 default-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0433\u0434\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u043a\u0430\u043a set. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a <em>HashMap.KeyIterator.remove()<\/em>, \u043d\u043e \u0432 \u043d\u0435\u043c \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 <em>remove()<\/em>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e HashMap \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b: <em>keySet().iterator()<\/em>, <em>valueSet().iterator()<\/em>, <em>entrySet().iterator()<\/em>, \u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043e \u0432 \u043e\u0431\u0449\u0438\u0439 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9j\/ie\/ew\/9jieewvy6i59fo9eczete3btmx8.png\"><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0433\u0430\u0434\u043a\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 <em>HashIterator<\/em>. \u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435? \u0412 \u043d\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u043b\u0438 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0434\u043d\u0443:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l7\/-p\/x6\/l7-px6yctzs0fy7t7av-3frgwpk.png\"><\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 removeNode(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0445\u0435\u0448 \u043a\u043b\u044e\u0447\u0430. \u0414\u043e Java 9 \u0445\u0435\u0448 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u043e \u043a\u043b\u044e\u0447\u0443, \u0445\u043e\u0442\u044f \u0432 \u044d\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u0435\u0448 \u0443\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u043c \u0443\u0437\u043b\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044f \u0441\u0445\u0438\u0442\u0440\u0438\u043b \u0441 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u043c. \u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u0432\u043e\u0439 \u0445\u0435\u0448 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442 \u0437\u0430\u043d\u043e\u0432\u043e. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0445\u0435\u0448-\u043a\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0438\u043b\u0438 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0442\u0430\u043a \u0437\u0430\u043c\u0435\u0442\u043d\u0430, \u043d\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u043e\u0439. <\/p>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u043d\u043e\u0433\u043e \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u044d\u0444\u0444\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u044f\u043c\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0432 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u043e\u0442 <em>HashMap<\/em> \u0438\u043b\u0438 <em>LinkedHashMap<\/em>, \u0432\u044b \u043f\u0440\u043e\u0439\u0434\u0435\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434. <\/p>\n<p>  <\/p>\n<h2 id=\"hashmapcontainskey\">HashMap.containsKey<\/h2>\n<p>  <\/p>\n<p>\u0421\u0445\u043e\u0436\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 Java 15 \u0438 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u044b\u0445 Map. \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">HashMap&lt;List&lt;Integer&gt;, String&gt; emptyMap; HashMap&lt;List&lt;Integer&gt;, String&gt; nonEmptyMap; List&lt;Integer&gt; key;  @Setup public void setup() {     emptyMap = new HashMap&lt;&gt;();     nonEmptyMap = new HashMap&lt;&gt;();     nonEmptyMap.put(Collections.emptyList(), &quot;&quot;);     key = IntStream.range(0, 500).boxed().collect(Collectors.toList()); }  @Benchmark public boolean containsInEmpty() {     return emptyMap.containsKey(key); }  @Benchmark public boolean containsInNonEmpty() {     return nonEmptyMap.containsKey(key); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0432\u0430 HashMap. \u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043b\u043e\u0436\u0438\u043c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043b\u044e\u0447\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0445\u0435\u0448-\u043a\u043e\u0434\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 500 \u0447\u0438\u0441\u0435\u043b. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ku\/fw\/jp\/kufwjpqpnehkok5ptl8hyodmedq.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 Java 14 \u043c\u044b \u0442\u0440\u0430\u0442\u0438\u043c \u043e\u043a\u043e\u043b\u043e 500 \u043d\u0441 \u0438 \u0441 \u043f\u0443\u0441\u0442\u044b\u043c, \u0438 \u0441 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0430 \u0432 Java 15 \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u043a\u043e\u043b\u043e 3 \u043d\u0441. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0435. \u0412\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 HashMap \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <em>getNode()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u043a\u043b\u044e\u0447\u0443. \u0414\u043e Java 15 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u0445\u0435\u0448 \u0438 \u043a\u043b\u044e\u0447, \u0442\u043e \u0435\u0441\u0442\u044c \u0445\u0435\u0448 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0442\u043e\u0442, \u043a\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">final Node&lt;K,V&gt; getNode(int hash, Object key) {     Node&lt;K,V&gt;[] tab; Node&lt;K,V&gt; first, e; int n; K k;     if ((tab = table) != null &amp;&amp; (n = tab.length) &gt; 0 &amp;&amp;         (first = tab[(n - 1) &amp; hash]) != null) {         \u2026     }     return null; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0432 Java 15 \u0440\u0430\u0441\u0447\u0435\u0442 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u044c <em>getNode()<\/em>. \u042d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0410 \u0445\u0435\u0448-\u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">final Node&lt;K,V&gt; getNode(Object key) {     Node&lt;K,V&gt;[] tab; Node&lt;K,V&gt; first, e; int n, hash; K k;     if ((tab = table) != null &amp;&amp; (n = tab.length) &gt; 0 &amp;&amp;         (first = tab[(n - 1) &amp; (hash = hash(key))]) != null) {         \u2026     }     return null; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u0430, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <em>containsKey()<\/em>, \u043d\u043e \u0438 <em>get()<\/em> \u0438 <em>getOrDefault()<\/em>. \u041d\u043e \u0437\u0430 \u044d\u0442\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0446\u0435\u043d\u0443.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <em>computeIfPresent()<\/em> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0410 \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0430 null, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u0418 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0434\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043b\u044e\u0447 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a. \u0427\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043f\u0443\u0441\u0442\u043e\u0439 map \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <em>computeIfPresent()<\/em>. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/da\/na\/qd\/danaqdgm9lnssjbp86_wzmwtbig.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, <em>computeIfPresent()<\/em> \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c, \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0432 <em>getNode()<\/em>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u043d\u043e \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442 \u043a\u043e\u0434, \u0438 \u043d\u0430 \u044d\u0442\u0443 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u0441\u043a\u0440\u0435\u043f\u044f \u0441\u0435\u0440\u0434\u0446\u0435 \u043f\u043e\u0448\u043b\u0438. \u0412\u0441\u0435-\u0442\u0430\u043a\u0438 <em>computeIfPresent()<\/em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 null \u0435\u0449\u0435 \u0440\u0435\u0436\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"classgetsimplename\">Class.getSimpleName()<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e Reflection. \u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0438\u043c\u044f, \u0438 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0435. \u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438: <em>class.getName()<\/em>, <em>class.getCanonicalName()<\/em>, <em>class.getSimpleName()<\/em>. <em>Class.getName()<\/em> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u043c\u044f JVM-\u043a\u043b\u0430\u0441\u0441\u0430. <em>Class.getCanonicalName()<\/em> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u0433\u0434\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0442\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. <em>Class.getSimpleName()<\/em> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0435\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u044b\u0441\u0442\u0440\u0435\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kw\/cf\/dr\/kwcfdrttdtidmpb2djljrig3b5u.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 Java 8 <em>getName()<\/em> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0438 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043c\u044f \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041c\u0435\u0442\u043e\u0434\u044b <em>getCanonicalName()<\/em> \u0438 <em>getSimpleName()<\/em> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u0436\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u042f\u0432\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0430 \u043d\u0435 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043a\u0435\u0448\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 Java 11 \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0438 \u044f\u0432\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041e\u0434\u043d\u0430\u043a\u043e <em>getCanonicalName()<\/em> \u0438 <em>getSimpleName()<\/em> \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 1,3 \u043d\u0441 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c <em>getName()<\/em>. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0430\u0441\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public String getName() {     String name = this.name;     if (name == null)         this.name = name = getName0();     return name; }  \/\/ cache the name to reduce the number of calls into the VM private transient String name; private native String getName0();<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 <em>getName()<\/em> \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u0435. \u0414\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u043e\u043d\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0443\u0442 <em>getName()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public String getCanonicalName() {     if (isArray()) {         String canonicalName = getComponentType().getCanonicalName();         if (canonicalName != null)             return canonicalName + &quot;[]&quot;;         else             return null;     }     if (isLocalOrAnonymousClass())         return null;     Class&lt;?&gt; enclosingClass = getEnclosingClass();     if (enclosingClass == null) { \/\/ top level class         return getName();     } else {         String enclosingName = enclosingClass.getCanonicalName();         if (enclosingName == null)             return null;         return enclosingName + &quot;.&quot; + getSimpleName();     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <em>getCanonicalName()<\/em> \u0432 Java 10, \u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0442, \u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u044f \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <em>getSimpleName()<\/em> \u0432\u0441\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0417\u0434\u0435\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u044b \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0432 \u043a\u043b\u0430\u0441\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Java 8 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 Java. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0443\u0436\u0438\u043c\u0430\u043b\u0438 java.lang.Class, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u043a\u0443\u0448\u0430\u043b\u00bb \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e Java 8 \u043d\u0430 32-\u0431\u0438\u0442\u043d\u043e\u0439 JVM \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u044a\u0435\u0434\u0430\u043b 112 \u0431\u0430\u0439\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c SoftReference \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 reflection. \u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 reflection, \u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0443\u0441\u0442\u044b\u043c\u0438. \u0410 \u0432 Java 8 \u0440\u0435\u0448\u0438\u043b\u0438 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 ReflectionData \u0438 \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d SoftReference. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043d\u0430 32-\u0431\u0438\u0442\u043d\u043e\u0439 JVM 32 \u0431\u0430\u0439\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Reflection \u0432\u043e\u043e\u0431\u0449\u0435, \u0438 224 \u0431\u0430\u0439\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 8 \u043a\u0435\u0448\u0435\u0439 Reflection.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044f \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u0412\u0441\u0435-\u0442\u0430\u043a\u0438 <em>getSimpleName()<\/em> \u0438 <em>getCanonicalName()<\/em> \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0443 \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 ReflectionData. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 ReflectionData \u0434\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">\/\/ reflection data that might get invalidated \/\/ when JVM TI RedefineClasses() is called private static class ReflectionData&lt;T&gt; {     volatile Field[] declaredFields;     volatile Field[] publicFields;     volatile Method[] declaredMethods;     volatile Method[] publicMethods;     volatile Constructor&lt;T&gt;[] declaredConstructors;     volatile Constructor&lt;T&gt;[] publicConstructors;     \/\/ Intermediate results for getFields and getMethods     volatile Field[] declaredPublicFields;     volatile Method[] declaredPublicMethods;     volatile Class&lt;?&gt;[] interfaces;      \/\/ Value of classRedefinedCount when we created this ReflectionData instance     final int redefinedCount;      ReflectionData(int redefinedCount) {         this.redefinedCount = redefinedCount;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u044d\u0448\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445. \u0422\u043e\u043d\u043a\u043e\u0441\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d JVMTI-\u0430\u0433\u0435\u043d\u0442\u043e\u043c, \u0438 \u0442\u043e\u0433\u0434\u0430 ReflectionData \u0443\u0441\u0442\u0430\u0440\u0435\u0435\u0442, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ReflectionData.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private transient volatile SoftReference&lt;ReflectionData&lt;T&gt;&gt; reflectionData;  \/\/ Incremented by the VM on each call to JVM TI RedefineClasses() \/\/ that redefines this class or a superclass. private transient volatile int classRedefinedCount;  \/\/ Lazily create and cache ReflectionData private ReflectionData&lt;T&gt; reflectionData() {     SoftReference&lt;ReflectionData&lt;T&gt;&gt; reflectionData = this.reflectionData;     int classRedefinedCount = this.classRedefinedCount;     ReflectionData&lt;T&gt; rd;     if (reflectionData != null &amp;&amp;         (rd = reflectionData.get()) != null &amp;&amp;         rd.redefinedCount == classRedefinedCount) {         return rd;     }     \/\/ else no SoftReference or cleared SoftReference or stale ReflectionData     \/\/ -&gt; create and replace new instance     return newReflectionData(reflectionData, classRedefinedCount); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u043d\u043e \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 SoftReference, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043d\u0435\u0445\u0432\u0430\u0442\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434 \u043d\u043e\u0436. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043f\u043e\u043b\u0435 <em>redefinedCount<\/em>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0430\u043c\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u0438\u043f\u0430 int, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. <\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c ReflectionData \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 GC \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u043e \u0438 \u0435\u0441\u043b\u0438 <em>classRedefinedCount<\/em> \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private ReflectionData&lt;T&gt; newReflectionData(                               SoftReference&lt;ReflectionData&lt;T&gt;&gt; oldReflectionData,                                             int classRedefinedCount) {     while (true) {         ReflectionData&lt;T&gt; rd = new ReflectionData&lt;&gt;(classRedefinedCount);         \/\/ try to CAS it...         if (Atomic.casReflectionData(                         this, oldReflectionData, new SoftReference&lt;&gt;(rd))) {             return rd;         }         \/\/ else retry         oldReflectionData = this.reflectionData;         classRedefinedCount = this.classRedefinedCount;         if (oldReflectionData != null &amp;&amp;             (rd = oldReflectionData.get()) != null &amp;&amp;             rd.redefinedCount == classRedefinedCount) {             return rd;         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 CAS-\u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0430 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0430\u0433\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441.<\/p>\n<p>  <\/p>\n<p>\u0418 \u0432 Java 11 \u0432 ReflectionData \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private static class ReflectionData&lt;T&gt; {     volatile Field[] declaredFields;     \u2026     volatile Class&lt;?&gt;[] interfaces;  +   \/\/ Cached names +   String simpleName; +   String canonicalName; +   static final String NULL_SENTINEL = new String();      \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441), \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e, \u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e (\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0441 \u0445\u0435\u0448-\u043a\u043e\u0434\u043e\u043c \u0441\u0442\u0440\u043e\u043a). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public String getCanonicalName() {     ReflectionData&lt;T&gt; rd = reflectionData();     String canonicalName = rd.canonicalName;     if (canonicalName == null) {         rd.canonicalName = canonicalName = getCanonicalName0();     }     return canonicalName == ReflectionData.NULL_SENTINEL ?                             null : canonicalName; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 Java 11 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <em>getCanonicalName()<\/em> \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u0432 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <em>getSimpleName()<\/em>. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 ReflectionData, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b, \u0433\u0434\u0435 \u0438 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f 1,3 \u043d\u0441.<\/p>\n<p>  <\/p>\n<h2 id=\"classgetconstructor\">Class.getConstructor<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 getConstructor(). \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public static class X {   public X() {} }  public static class X1 {   public X1() {}   public X1(int p1) {}   public X1(int p1, int p2) {}   public X1(int p1, int p2, int p3) {}   public X1(int p1, int p2, int p3, int p4) {}   public X1(int p1, int p2, int p3, int p4, int p5) {} }  public static class X2 {   public X2() {}   public X2(int p1) {}   public X2(int p1, int p2) {}   public X2(int p1, int p2, int p3) {}   public X2(int p1, int p2, int p3, int p4) {}   public X2(int p1, int p2, int p3, int p4, int p5) {}   public X2(int p1, int p2, int p3, int p4, int p5, int p6) {}   public X2(int p1, int p2, int p3, int p4, int p5, int p6, int p7) {}   public X2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {}   public X2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9) {}   public X2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10) {} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Benchmark public Constructor&lt;?&gt; getConstructorX() throws NoSuchMethodException {   return X.class.getConstructor(); }  @Benchmark public Constructor&lt;?&gt; getConstructorX1() throws NoSuchMethodException {   return X1.class.getConstructor(); }  @Benchmark public Constructor&lt;?&gt; getConstructorX2() throws NoSuchMethodException {   return X2.class.getConstructor(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 Java 8, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ql\/bc\/3a\/qlbc3ayopjw-b5g0mu9z8csjcty.png\"><\/p>\n<p>  <\/p>\n<p>90 \u043d\u0441 \u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c, \u0438 \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 JDK \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u043e\u0434 \u0432 Java 9:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jk\/6u\/zh\/jk6uzhagalxybgrln7vgfsb9wdc.png\"><\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0438 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u0441 \u043a\u0443\u0447\u0435\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u0430\u044f. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kl\/s2\/a7\/kls2a7twmt1wf6csoqrk9zgjhxu.png\"><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u0443\u0435\u0442 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b. \u0412 Java 8 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0435\u043b\u0430 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432, \u0430 \u0432 Java 9 \u0441\u0442\u0430\u043b\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442. \u0427\u0442\u043e \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c?<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 <em>getConstructor()<\/em> \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043a \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 <em>getConstructor()<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 Java 8 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private Constructor&lt;T&gt; getConstructor0(Class&lt;?&gt;[] parameterTypes, int which) throws NoSuchMethodException {     Constructor&lt;T&gt;[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));     for (Constructor&lt;T&gt; constructor : constructors) {         if (arrayContentsEq(parameterTypes, constructor.getParameterTypes())) {             return getReflectionFactory().copyConstructor(constructor);         }     }     throw new NoSuchMethodException(getName() + &quot;.&lt;init&gt;&quot; + argumentTypesToString(parameterTypes)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432. \u041e\u043d\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 ReflectionData \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <em>privateGetDeclaredConstructors()<\/em>. \u0417\u0430\u0442\u0435\u043c \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0435 \u0432\u0438\u0434\u0430 find-first \u0438\u0449\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u0442\u0438\u043f\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f reflection \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0432 \u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u0430\u043a \u043e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445, \u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u044f \u043c\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u043c, \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u0438 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <em>getParameterTypes()<\/em>: \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435. \u042d\u0442\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0435\u0441\u044c Reflection API \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0430 \u043d\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c). <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Constructor \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u044f\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0435\u0433\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public final class Constructor&lt;T&gt; extends Executable {     \u2026      @Override     public Class&lt;?&gt;[] getParameterTypes() {         return parameterTypes.clone();     }       \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0442, \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u041d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. Class \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 java.lang, \u0430 Constructor \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 java.lang.reflect, \u0438 \u043f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c. \u042d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u0430\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0432\u044b\u0440\u044b\u0442\u044b \u00ab\u043a\u0440\u043e\u0442\u043e\u0432\u044b\u0435 \u043d\u043e\u0440\u044b\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 Java 9 \u0441 <em>getConstructor0()<\/em>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">private Constructor&lt;T&gt; getConstructor0(Class&lt;?&gt;[] parameterTypes, int which) throws NoSuchMethodException {     ReflectionFactory fact = getReflectionFactory();     Constructor&lt;T&gt;[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));     for (Constructor&lt;T&gt; constructor : constructors) {         if (arrayContentsEq(parameterTypes, fact.getExecutableSharedParameterTypes(constructor))) {             return constructor;         }     }     throw new NoSuchMethodException(methodToString(&quot;&lt;init&gt;&quot;, parameterTypes)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0441\u044f \u0432 \u00ab\u043a\u0440\u043e\u0442\u043e\u0432\u0443\u044e \u043d\u043e\u0440\u0443\u00bb \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 ReflectionFactory:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package jdk.internal.reflect;  public class ReflectionFactory {     \u2026     private final JavaLangReflectAccess langReflectAccess;     private ReflectionFactory() {         this.langReflectAccess = SharedSecrets.getJavaLangReflectAccess();     }      \u2026      public Class&lt;?&gt;[] getExecutableSharedParameterTypes(Executable ex) {         return langReflectAccess.getExecutableSharedParameterTypes(ex);     }     \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u0432 \u043d\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u00ab\u0434\u044b\u0440\u043a\u0443\u00bb. \u00ab\u0414\u044b\u0440\u043a\u0430\u00bb \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441 JavaLangReflect, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c java.base. \u041f\u0430\u043a\u0435\u0442\u044b jdk.internal \u043d\u0435 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043c\u0435\u0440\u0442\u043d\u044b\u043c \u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f \u0432 \u043d\u0438\u0445 \u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e. <\/p>\n<p>  <\/p>\n<p>SharedSecrets, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 jdk.internal.access \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043a\u043e\u0432\u044b\u0440\u0438\u0432\u0430\u0442\u044c \u00ab\u0434\u044b\u0440\u043a\u0438\u00bb \u0432 JDK, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f JavaLangReflect:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package jdk.internal.access;  public class SharedSecrets {     private static JavaLangReflectAccess javaLangReflectAccess;      public static void setJavaLangReflectAccess(JavaLangReflectAccess jlra) {         javaLangReflectAccess = jlra;     }      public static JavaLangReflectAccess getJavaLangReflectAccess() {         return javaLangReflectAccess;     }       \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>JavaLangReflectAccess \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u043d\u0435\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package jdk.internal.access;  \/** An interface which gives privileged packages Java-level access to internals of java.lang.reflect. *\/  public interface JavaLangReflectAccess {     \/** Gets the shared array of parameter types of an Executable. *\/ public Class&lt;?&gt;[] getExecutableSharedParameterTypes(Executable ex);      \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0441\u0435\u0442\u0442\u0435\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 AccessibleObject:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package java.lang.reflect;  public class AccessibleObject implements AnnotatedElement {     static {         \/\/ AccessibleObject is initialized early in initPhase1         SharedSecrets.setJavaLangReflectAccess(new ReflectAccess());     }     \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 AccessibleObject \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u043d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 JVM, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0435\u0442\u0442\u0435\u0440 \u0443\u0436\u0435 \u0432\u044b\u0437\u0432\u0430\u043d.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 java.lang.reflect, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package java.lang.reflect;  \/** Package-private class implementing the     jdk.internal.access.JavaLangReflectAccess interface, allowing the java.lang     package to instantiate objects in this package. *\/  class ReflectAccess implements jdk.internal.access.JavaLangReflectAccess {     \u2026      public Class&lt;?&gt;[] getExecutableSharedParameterTypes(Executable ex) {         return ex.getSharedParameterTypes();     }      \u2026 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043a\u0443\u0447\u043d\u043e:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pn\/4n\/vi\/pn4nvi0rn4rc5btqrgt6676qayi.png\"><\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u043e\u043a\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/j9\/z9\/1s\/j9z91sz2k8idk5_dihrjeob8rla.png\"><\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0440\u0430\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432. \u041a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u043a\u0430 \u0432 Java \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"itogo\">\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 9 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 Java 9-16, \u0438\u0437\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 JDK, \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0418 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u0437\u0430\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0441 Java 8 \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b. \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<p>  <\/p>\n<blockquote><p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u2014 \u043c\u0438\u043d\u0443\u0442\u043a\u0430 \u0440\u0435\u043a\u043b\u0430\u043c\u044b. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, Joker 2020 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u0442, \u0445\u043e\u0442\u044c \u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d-\u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043c\u0438\u0440\u0430. Joker 2020 \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0441 25 \u043f\u043e 28 \u043d\u043e\u044f\u0431\u0440\u044f, \u043f\u043e\u043a\u0443\u043f\u043a\u0430 \u0431\u0438\u043b\u0435\u0442\u043e\u0432 \u0443\u0436\u0435 <a href=\"https:\/\/jokerconf.com\/registration\/?utm_source=habr&amp;utm_medium=521240\">\u043e\u0442\u043a\u0440\u044b\u0442\u0430<\/a>.<\/p><\/blockquote>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/521240\/\"> https:\/\/habr.com\/ru\/company\/jugru\/blog\/521240\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/521240\/\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Java, \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u044e\u0442. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0439\u00bb: \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c, \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u044f \u043d\u0430\u0448 \u043a\u043e\u0434 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044f \u0432\u0437\u0430\u043c\u0435\u043d, \u0430 \u043c\u044b \u0434\u0430\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043e \u043d\u0438\u0445 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c!<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 <strong>\u0422\u0430\u0433\u0438\u0440 \u0412\u0430\u043b\u0435\u0435\u0432<\/strong> (<a href=\"https:\/\/habr.com\/ru\/users\/lany\/\" class=\"user_link\">lany<\/a>), \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043e \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043d \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u043d\u0430 Joker 2019 \u0441 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c \u00abJava 9-14: \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438\u00bb, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=5Y0Alqb9H_I\">\u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c<\/a>. \u0417\u0430\u0442\u0435\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c, \u043d\u0430 JPoint 2020 \u043e\u043d <a href=\"https:\/\/www.youtube.com\/watch?v=NXh98XRi2is\">\u0440\u0430\u0437\u0432\u0438\u043b \u0442\u0435\u043c\u0443<\/a>. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043f\u043e\u0441\u0442 \u0434\u043b\u044f \u0425\u0430\u0431\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u043e \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_h\/fc\/ry\/_hfcryb_u6klly9azo79yrlyuis.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0442 \u043b\u0438\u0446\u0430 \u0441\u043f\u0438\u043a\u0435\u0440\u0430. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-310734","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/310734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=310734"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/310734\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=310734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=310734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=310734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}