JavaRush /Blog Jawa /Random-JV /Padha karo Jawa lan String mbandhingake - String comparis...

Padha karo Jawa lan String mbandhingake - String comparison

Diterbitake ing grup
Hello! Dina iki kita bakal pirembagan bab topik penting banget lan menarik, yaiku, mbandhingaké obyek karo saben liyane witjaksono () ing Jawa. Lan pancen, ing kasus apa ing Jawa Obyek A padha karo Obyek B ? Setara lan perbandingan string - 1Ayo coba nulis conto:

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);
   }
}
Output konsol:

false
Oke, mandeg. Kenging punapa, nyatane, mobil loro iki ora padha? Kita menehi properti sing padha, nanging asil perbandingan kasebut salah. Jawaban iki prasaja. Operator ==mbandhingake ora sifat obyek, nanging pranala. Sanajan rong obyek duwe 500 sifat sing padha, asil perbandingan kasebut isih palsu. Sawise kabeh, pranala car1tumuju car2 menyang rong obyek sing beda , menyang rong alamat sing beda. Mbayangno kahanan karo mbandingaken wong. Mbokmenawa ana wong ing donya sing duwe jeneng padha, werna mripat, umur, dhuwur, werna rambute, etc. Sing, sampeyan padha ing akeh cara, nanging sampeyan isih ora kembar, lan utamané ora wong sing padha. Setara lan perbandingan string - 2Operator kasebut nggunakake logika sing padha ==nalika digunakake kanggo mbandhingake rong obyek. Nanging apa yen sampeyan butuh logika sing beda ing program sampeyan? Contone, yen program sampeyan simulasi analisis DNA. Dheweke kudu mbandhingake kode DNA saka wong loro lan nemtokake manawa dheweke kembar.

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);
   }
}
Output konsol:

false
Iku logis yen asil padha (sawise kabeh, kita ora ngganti apa-apa), nanging saiki kita ora seneng karo! Pancen, ing urip nyata, analisis DNA minangka jaminan satus persen yen kita ngadhepi kembar. Nanging program lan operator kita ==ngandhani yen ora. Kepiye carane bisa ngganti prilaku iki lan priksa manawa tes DNA cocog, program kasebut bakal ngasilake asil sing bener? Kanggo maksud iki, cara khusus digawe ing Jawa - equals() .

Metode Equals() ing Jawa

Kaya cara toString()sing kita rembugan sadurunge, padha () kalebu kelas, Objectkelas paling penting ing Jawa, saka ngendi kabeh kelas liyane diturunake. Nanging, equals () dhewe ora bakal ngganti prilaku program kita kanthi cara apa wae:

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));
   }
}
Output konsol:

false
Persis asil sing padha, mula kenapa cara iki dibutuhake? :/ Iku prasaja. Kasunyatane saiki kita nggunakake metode iki amarga wis ditindakake ing kelas kasebut Object. Lan yen kita pindhah menyang kode kelas Objectlan ndeleng carane metode iki diimplementasikake lan apa sing ditindakake, kita bakal weruh:

public boolean equals(Object obj) {
   return (this == obj);
}
Iki minangka alesan kenapa prilaku program kita ora owah! Nang kelas padha () cara Objectdumunung ing comparison referensi padha ==,. Nanging trik cara iki yaiku kita bisa ngatasi. Overriding tegese nulis cara sing padha () ing kelas kita Manlan nggawe tumindak kaya sing dikarepake! Saiki kita ora marem yen mriksa ing man1.equals(man2)dasare nindakake perkara sing padha karo man1 == man2. Mangkene apa sing bakal ditindakake ing kahanan iki:

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));

   }
}
Output konsol:

true
A asil temen beda! Kanthi nulis cara kita padha () tinimbang standar, kita entuk prilaku sing bener: saiki yen wong loro duwe kode DNA sing padha, program kasebut ngandhani: "Analisis DNA nuduhake yen dheweke kembar" lan bali bener! Kanthi overriding padha () cara ing kelas, sampeyan bisa kanthi gampang nggawe logika comparison obyek perlu. Kita wis ndemek perbandingan obyek mung ing istilah umum. Kita isih bakal duwe kuliah gedhe sing kapisah babagan topik iki (sampeyan bisa maca kanthi cepet saiki, yen sampeyan kasengsem).

String mbandhingake ing Jawa - String comparison

Napa kita nganggep perbandingan senar kanthi kapisah saka kabeh liyane? Inggih, nyatane, garis ing pemrograman minangka crita sing beda. Kaping pisanan, yen sampeyan njupuk kabeh program Java sing ditulis dening manungsa, udakara 25% obyek kasebut kalebu. Mulane, topik iki penting banget. Kapindho, proses mbandhingake senar pancen beda karo obyek liyane. Ayo katon ing conto prasaja:

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);
   }
}
Output konsol:

false
Nanging kok palsu? Garis kasebut persis padha, tembung kanggo tembung: / Sampeyan bisa nganggep: iki amarga operator == mbandhingake referensi! Sawise kabeh, s1padha s2duwe alamat beda ing memori. Yen sampeyan mikir iki, ayo gawe conto maneh:

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);
   }
}
Saiki kita uga duwe rong tautan, nanging asile wis diganti: Output konsol:

true
Rampung bingung? :) Ayo dipikir. Operator ==bener mbandhingake alamat ing memori. Aturan iki tansah bisa digunakake lan ora perlu mangu-mangu. Iki tegese yen s1 == s2bali bener, loro strings iki alamat padha ing memori. Lan pancen bener! Wektu kanggo kenal karo area memori khusus kanggo nyimpen senar - kolam senar ( String pool) Setara lan perbandingan string - 3Kolam senar minangka area kanggo nyimpen kabeh nilai senar sing digawe ing program sampeyan. Apa iki digawe kanggo? Kaya sing wis kasebut sadurunge, senar njupuk bagean gedhe saka kabeh obyek. Ing program gedhe, akeh garis sing digawe. Kanggo ngirit memori, iki sing dibutuhake String Pool- baris karo teks sing sampeyan butuhake diselehake ing kana, lan ing mangsa ngarep, pranala sing mentas digawe ngrujuk menyang area memori sing padha, ora perlu kanggo nyedhiyakake memori tambahan saben wektu. Saben-saben sampeyan nulis String = “........”, program mriksa apa ana baris karo teks kuwi ing blumbang senar. Yen ana, sing anyar ora bakal digawe. Lan link anyar bakal nuduhake alamat sing padha ing blumbang senar ngendi senar iki disimpen. Mulane, nalika kita wrote ing program

String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
link s2nuduhake persis menyang panggonan sing padha karo s1. Printah pisanan digawe baris anyar ing blumbang senar karo teks kita needed, lan nalika nerangake kaloro, iku mung diarani wilayah memori padha s1. Sampeyan bisa nggawe paling 500 baris liyane karo teks padha, asil ora bakal ngganti. mandeg. Nanging kenapa conto iki ora bisa digunakake kanggo kita sadurunge?

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);
   }
}
Aku, intuisi, sampeyan wis guess apa alesan iku :) Coba guess sadurunge maca luwih. Sampeyan bisa ndeleng manawa rong garis kasebut digawe kanthi beda. Siji kanthi bantuan operator new, lan sing kapindho tanpa. Iki sabenere alesan. Operator anyar, nalika nggawe obyek, kanthi paksa nyedhiyakake area anyar ing memori kasebut . Lan baris digawe karo new, ora mungkasi munggah ing String Pool: dadi obyek kapisah, sanajan teks sawijining persis padha baris padha saka String Pool'a. Yaiku, yen kita nulis kode ing ngisor iki:

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!");
   }
}
Ing memori bakal katon kaya iki: Setara lan perbandingan string - 4Lan saben-saben obyek anyar digawe, newwilayah anyar bakal diparengake ing memori, sanajan teks ing baris anyar padha! Kita koyone wis diurutake metu operator ==, nanging bab kanca anyar kita - padha () cara?

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));
   }
}
Output konsol:

true
menarik. Kita ngerti persis apa s1lan s2nuding menyang macem-macem wilayah ing memori. Nanging, Nanging, cara sing padha () nyatakake yen padha. Kenging punapa? Elingi, ndhuwur kita ngandika sing witjaksono () cara bisa overridden ing kelas supaya mbandhingaké obyek cara sampeyan kudu? Mangkono sing ditindakake ing kelas String. Wis ditimpa witjaksono () cara. Lan mbandhingake ora pranala, nanging urutan karakter ing strings. Lan yen teks ing strings padha, ora Matter carane padha digawe lan ing ngendi padha disimpen: ing blumbang senar, utawa ing wilayah memori kapisah. Asil saka comparison bakal bener. Miturut cara, Jawa ngidini sampeyan mbandhingake senar kanthi bener kanthi cara sing ora sensitif. Ing kahanan normal, yen sampeyan nulis salah siji saka baris, contone, ing tutup, asil saka comparison bakal palsu:

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));
   }
}
Output konsol:

false
Kanggo kasus iki, kelas Stringduwe metode equalsIgnoreCase(). Yen sing paling penting ing perbandingan sampeyan yaiku urutan karakter tartamtu, lan dudu kasus kasebut, sampeyan bisa nggunakake. Contone, iki bakal migunani nalika mbandhingake rong alamat email:

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));
   }
}
Ing kasus iki, jelas yen kita ngomong babagan alamat sing padha, mula nggunakake metode kasebut equalsIgnoreCase()bakal dadi keputusan sing tepat.

String.intern() metode

Kelas Stringduwe cara angel liyane - intern(); Cara intern()kerjane langsung karo String Pool'om. Yen sampeyan nelpon cara intern()ing senar, iku:
  • Katon kanggo ndeleng yen ana senar karo teks iki ing blumbang senar
  • Yen ana, bali link menyang ing blumbang
  • Yen ora, nempatake baris karo teks iki ing blumbang senar lan ngasilake link menyang.
Kanthi nggunakake metode kasebut intern()ing referensi senar sing digawe liwat anyar, kita bisa mbandhingake karo referensi senar saka String Pool'a liwat ==.

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());
   }
}
Output konsol:

true
Sadurunge, nalika kita mbandhingake tanpa intern(), asil kasebut salah. Saiki metode kasebut intern()mriksa manawa ana baris kanthi teks "JavaRush - situs paling apik kanggo sinau basa Jawa!" ing blumbang senar. Mesthi wae ana: kita nggawe nalika kita nulis

String s1 = "JavaRush is the best site to learn Java!";
Sampeyan iki dicenthang sing referensi s1lan referensi bali dening cara s2.intern()titik kanggo wilayah padha ing memori, lan, mesthi, padha :) Kanggo ngringkes, elinga lan nggunakake aturan utama: Kanggo mbandhingaké strings, tansah nggunakake witjaksono () metode! Nalika mbandhingake strings, sampeyan meh mesthi tegese mbandhingake teks, dudu referensi, area memori, lan liya-liyane. Cara sing padha () nindakake apa sing sampeyan butuhake. Ing ngisor iki sawetara tautan kanggo sampeyan sinau dhewe:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION