JavaRush /Блоги Java /Random-TG /Муқоиса дар Java ва String баробар аст - Муқоисаи сатр

Муқоиса дар Java ва String баробар аст - Муқоисаи сатр

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи як мавзӯи хеле муҳим ва ҷолиб сӯҳбат хоҳем кард, яъне муқоисаи an objectҳо бо ҳамдигар баробар () дар Java. Ва воқеан, дар кадом ҳолатҳо дар Java Объекти А ба Объекти В баробар мешавад ? Баробар ва муқоисаи сатр - 1Биёед кӯшиш кунем, ки як мисол нависем:
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);
   }
}
Натиҷаи консол:

false
Хуб, бас. Чаро, дар асл, ин ду мошин баробар нестанд? Мо ба онҳо ҳамон хосиятҳоро додем, аммо натиҷаи муқоиса дурӯғ аст. Ҷавоб оддӣ аст. Оператор ==на хосиятҳои an objectҳо, балки пайвандҳоро муқоиса мекунад. Ҳатто агар ду an object 500 хосияти якхела дошта бошанд ҳам, натиҷаи муқоиса ба ҳар ҳол нодуруст хоҳад буд. Дар ниҳоят, истинодҳо ба ду an objectи гуногун , ба ду суроғаи гуногун car1ишора мекунанд . Вазъиятро бо муқоисаи одамон тасаввур кунед. Шояд дар дунё шахсе бошад, ки бо шумо ном, ранги чашм, синну сол, қад, ранги мӯй ва ғайраҳо дорад. Яъне шумо аз бисёр ҷиҳат ба ҳам монанд ҳастед, аммо ба ҳар ҳол шумо дугоник нестед ва махсусан як шахс нестед. Вақте ки мо онро барои муқоисаи ду an object истифода мебарем, оператор тақрибан ҳамин мантиқро истифода мебарад . Аммо чӣ мешавад, агар ба шумо дар барномаи худ мантиқи дигар лозим шавад? Масалан, агар барномаи шумо таҳлor ДНК-ро тақлид кунад. Вай бояд рамзи ДНК-и ду нафарро муқоиса кунад ва муайян кунад, ки онҳо дугониканд. car2 Баробар ва муқоисаи сатр - 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);
   }
}
Натиҷаи консол:

false
Мантиқан он аст, ки натиҷа ҳамон буд (охир, мо чизеро тағир надодаем), аммо ҳоло мо аз он қаноатманд нестем! Дар ҳақиқат, дар ҳаёти воқеӣ, таҳлor ДНК сад фоиз кафолати он аст, ки мо бо дугоникҳо рӯ ба рӯ мешавем. Аммо барнома ва оператори мо ==ба мо чизи дигаре мегӯянд. Чӣ тавр мо метавонем ин рафторро тағир диҳем ва боварӣ ҳосил кунем, ки агар санҷишҳои ДНК мувофиқат кунанд, барнома натиҷаи дуруст медиҳад? Бо ин мақсад дар Java усули махсус сохта шудааст - equals() .

Усули Equals() дар Java

Мисли усуле, toString()ки мо қаблан муҳокима кардем, equals() ба синф тааллуқ дорад, Objectсинфи муҳимтарин дар Java, ки ҳама синфҳои дигар аз он гирифта мешаванд. Аммо, худи equals() рафтори барномаи моро ба ҳеҷ ваҷҳ тағир намедиҳад:
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));
   }
}
Натиҷаи консол:

false
Маҳз ҳамин натиҷа, пас чаро ин усул лозим аст? :/ Ин оддӣ аст. Гап дар сари он аст, ки ҳоло мо ин усулро истифода мебарем, зеро он дар худи синф татбиқ шудааст Object. Ва агар мо ба codeи синф ворид шавем Objectва бубинем, ки ин усул дар он чӣ гуна татбиқ карда мешавад ва он чӣ кор мекунад, мо мебинем:
public boolean equals(Object obj) {
   return (this == obj);
}
Аз ин чост, ки рафтори барномаи мо тагьир наёфтааст! Дар дохor усули синфи equals() Objectҳамон муқоисаи истинод мавҷуд аст, ==. Аммо ҳиллаи ин усул дар он аст, ки мо метавонем онро аз сар гузаронем. Барқарор кардан маънои онро дорад, ки усули баробар () -и худро дар синфи мо нависед Manва он тавре, ки мо мехоҳем рафтор кунад! Ҳоло мо қаноатманд нестем, ки чек man1.equals(man2)аслан ҳамон чизеро иҷро мекунад man1 == man2. Дар ин ҳолат мо чӣ кор хоҳем кард:
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));

   }
}
Натиҷаи консол:

true
Натиҷаи тамоман дигар! Бо навиштани усули баробар() худамон ба ҷои усули стандартӣ, мо рафтори дурустро ба даст овардем: ҳоло агар ду нафар як рамзи ДНК дошта бошанд, барнома ба мо мегӯяд: "Таҳлor ДНК нишон дод, ки онҳо дугониканд" ва ҳақиқатро бармегардонад! Бо бекор кардани усули equals() дар синфҳои худ, шумо метавонед ба осонӣ мантиқи муқоисаи an objectи заруриро эҷод кунед. Мо ба мукоисаи предметхо танхо аз чихати умумй дахл кардем. Мо дар пеш дар ин мавзӯъ як лексияи алоҳидаи калон дорем (агар шумо таваҷҷӯҳ дошта бошед, ҳоло метавонед онро зуд хонед).

Муқоисаи сатр дар Java - Муқоисаи сатр

Чаро мо муқоисаи сатрро аз ҳама чизи дигар ҷудо мекунем? Хуб, дар асл, хатҳои барномасозӣ як ҳикояи тамоман дигаранд. Аввалан, агар шумо ҳамаи барномаҳои Java-ро, ки инсоният навиштааст, гиред, тақрибан 25% an objectҳои онҳо аз онҳо иборат аст. Аз ин рӯ, ин мавзӯъ хеле муҳим аст. Дуюм, раванди муқоисаи сатрҳо воқеан аз дигар an objectҳо комилан фарқ мекунад. Биёед як мисоли оддиро бубинем:
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);
   }
}
Натиҷаи консол:

false
Аммо чаро дурӯғ? Сатрҳо комилан якхелаанд, калима ба калима:/ Шумо метавонед тахмин кунед: ин аз он сабаб аст, ки оператор == истинодҳоро муқоиса мекунад! Охир, s1онхо s2дар хотира addressхои гуногун доранд. Агар ин фикр ба сари шумо омада бошад, биёед мисоли худро такрор кунем:
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);
   }
}
Ҳоло мо инчунин ду истинод дорем, аммо натиҷа ба муқобил тағйир ёфт: Натиҷаи консол:

true
Комилан ошуфтааст? :) Биёед инро фаҳмем. Оператор ==воқеан суроғаҳоро дар хотира муқоиса мекунад. Ин қоида ҳамеша кор мекунад ва ба он шубҳа кардан лозим нест. Ин маънои онро дорад, ки агар s1 == s2он ҳақиқӣ баргардад, ин ду сатр дар хотира суроғаи якхела доранд. Ва дар ҳақиқат ин аст! Вақти он расидааст, ки бо майдони махсуси хотира барои нигоҳдории сатрҳо шинос шавед - ҳавзи сатр ( String pool) Баробар ва муқоисаи сатр - 3Пули сатр майдонест барои нигоҳ доштани ҳамаи арзишҳои сатр, ки шумо дар барномаи худ эҷод мекунед. Он барои чӣ офарида шудааст? Тавре ки дар боло зикр гардид, сатрҳо қисми зиёди ҳама an objectҳоро мегиранд. Дар ҳама гуна барномаи калон, сатрҳои зиёде сохта мешаванд. Барои сарфаи хотира ин чиз лозим аст String Pool- дар он ҷо сатри матни лозима ҷойгир карда мешавад ва дар оянда истинодҳои навтаъсисшуда ба ҳамон минтақаи хотира ишора мекунанд, ҳар дафъа ҷудо кардани хотираи иловагӣ лозим нест. Ҳар дафъае, ки шумо менависед String = “........”, барнома тафтиш мекунад, ки оё дар ҳавзи сатр сатри дорои чунин матн мавҷуд аст ё на. Агар вуҷуд дошта бошад, наваш эҷод намешавад. Ва истиноди нав ба ҳамон суроға дар ҳавзи сатр, ки ин сатр нигоҳ дошта мешавад, ишора мекунад. Бинобар ин, вакте ки мо дар программа навиштем
String s1 = "JavaRush is the best site to learn Java!";
String s2 = "JavaRush is the best site to learn Java!";
пайванд s2ба ҳамон ҷо ишора мекунад s1. Фармони аввал дар ҳавзи сатр бо матни ба мо лозима хати нав эҷод кард ва вақте ки сухан дар бораи дуюм омад, он танҳо ба ҳамон майдони хотира ишора кард s1. Шумо метавонед бо як матн ҳадди аққал 500 сатри дигар созед, натиҷа тағир намеёбад. Ист. Аммо чаро ин мисол барои мо пештар кор накард?
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);
   }
}
Ман фикр мекунам, ба таври интуитивӣ, шумо аллакай фаҳмидед, ки сабаб чист :) Пеш аз хондани минбаъда кӯшиш кунед, ки тахмин кунед. Шумо мебинед, ки ин ду сатр ба таври дигар офарида шудаанд. Яке бо ёрии оператор newва дуюм бе он. Махз хамин сабаб аст. Оператори нав ҳангоми сохтани an object маҷбуран майдони навро дар хотира барои он ҷудо мекунад . Ва хатте, ки бо , сохта шудааст new, ба охир намерасад String Pool: an objectи алохида мешавад, гарчанде ки матни он бо хатти 'а комилан якхела бошад String Pool. Яъне, агар мо рамзи зеринро нависем:
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!");
   }
}
Дар хотира он чунин хоҳад буд: Баробар ва муқоисаи сатр - 4Ва ҳар дафъае, ки an objectи нав сохта мешавад, newдар хотира як минтақаи нав ҷудо карда мешавад, ҳатто агар матн дар дохor сатрҳои нав якхела бошад! Чунин ба назар мерасад, ки мо операторро ҷудо кардаем ==, аммо дар бораи дӯсти нави мо - усули equals() чӣ гуфтан мумкин аст?
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));
   }
}
Натиҷаи консол:

true
Ҷолиб. Мо аниқ медонем, ки чӣ s1ва s2ба соҳаҳои гуногун дар хотира ишора. Аммо, бо вуҷуди ин, усули equals() мегӯяд, ки онҳо баробаранд. Чаро? Дар хотир доред, ки дар боло мо гуфта будем, ки усули equals() метавонад дар синфи шумо бекор карда шавад, то он an objectҳоро тавре муқоиса кунад, ки ба шумо лозим аст? Он чизе ки онҳо бо синф карданд String. Он дорои усули бекоршуда баробар() мебошад. Ва он на истинодҳоро, балки пайдарпайии аломатҳоро дар сатр муқоиса мекунад. Ва агар матн дар сатрҳо якхела бошад, муҳим нест, ки онҳо чӣ гуна сохта шудаанд ва дар куҷо нигоҳ дошта мешаванд: дар ҳавзи сатр ё дар минтақаи алоҳидаи хотира. Натиҷаи муқоиса дуруст хоҳад буд. Дар омади гап, Java ба шумо имкон медиҳад, ки сатрҳоро бо ҳарфи ҳассос дуруст муқоиса кунед. Дар ҳолати муқаррарӣ, агар шумо яке аз сатрҳоро нависед, масалан, бо ҳарфҳои калон, натиҷаи муқоиса нодуруст хоҳад буд:
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));
   }
}
Натиҷаи консол:

false
Барои ин синф Stringяк метод дорад equalsIgnoreCase(). Агар чизи асосӣ дар муқоисаи шумо пайдарпайии аломатҳои мушаххас бошад, на ҳолати онҳо, шумо метавонед онро истифода баред. Масалан, ин ҳангоми муқоисаи ду суроғаи почтаи электронӣ муфид хоҳад буд:
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));
   }
}
Дар ин сурат маълум аст, ки сухан дар бораи худи хамон address меравад, бинобар ин истифода бурдани усул equalsIgnoreCase()карори дуруст хохад буд.

Усули String.intern().

Синф Stringбоз як усули мураккаб дорад - intern(); Усули intern()бевосита бо String Pool'ом кор мекунад. Агар шумо методро intern()дар сатр даъват кунед, он:
  • Ба назар мерасад, ки оё дар ҳавзи сатр сатр бо ин матн вуҷуд дорад
  • Агар мавҷуд бошад, истиноди онро дар ҳавз бармегардонад
  • Дар акси ҳол, он сатрро бо ин матн дар ҳавзи сатр ҷойгир мекунад ва истинодро ба он бармегардонад.
Бо истифодаи усул intern()ба истинод ба сатри нав, ки тавассути нав сохта шудааст, мо метавонем онро бо истинодҳои сатри String Pool'a тавассути ==.
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());
   }
}
Натиҷаи консол:

true
Пештар, вақте ки мо онҳоро бидуни , муқоиса мекардем intern(), натиҷа нодуруст буд. Акнун усул intern()тафтиш кард, ки оё сатр бо матни "JavaRush - беҳтарин сайт барои омӯзиши Java!" дар ҳавзи сатр. Албатта, он ҷост: мо онро ҳангоми навиштан офаридаем
String s1 = "JavaRush is the best site to learn Java!";
Санҷида шуд, ки истинод s1ва истинод бо усули баргардонидашуда s2.intern()ба як минтақаи хотира ишора мекунанд ва албатта онҳо ин корро мекунанд :) Барои ҷамъбаст кардан, дар хотир нигоҳ доштан ва истифода бурдани қоидаи асосӣ: Барои муқоисаи сатр ҲАМЕША баробар () -ро истифода баред. усул! Ҳангоми муқоисаи сатрҳо, шумо қариб ҳамеша дар назар доред, ки матни онҳоро муқоиса кунед, на истинодҳо, минтақаҳои хотира ва ғайра. Усули equals() он чизеро, ки ба шумо лозим аст, иҷро мекунад. Инҳоянд чанд истинодҳое, ки шумо мустақилона таҳсил кунед:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION