1. StringTokenizer
Sinifi
Və sətirlərlə işləməyin ən çox istifadə olunan bir neçə ssenarisi. Sətiri bir neçə hissəyə necə bölmək olar? Bunun üçün bir neçə üsul var.
split()
Metodu
Sətiri bir neçə hissəyə bölməyin ilk üsulu — split()
metodundan istifadə etməkdir. Bu metoda parametr olaraq müntəzəm ifadə: xüsusi ayırıcı sətir şablonu ötürmək lazımdır. Müntəzəm ifadə nədir, bunu Java Multithreading macərasında öyrənəcəksiniz.
Nümunə:
Kod | Nəticə |
---|---|
|
Nəticə üç sətirdən ibarət bir massiv olacaq: |
Sadədir, amma bəzən bu yanaşma artıq dərəcədə böyük olur. Əgər çoxlu ayırıcılar varsa, məsələn, "mobil", "enter", "tab", "nöqtə", kifayət qədər mürəkkəb müntəzəm ifadə yaratmaq lazım gəlir. Bu ifadəni oxumaq və dəyişiklik etmək çətinləşir.
StringTokenizer
Sinifi
Java-da xüsusi bir sinif var ki, onun işi yalnız bir sətiri alt-sətirlərə bölməkdən ibarətdir.
Bu sinif müntəzəm ifadələrdən istifadə etmir: bunun yerinə simvolların toplusundan ibarət bir sətir ötürülür. Bu yanaşmanın üstünlüyü ondadır ki, bütün sətiri dərhal parçalara bölmür, tədricən əvvəldən sona doğru hərəkət edir.
Sinif konstruktor və iki əsas metoddur. Konstruktora parçalayacağımız sətiri və ayırıcı kimi istifadə olunacaq simvolların toplandığı sətiri ötürmək lazımdır.
Metodlar | Təsvir |
---|---|
|
Növbəti alt-sətiri qaytarır |
|
Hələ daha alt-sətir olub olmadığını yoxlayır. |
Bu sinif Scanner
sinfini xatırladır, onda da nextLine()
və hasNextLine()
metodları var idi.
StringTokenizer
obyektini belə yaratmaq olar:
StringTokenizer ad = new StringTokenizer(sətir, ayırıcılar);
Burada sətir — sətir
, parçalayacağımız sətir. ayırıcılar
— hər simvolu ayırıcı simvol olaraq qəbul edilən sətir. Nümunə:
Kod | Ekrana çıxarılması |
---|---|
|
|
Diqqət yetirin ki, StringTokenizer
konstruktoruna ötürülən ikinci sətirdəki hər simvol ayırıcı kimi qəbul edilir.
2. String.format()
metodu və StringFormatter
sinfi
String sinfinin daha bir maraqlı metodu — format()
.
Tutaq ki, sənin müxtəlif məlumat dəyişənlərin var. Onları bir sətr kimi necə ekrana çıxarmaq olar? Məsələn, bizdə məlumatlar (sol sütun) və istənilən çıxış (sağ sütun) var:
Kod | Ekran çıxışı |
---|---|
|
|
Çox güman ki, kod belə görünəcək:
Proqram Kodu |
---|
|
Bu kod o qədər də oxunaqlı deyil. Üstəlik, dəyişənlərin adları daha uzun olsaydı, kod daha da mürəkkəbləşəcəkdi:
Proqram Kodu |
---|
|
Çox oxunaqlı deyil, elə deyilmi?
Amma real proqramlarda belə vəziyyətlər tez-tez baş verir, ona görə də bu kodu daha sadə və qısa yazmağın bir yolunu danışmaq istəyirəm.
String.format
String sinfində statik format()
metodu var: bu metod, mətnlərin məlumatlarla birləşdirilməsi şablonunu təyin etməyə imkan verir. Bu komandanın ümumi görünüşü belədir:
String ad = String.format(şablon, parametrlər);
Nümunə:
Kod | Nəticə |
---|---|
|
|
|
|
|
|
format()
metodunda birinci parametr olaraq şablon sətri verilir, hansı ki, bütün lazım olan mətnləri ehtiva edir, lakin məlumatın lazım olduğu yerlərdə xüsusi simvollar yazılıb: %d
, %s
və s.
Metod format()
parametrdən sonra gələn şablon simvollarını %s
və %d
ilə əvəz edir. Sətir əlavə etmək üçün %s
, rəqəmlər üçün isə %d
yazırıq. Nümunə:
Kod | Nəticə |
---|---|
|
s bərabər olacaq "a=1, b=4, c=3" |
Bax bu parametrlər şablonda istifadə edilə bilər:
Simvol | Açıqlama |
---|---|
|
String |
|
Tam rəqəmlər: byte , short , int , long |
|
Kəsrli rəqəmlər: float , double |
|
boolean |
|
char |
|
Date |
|
Simvol % |
Bu parametrlər məlumat tipini göstərir, lakin məlumatların sırasını göstərmək üçün başqa parametrlər də mövcuddur. Parametri nömrəsinə görə seçmək üçün (nömrələr birinci dən başlayır) %1$d
əvəzinə %d
yazmaq lazımdır. Nümunə:
Kod | Nəticə |
---|---|
|
s bərabər olacaq "a=13, b=12, c=11" |
%3$d
üçüncü parametr-dəyişəni götürəcək, %2$d
ikinci parametr-dəyişəni götürəcək. %d
isə ən birinci parametr-dəyişəni götürəcək. Şablonun %s
, %d
kimi parametrləri şablon parametrlərindən, məsələn, %3$d
və ya %2$s
asılı deyil.
3. String Pool
Java-da literallar şəklində göstərilən bütün sətirlər proqram işləyərkən yaddaşda, adlanan bir məkanda saxlanılır - StringPool
. StringPool
— sətirləri saxlamaq üçün xüsusi bir massivdir. Onun yaradılmasının məqsədi sətirlərin saxlanılmasını optimallaşdırmaqdır:
Birincisi, kodda göstərilən sətirləri haradasa saxlamaq lazımdır. Kod — komandalardır, lakin məlumatlar (xüsusilə sətirlər kimi böyük obyektlər) koddan ayrı bir yaddaşda saxlanılmalıdır. Kodda yalnız obyekt-sətirlərə istinadlar olur.
İkincisi, bütün eyni literalları yalnız bir dəfə yaddaşda saxlamaq mümkündür. Bu belə də işləyir. Sinifinizin kodu Java maşın tərəfindən yüklənəndə, bütün sətir literalları, əgər artıq orada deyilsə, StringPool
-a əlavə olunur. Orada artıq varsa, sadəcə StringPool
-dan olan istinad istifadə olunur.
Bu səbəbdən, əgər kodunuzda bir neçə String
-dəyişənə eyni literalları təyin etsəniz, dəyişənlər eyni istinadları saxlayacaq. StringPool
-da literal yalnız bir dəfə əlavə olunur, digər hallarda isə artıq yüklənmiş StringPool
sətirinə istinad götürülür.
Təxmini necə işləyir:
Kod | StringPool ilə iş |
---|---|
|
|
Məhz bu səbəbdən a
və b
dəyişənləri eyni istinadlara malik olacaq.
intern()
metodu
Və ən maraqlısı: hər hansı bir sətiri proqramlaşdırılmış şəkildə StringPool
-a əlavə edə bilərsiniz. Bunun üçün String
dəyişəninin intern()
metodunu çağırmaq kifayətdir.
intern()
metodu, əgər sətir orada yoxdursa, onu StringPool
-a əlavə edəcək və StringPool
-dan olan sətirə istinad qaytaracaq.
Əgər intern()
metodu ilə iki eyni sətiri StringPool
-a əlavə etsəniz, metod eyni istinadları qaytaracaq. Bu sətirləri istinad vasitəsilə müqayisə etmək üçün istifadə oluna bilər. Misal:
Kod | Qeyd |
---|---|
|
|
|
|
Bu metodu tez-tez istifadə edəcəyiniz ehtimalı azdır, amma texniki müsahibələrdə bu haqda soruşmağı sevirlər, buna görə bilmək bilməməkdən yaxşıdır.
GO TO FULL VERSION