Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

String içeriden

String'in içinde ne var?

Java 9'dan beri String içinde char[] değil, byte[] tutar. coder, byte'ların nasıl okunacağını söyler.

final array immutable olmayı tek başına sağlamaz: value private'tır ve hiçbir method onu değiştirmez. Her “değişiklik” yeni String oluşturur.

hash ilk hashCode() çağrısında hesaplanır ve saklanır, bu yüzden String iyi bir HashMap key'idir.

LATIN1 mi UTF16 mı?

Tüm character'ler 255'ten küçükse her biri 1 byte tutar: Compact Strings. Tek bir büyük character tüm String'i 2 byte'a geçirir.

Azerbaycan ve Türk harflerinde bu sık görülür: ç, ö, ü LATIN1'dedir, ə, ş, ğ, ı ise değildir.

"çörek" 5 byte, "çörək" ise 10 byte tutar. Fark tek harftir.

length() simge saymaz

length() char sayar, char ise 16 bit'tir. Emoji'ler 16 bit'e sığmaz ve iki char tutar: surrogate pair.

Kullanıcının gördüğü simgeleri saymak için codePointCount kullan. Bayrak ve aile emoji'leri gibi birleşimler ise birkaç code point'ten oluşur.

Array ne zaman paylaşılır?

new String(a) yeni object oluşturur, ama value array'ini kopyalamaz: immutable olduğu için paylaşmak güvenlidir.

substring ise her zaman yeni array oluşturur. Java 7u6'dan beri böyledir: küçük substring büyük array'i memory'de tutmasın diye.

İlginç durum: UTF16 String'in LATIN1 kısmını kesersen sonuç sıkıştırılır.

Döngüde += neden yavaş?

String immutable olduğu için her += tüm metni yeni array'e kopyalar. Uzunluk arttıkça kopya da büyür: O(n²).

StringBuilder bir buffer tutar ve yalnızca dolunca büyür. Döngüde her zaman onu kullan.

Döngü dışında a + b + c sorun değildir: javac onu tek bir invokedynamic çağrısına çevirir.