ArrayListilə elementləri əlavə etmək, silmək, dəyişmək və sıralamaq- Açar–qiymət cütlərini
HashMap-də, təkrarsız qiymətləri isəHashSet-də saxlamaq List<String>kimi generik tipləri oxumaq və sadə generik sinif yazmaq
Massivin uzunluğu sabitdir: 5 yerlik massivə 6-cı elementi əlavə etmək olmur. Amma alış-veriş səbəti, çat mesajları, oyunçuların siyahısı daim böyüyür və kiçilir. Bunun üçün Java-da hazır kolleksiyalar var — java.util paketində yerləşən çevik verilənlər strukturları.
ArrayList: böyüyən siyahı
ArrayList massiv kimi indekslərlə işləyir, amma elementlər əlavə olunduqca özü böyüyür. Bucaq mötərizələrindəki <String> siyahıda hansı tipli elementlərin saxlanacağını göstərir. Dəyişəni adətən ümumi List interfeysi tipində elan edirlər, sağ tərəfdə isə tipi təkrarlamamaq üçün boş <> («almaz») yazılır.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> cities = new ArrayList<>();
cities.add("Baku");
cities.add("Ganja");
cities.add("Lankaran");
cities.add(1, "Shaki");
System.out.println(cities + " size=" + cities.size());
System.out.println(cities.get(0) + ", " + cities.contains("Ganja"));
cities.remove("Lankaran");
cities.set(0, "Sumgait");
Collections.sort(cities);
System.out.println(cities);
for (String c : cities) {
System.out.print(c.toUpperCase() + " ");
}
System.out.println();
}
}[Baku, Shaki, Ganja, Lankaran] size=4 Baku, true [Ganja, Shaki, Sumgait] GANJA SHAKI SUMGAIT
| Metod | Nə edir |
|---|---|
add(x), add(i, x) | sona və ya i mövqeyinə əlavə edir |
get(i), set(i, x) | i indeksli elementi oxuyur və ya əvəz edir |
remove(i), remove(x) | indeksə və ya qiymətə görə silir |
size(), isEmpty() | elementlərin sayı, siyahı boşdurmu |
contains(x), indexOf(x) | element varmı, harada yerləşir |
list.contains(x) elementləri bir-bir yoxlayır — məhz bu xətti axtarış kimi. Siyahı böyüdükcə axtarış da uzanır. Tez-tez «bu element varmı?» sualını verirsənsə, aşağıdakı HashSet xeyli sürətlidir.HashMap: açar və qiymət
Xəritə (Map) hər açarı bir qiymətlə əlaqələndirir — lüğət kimi: söz → izah, ölkə → paytaxt. Açarlar təkrarlanmır: eyni açarla yenidən put etsən, köhnə qiymət əvəz olunur. get açar tapılmasa null qaytarır, getOrDefault isə sənin verdiyin ehtiyat qiyməti.
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Map<String, String> capitals = new HashMap<>();
capitals.put("Azerbaijan", "Baku");
capitals.put("Turkiye", "Ankara");
capitals.put("Georgia", "Tbilisi");
System.out.println(capitals.get("Turkiye"));
System.out.println(capitals.get("France"));
System.out.println(capitals.getOrDefault("France", "unknown"));
System.out.println(capitals.containsKey("Georgia") + " " + capitals.size());
String text = "to be or not to be";
Map<String, Integer> counts = new TreeMap<>();
for (String word : text.split(" ")) {
counts.put(word, counts.getOrDefault(word, 0) + 1);
}
System.out.println(counts);
for (Map.Entry<String, Integer> e : counts.entrySet()) {
System.out.println(e.getKey() + " -> " + e.getValue());
}
}
}Ankara
null
unknown
true 3
{be=2, not=1, or=1, to=2}
be -> 2
not -> 1
or -> 1
to -> 2İkinci hissədə sözlərin sayını hesablayırıq: split(" ") mətni sözlərə bölür, hər söz üçün sayğac 1 artır. Burada TreeMap istifadə olunub — o da Map-dir, amma açarları əlifba sırası ilə saxlayır. HashMap isə elementləri sırasız saxlayır: o, daha sürətlidir, amma çap sırası əvvəlcədən məlum deyil. entrySet() isə bütün açar–qiymət cütlərini dövrlə gəzməyə imkan verir.
HashSet: təkrarsız elementlər
Çoxluq (Set) hər elementi yalnız bir dəfə saxlayır. add element əlavə olunanda true, artıq varsa false qaytarır. HashSet-də contains siyahıdakından qat-qat sürətlidir, çünki elementləri bir-bir yoxlamır, heş-kod vasitəsilə birbaşa lazımi yerə baxır.
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
List<String> visitors = List.of("Leyla", "Murad", "Leyla", "Aysel", "Murad");
Set<String> unique = new HashSet<>(visitors);
System.out.println(visitors.size() + " visits, " + unique.size() + " people");
System.out.println(unique.add("Elvin") + " " + unique.add("Leyla"));
System.out.println(unique.contains("Aysel"));
System.out.println(new TreeSet<>(unique));
}
}5 visits, 3 people true false true [Aysel, Elvin, Leyla, Murad]
Generiklər
List<String>, Map<String, Integer> — bu, generik (ümumiləşdirilmiş) tiplərdir. Onlar sayəsində kompilyator siyahıya səhv tipli element qoymağa imkan vermir və elementi götürəndə tipi çevirməyə ehtiyac qalmır. Kolleksiyalar yalnız obyektləri saxlayır, ona görə primitivlər əvəzinə örtük sinifləri yazılır: Integer, Double, Boolean, Character. Java int ↔ Integer çevirməsini avtomatik edir (autoboxing).
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> T last(List<T> list) {
return list.get(list.size() - 1);
}
public static void main(String[] args) {
Pair<String, Integer> p = new Pair<>("Aysel", 95);
System.out.println(p.first() + " scored " + p.second());
List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
int total = 0;
for (int n : nums) {
total += n;
}
System.out.println(total + " " + last(nums) + " " + last(List.of("a", "b")));
nums.remove(1);
System.out.println(nums);
nums.remove(Integer.valueOf(10));
System.out.println(nums);
}
}
class Pair<A, B> {
private final A first;
private final B second;
Pair(A first, B second) {
this.first = first;
this.second = second;
}
A first() { return first; }
B second() { return second; }
}Aysel scored 95 60 30 b [10, 30] [30]
class Pair<A, B>— generik sinif:AvəBtip parametrləridir, obyekt yaradılanda konkret tiplərlə əvəz olunur.static <T> T last(List<T> list)— generik metod: eyni kod həmInteger, həm dəStringsiyahısı üçün işləyir.List.of(...)bir sətirdə dəyişməz siyahı yaradır; onu dəyişmək lazımdırsa,new ArrayList<>(List.of(...))yaz.
Əsas fikirlər
ArrayListölçüsü dəyişən siyahıdır:add,get,set,remove,size.HashMapaçarı qiymətlə əlaqələndirir; açarlar təkrarlanmır,gettapmasanullqaytarır.HashSetyalnız təkrarsız elementləri saxlayır vəcontainsyoxlamasını çox sürətli edir.HashMapvəHashSetsıranı saxlamır; sıralı variantlarTreeMapvəTreeSet-dir.- Generiklər (
List<String>) tip təhlükəsizliyi verir; primitivlər əvəzinəInteger,Doublekimi örtük sinifləri yazılır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
ArrayList kimi kolleksiya massivdən nə ilə fərqlənir?