ProgramlamaAndroid geliştirici

Kotlin'deki koleksiyonların çalışma mekanizmasını açıklayın: List, MutableList, Set, MutableSet, Map, MutableMap arasındaki farklar. Kullanımında hangi zorluklar ortaya çıkabilir? Kod örnekleri verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Kotlin, iki tür koleksiyon sunar: değişmez (immutable) ve değiştirilebilir (mutable).

  • List — değişmez liste. Eleman ekleyemez veya çıkaramazsınız.
  • MutableList — değiştirilebilir liste: eleman ekleyebilir ve çıkarabilirsiniz.
  • Set — değişmez küme (eşsiz elemanlar).
  • MutableSet — değiştirilebilir küme.
  • Map — anahtar-değer eşleşmesi, değişmez.
  • MutableMap — değiştirilebilir anahtar-değer eşleşmesi.

Kod örneği:

val fruits: List<String> = listOf("Apple", "Banana", "Cherry") val mutableFruits: MutableList<String> = mutableListOf("Apple", "Banana") mutableFruits.add("Cherry") val fruitSet: Set<String> = setOf("Apple", "Banana") // Elemanların eşsizlik durumu val mutableFruitSet: MutableSet<String> = mutableSetOf("Apple", "Banana") mutableFruitSet.add("Cherry") val scores: Map<String, Int> = mapOf("Tom" to 80, "Jane" to 90) val mutableScores: MutableMap<String, Int> = mutableMapOf("Tom" to 80) mutableScores["Jane"] = 90

İnce noktalar:

  • Koleksiyonlar varsayılan olarak — değişmezdir.
  • Standart kütüphaneden dönen birçok liste fonksiyonu List (değiştirilebilir liste değil) döner.
  • Koleksiyonlarla çalışırken, değişiklik yapılması beklenmeyenleri değiştirmemeye dikkat etmek önemlidir.

Kandırmaca sorusu.

Eğer bir fonksiyon, List<T> parametresi alıyorsa, bu listeyi fonksiyon içinde herhangi bir şekilde değiştirebilir misiniz?

Cevap: Hayır, eğer parametre tipi List<T> ise, fonksiyon içinde eleman ekleyemez veya çıkaramazsınız. Ancak pratikte MutableList<T> geçtiyse, bu tür dönüştürme yapabiliriz (bu bir risk taşır):

fun modifyList(list: List<String>) { if (list is MutableList) { list.add("Another") // Eğer orijinal koleksiyon değiştirilebilen ise çalışır } }

Bunun yapılması önerilmez, çünkü sözleşmeyi ihlal eder (List değişmez olmalıdır!).

Konunun incelikleri nedeniyle gerçek hatalar örnekleri.


Hikaye

Büyük bir projede, List<Customer> alan bir fonksiyon kullandık ve bu listeye yeni bir eleman eklemeye çalıştık. Derleme hatası (add/clear/remove List için tanımlı değil) yalnızca gözden geçirme sırasında görüldü, çünkü verileri dönüştürmek için gerçekten değiştirilebilir bir liste gerekiyordu.


Hikaye

Koleksiyon MutableList olarak ilan edildi, ama senkronizasyon olmadan birkaç iş parçacığına geçirildi. Sonuç olarak, rekabet eden değişiklikler oldu ve "ConcurrentModificationException" ile listenin durumu bozuldu. Hata uzun süre arandı, thread-safety dikkate alınmadı.


Hikaye

Veritabanı sorgu sonuçlarıyla çalışmak için bir serviste mutableListOf kullandık ve sonra dışarıya referans verdik. Dış kod yanlışlıkla listeyi temizledi. Sonuç olarak kullanıcıya boş veriler geliyordu, çünkü referanslar kopyalanmadı ve değiştirilebilir koleksiyonlar iş mantığı katmanının dışında değiştirildi.