JavaRush /Java Blog /Random-TK /Java we String deňeşdirilýär - Setir deňeşdirmesi

Java we String deňeşdirilýär - Setir deňeşdirmesi

Toparda çap edildi
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 ? Deňdir we setir deňeşdirmesi - 1Mysal ý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 car1gö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 Deňdir we setir deňeşdirmesi - 2==
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 Manwe 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, s1olaryň 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 == s2hakykata 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) Deňdir we setir deňeşdirmesi - 3Setir 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 s2edil ş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 newgutarmaý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: Deňdir we setir deňeşdirmesi - 4Her gezek täze bir obýekt döredilende, newtä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 s1we nämäni görkezýändigini anyk bilýäris . s2Emma, ​​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ň Stringusuly 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ň Stringbaş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.
Usuly 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!";
s1Usul 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:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION