Salam! Bu gün gaty möhüm we gyzykly mowzuk hakda gürleşeris, ýagny obýektleri biri-biri bilen deňeşdirip, Java-da deňdir () . Hakykatdanam, Java-da haýsy ýagdaýlarda A obýekt B obýektine deň bolar ? Mysal ýazmaga synanyşalyň:
public class Car {
String model;
int maxSpeed;
public static void main(String[] args) {
Car car1 = new Car();
car1.model = "Ferrari";
car1.maxSpeed = 300;
Car car2 = new Car();
car2.model = "Ferrari";
car2.maxSpeed = 300;
System.out.println(car1 == car2);
}
}
Konsol çykyşy:
false
Bolýar, dur. Aslynda näme üçin bu iki awtoulag deň däl? Olara şol bir häsiýetleri berdik, ýöne deňeşdirmegiň netijesi ýalan. Jogap ýönekeý. Operator ==
obýektleriň häsiýetlerini däl-de, baglanyşyklaryny deňeşdirýär. Iki obýektiň 500 meňzeş häsiýeti bar bolsa-da, deňeşdirmegiň netijesi ýalan bolar. Galyberse-de, baglanyşyklar iki dürli jisimi , iki dürli adresi car1
görkezýär . Adamlary deňeşdirmek bilen bir ýagdaýy göz öňüne getiriň. Dünýäde siziň ýaly at, göz reňki, ýaşy, boýy, saç reňki we ş.m. ýaly adam bar bolsa gerek. .Agny, köp tarapdan meňzeýärsiňiz, ýöne şonda-da siz ekiz däl, esasanam şol bir adam däl. Iki obýekti deňeşdirmek üçin ulananymyzda operator takmynan şol bir logikany ulanýar . Youröne programmaňyzda dürli logika gerek bolsa näme etmeli? Mysal üçin, programmaňyz DNK derňewini simulasiýa etse. Iki adamyň DNK koduny deňeşdirip, olaryň ekizdigini kesgitlemeli. car2
==
public class Man {
int dnaCode;
public static void main(String[] args) {
Man man1 = new Man();
man1.dnaCode = 1111222233;
Man man2 = new Man();
man2.dnaCode = 1111222233;
System.out.println(man1 == man2);
}
}
Konsol çykyşy:
false
Netijäniň birmeňzeş bolmagy mantykly (ahyrsoňy, hiç zady üýtgetmedik), ýöne indi biz muňa razy däl! Hakykatdanam, hakyky durmuşda DNK derňewi ekizler bilen ýüzbe-ýüz bolýandygymyzyň ýüz göterim kepilligi. Emma programmamyz we operatorymyz ==
başgaça aýdýar. Bu häsiýeti nädip üýtgedip bileris we DNK synaglary gabat gelse, programmanyň dogry netije berjekdigine nädip göz ýetirip bileris? Bu maksat bilen Java-da ýörite usul döredildi - deňdir () .
Java-da deň () usul
toString()
Öň ara alyp maslahatlaşan usulymyz ýaly , deňler ()Object
Java-da iň möhüm synp, beýleki ähli synplardan alnan klasa degişlidir . Şeýle-de bolsa, deňdir () özi programmamyzyň özüni alyp barşyny hiç hili üýtgetmez:
public class Man {
String dnaCode;
public static void main(String[] args) {
Man man1 = new Man();
man1.dnaCode = "111122223333";
Man man2 = new Man();
man2.dnaCode = "111122223333";
System.out.println(man1.equals(man2));
}
}
Konsol çykyşy:
false
Edil şol bir netije, onsoň bu usul näme üçin zerur? : / Bu ýönekeý. Hakykat, indi bu usuly synpyň özünde bolşy ýaly ulandyk Object
. Synp koduna girip Object
, bu usulyň nähili durmuşa geçirilýändigini we näme edýändigini görsek, göreris:
public boolean equals(Object obj) {
return (this == obj);
}
Bu, programmamyzyň özüni alyp barşynyň üýtgemezliginiň sebäbi! Synpyň deň () usulynyň içinde Object
şol bir salgylanma deňeşdirmesi ýatyr , ==
. Thisöne bu usulyň mekiri, ony ýok edip bileris. Artykmaç diýmek, öz synpymyza deň () usulyňyzy ýazmak Man
we ony isleýşimiz ýaly alyp barmak diýmekdir! man1.equals(man2)
Indi çekiň edil şol bir zady edýändigi bilen kanagatlanamzok man1 == man2
. Ine, bu ýagdaýda näme ederis:
public class Man {
int dnaCode;
public boolean equals(Man man) {
return this.dnaCode == man.dnaCode;
}
public static void main(String[] args) {
Man man1 = new Man();
man1.dnaCode = 1111222233;
Man man2 = new Man();
man2.dnaCode = 1111222233;
System.out.println(man1.equals(man2));
}
}
Konsol çykyşy:
true
Doly başga netije! Adaty usulyň ýerine öz deň () usulymyzy ýazmak bilen dogry alyp bardyk: indi iki adamyň birmeňzeş DNK kody bar bolsa, programma bize: "DNK derňewi olaryň ekizdigini görkezdi" we hakykata gaýdyp gelýär! Sapaklaryňyzdaky deň () usulyny ýok edip, zerur obýekt deňeşdirme logikasyny aňsatlyk bilen döredip bilersiňiz. Obýektleri diňe umumy manyda deňeşdirmek barada durup geçdik. Öňümizde bu mowzuk boýunça aýratyn uly leksiýa geçireris (gyzyklanýan bolsaňyz, indi çalt okap bilersiňiz).
Java-da setir deňeşdirme - Setir deňeşdirmesi
Näme üçin setir deňeşdirmelerini beýleki zatlardan aýratyn hasaplaýarys? Aslynda, programmirleme setirleri düýbünden başga bir hekaýa. Ilki bilen, adamzat tarapyndan ýazylan ähli Java programmalaryny alsaň, içindäki zatlaryň 25% töweregi şolardan durýar. Şonuň üçin bu mowzuk gaty möhümdir. Ikinjiden, setirleri deňeşdirmek prosesi hakykatdanam beýleki obýektlerden düýpgöter tapawutlanýar. Simpleönekeý bir meselä seredeliň:public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = new String("JavaRush is the best site to learn Java!");
System.out.println(s1 == s2);
}
}
Konsol çykyşy:
false
Emma näme üçin ýalan? Setirler birmeňzeş, sözme-söz: / Siz çak edip bilersiňiz: munuň sebäbi operator ==
salgylanmalary deňeşdirýär! Galyberse-de, s1
olaryň s2
ýatda dürli salgylary bar. Bu pikir size gelen bolsa, geliň mysalymyza täzeden seredeliň:
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
System.out.println(s1 == s2);
}
}
Indi biziň hem iki baglanyşygymyz bar, ýöne netije tersine üýtgedi: Konsol çykyşy:
true
Doly bulaşdyňyzmy? :) Geliň, düşüneliň. Operator ==
aslynda ýatdaky salgylary deňeşdirýär. Bu düzgün elmydama işleýär we muňa şübhelenmegiň zerurlygy ýok. Diýmek, s1 == s2
hakykata gaýdyp gelse, bu iki setiriň ýadynda birmeňzeş salgy bar. Hakykatdanam şeýle! Setirleri saklamak üçin ýörite ýat meýdançasy bilen tanyşmagyň wagty geldi - setir basseýni ( String pool
) Setir howzy , programmaňyzda döreden ähli setir bahalaryňyzy saklamak üçin bir meýdan. Näme üçin döredildi? Öň bellenip geçilişi ýaly, setirler ähli obýektleriň ep-esli bölegini tutýar. Islendik uly programmada köp setir döredilýär. Memoryady tygşytlamak üçin bu zerur zat String Pool
- zerur tekst bilen bir setir şol ýerde ýerleşdiriler we geljekde täze döredilen baglanyşyklar şol bir ýat meýdanyna degişlidir, her gezek goşmaça ýat paýlamagyň zerurlygy ýok. Her gezek ýazanyňyzda String = “........”
, programma setir basseýninde şeýle tekst bilen çyzygyň bardygyny ýa-da ýokdugyny barlaýar. Bar bolsa, täzesi döredilmez. Täze baglanyşyk, bu setiriň saklanýan setir howuzundaky şol bir adresi görkezer. Şonuň üçin programmada ýazanymyzda
String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
baglanyşyk s2
edil şol bir ýeri görkezýär s1
. Birinji buýruk, zerur tekst bilen setir basseýninde täze setir döretdi we ikinjisine gelende, diňe ýat meýdanyna meňzeýärdi s1
. Şol bir tekst bilen azyndan 500 setir ýasap bilersiňiz, netije üýtgemez. Dur. Thenöne näme üçin bu mysal öňräk işlemedi?
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = new String("JavaRush is the best site to learn Java!");
System.out.println(s1 == s2);
}
}
Meniň pikirimçe, içginlik bilen, munuň sebäbini eýýäm çaklaýarsyňyz :) Has giňişleýin okamazdan ozal çaklamaga synanyşyň. Bu iki setiriň başgaça döredilendigini görüp bilersiňiz. Biri operatoryň kömegi bilen new
, ikinjisi onsuz. Munuň sebäbi hut şu. Täze operator, bir obýekt döredilende, onuň üçin ýatda täze bir ýer bölüp berýär . Döredilen setir bolsa new
gutarmaýar String Pool
: teksti 'a' bilen birmeňzeş bolsa-da, aýratyn bir obýekte öwrülýär String Pool
. Theagny, aşakdaky kody ýazsak:
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
String s3 = new String("JavaRush is the best site to learn Java!");
}
}
Memoryatda şeýle bolar: Her gezek täze bir obýekt döredilende, new
täze setirleriň içindäki tekst birmeňzeş bolsa-da, ýatda täze bir meýdan bölüner! Operatory tertipleşdiren ýaly ==
, ýöne täze dostumyz - deň () usuly näme?
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = new String("JavaRush is the best site to learn Java!");
System.out.println(s1.equals(s2));
}
}
Konsol çykyşy:
true
Gyzykly. Memoryadyň dürli ýerlerine nämäni s1
we nämäni görkezýändigini anyk bilýäris . s2
Emma, muňa garamazdan, deň () usul olaryň deňdigini aýdýar. Näme üçin? Aboveadyňyzdan çykarmaň, ýokarda deň () usuly synpyňyzda obýektleri zerur ýaly deňeşdirip biler ýaly ýok edip bileris diýdik? Ine, synp bilen şeýle etdiler String
. Onda ýokaşan deň () usuly bar. Baglanyşyklary däl-de, setirlerdäki nyşanlaryň yzygiderliligini deňeşdirýär. Setirlerdäki tekst birmeňzeş bolsa, olaryň nädip döredilendigi we nirede saklanandygy möhüm däl: setir howuzunda ýa-da aýratyn ýat meýdanynda. Deňeşdirmegiň netijesi dogry bolar. Theeri gelende aýtsak, Java size setirleri kese duýgur görnüşde dogry deňeşdirmäge mümkinçilik berýär. Adaty ýagdaýda, setirleriň birini, meselem, baş harplar bilen ýazsaňyz, deňeşdirmegiň netijesi ýalňyş bolar:
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = new String("JAVARUSH - ЛУЧШИЙ САЙТ ДЛЯ ИЗУЧЕНИЯ JAVA!");
System.out.println(s1.equals(s2));
}
}
Konsol çykyşy:
false
Bu ýagdaýda synpyň String
usuly bar equalsIgnoreCase()
. Deňeşdirmekde esasy zat, olaryň däl-de, belli bir nyşanlaryň yzygiderliligi bolsa, ulanyp bilersiňiz. Mysal üçin, iki e-poçta salgysyny deňeşdireniňde bu peýdaly bolar:
public class Main {
public static void main(String[] args) {
String address1 = "Moscow, Academician Korolev street, 12";
String address2 = new String("Г. МОСКВА, УЛ. АКАДЕМИКА КОРОЛЕВА, ДОМ 12");
System.out.println(address1.equalsIgnoreCase(address2));
}
}
Bu ýagdaýda şol bir salgy barada gürleşýändigimiz äşgärdir, şonuň üçin usuly ulanmak equalsIgnoreCase()
dogry karar bolar.
String.intern () usuly
SynpyňString
başga bir kyn usuly bar - intern()
; Usul intern()
gönüden-göni 'om' bilen işleýär String Pool
. intern()
Bir setirde bir usul diýseňiz , ol:
- Setir howuzynda bu tekst bilen setiriň bardygyny ýa-da ýokdugyny görmek üçin
- Eger bar bolsa, howuzda oňa baglanyşyk gaýtaryp berýär
- Notok bolsa, bu tekst bilen setir basseýnine ýerleşdirýär we oňa baglanyşyk yzyna berýär.
intern()
täze arkaly döredilen setir salgylanmasyna ulanmak bilen, ony String Pool
“a” -dan setir salgylanmasy bilen deňeşdirip bileris ==
.
public class Main {
public static void main(String[] args) {
String s1 = "JavaRush is the best site to learn Java!";
String s2 = new String("JavaRush is the best site to learn Java!");
System.out.println(s1 == s2.intern());
}
}
Konsol çykyşy:
true
Ozallar bilen deňeşdirenimizde intern()
, netije ýalňyşdy. Indi bu usul "JavaRush - Java öwrenmek üçin iň oňat sahypa!"intern()
Teksti bilen setiriň bardygyny ýa-da ýokdugyny barlady. simli howuzda. Elbetde şol ýerde: ýazanymyzda döretdik
String s1 = "JavaRush is the best site to learn Java!";
s1
Usul bilen gaýtarylan salgylanmanyň we salgylanmanyň s2.intern()
ýatda bir meýdana gönükdirilendigi we elbetde şeýle edýändigi barlandy :) Esasy düzgüni jemlemek, ýatda saklamak we ulanmak: Setirleri deňeşdirmek üçin HEMMEN deňlikleri ulanyň () usuly! Setirleri deňeşdireniňde, elmydama diýen ýaly baglanyşyklaryny, ýat ýerlerini we ş.m. tekstlerini deňeşdirmegi göz öňünde tutýarsyň. Deňdir () usuly size gerek zady edýär. Özbaşdak öwrenmek üçin käbir baglanyşyklar:
GO TO FULL VERSION