Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

String daxildən

String-in içində nə var?

Java 9-dan bəri String içində char[] yox, byte[] saxlayır. coder byte-ların necə oxunacağını deyir.

final array immutable olmasını özü təmin etmir: value private-dır və heç bir method onu dəyişmir. Hər “dəyişiklik” yeni String yaradır.

hash ilk hashCode()-da hesablanır və saxlanır, ona görə String yaxşı HashMap key-idir.

LATIN1 yoxsa UTF16?

Bütün character-lər 255-dən kiçikdirsə, hər biri 1 byte tutur: Compact Strings. Bir dənə böyük character bütün String-i 2 byte-a keçirir.

Azərbaycan dilində bu çox görünür: ç, ö, ü LATIN1-dədir, ə, ş, ğ, ı isə yox.

"çörek" 5 byte, "çörək" isə 10 byte tutur. Fərq bir hərfdir.

length() simvol saymır

length() char sayır, char isə 16 bit-dir. Emoji-lər 16 bit-ə sığmır və iki char tutur: surrogate pair.

İstifadəçinin gördüyü simvolları saymaq üçün codePointCount işlət. Bayraq və ailə emoji-ləri kimi birləşmələr isə bir neçə code point-dən ibarətdir.

Array nə vaxt paylaşılır?

new String(a) yeni object yaradır, amma value array-ini kopyalamır: immutable olduğu üçün paylaşmaq təhlükəsizdir.

substring isə həmişə yeni array yaradır. Bu, Java 7u6-dan belədir: kiçik substring böyük array-i memory-də saxlamasın deyə.

Maraqlı hal: UTF16 String-in LATIN1 hissəsini kəssən, nəticə sıxılır.

Dövrədə += niyə yavaşdır?

String immutable olduğu üçün hər += bütün mətni yeni array-ə kopyalayır. Uzunluq artdıqca kopya da böyüyür: O(n²).

StringBuilder bir buffer saxlayır və yalnız dolanda böyüyür. Dövrədə həmişə onu işlət.

Dövrədən kənar a + b + c isə problem deyil: javac onu bir invokedynamic çağırışına çevirir.