ობიექტების შედარება (Java)

ვიცით, რომ ობიექტების შედარებისას არის რამდენიმე ვარიანტი:

== შედარების ოპერატორის საშუალებით ვადგენთ მიუთითებენ (refer) თუ არა მითითებები ერთსა და იმავე ობიექტზე;

equals() მეთოდი – ვადგენთ აზრობრივად არის ორი ობიექტი ერთმანეთის ტოლი თუ არა.

 

რა ხდება wrapper კლასების შემთხვევაში? თავიდან ცოტა უცნაურად მომეჩვენა…

ასეთი კითხვა:
 

Integer i1 = 1000;
Integer i2 = 1000; 

if (i1 != i2) System.out.println("Different objects");
if (i1.equals(i2)) System.out.println("Meaningfully equal");

 

კოდის გაშვების შედეგად ვიღებთ:
 

Different objects
Meaningfully equal 

რა შედეგი ექნება ამ კოდს?

Integer i1 = 10;
Integer i2 = 10;

if (i1 == i2) System.out.println("Same objects");
if (i1.equals(i2)) System.out.println("Meaningfully equal");

გამოხმაურება

comments

6 thoughts on “ობიექტების შედარება (Java)

  • 06 იანვარი, 2009 at 17:47
    Permalink

    საინტერესო პოსტია.

    ძაღლის თავი Integer.valueOf()-შია დამარხული.
    AutoBoxing–ის დროს გამოიძახება Integer.valueOf() და არა კონსტრუქტორი.
    Integer.valueOf() კიდე აქეშირებს 1 ბაიტში მოქცეულ მნიშვნელობებს

    public static Integer valueOf(int i) {

    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache
    return IntegerCache.cache[i + offset];
    }

    return new Integer(i);
    }

    Reply
  • 06 იანვარი, 2009 at 21:30
    Permalink

    @Xray

    🙂
    ხომ. ეგ არის 🙂

    კიდევ უფრო დაწვრილებით რომ ავხსნათ:
    ზოგადად ორი ობიექტის შედარების დროს == ოპერატორით ედარება მხოლოდ ამ ობიექტების reference-ები. ოპერაციის შედეგი არის ’ჭეშმარიტი’ მაშინ, როდესაც ორივე reference-ი ერთსა და იმავე ობიექტზე მიუთითებს.

    გამოდის რომ
    Integer i1 = 1000;
    Integer i2 = 1000;
    ამ შემთხვევაში საქმე გვაქვს ორ განსხვავებულ ობიექტთთან, მიუხედავად იმისა, რომ მათი მნიშვნელობები ერთმანეთის ტოლია.
    თითოეულისთვის ხდება ’1000’ მნიშველობის boxing-ი და მის შესანახად იქმნება ახალი Integer ობიექტი.

    თუმცა ეფექტურობის გაზრდის მიზნით (იმისთვის, რომ ყოველი ახალი რიცხვის boxing-ის დროს ახალი ობიექტები არ შეიქმნას) არსებობს wrapper-ების პული. თუ პულში უკვე არსებობს იგივე მნიშვნელობის მქონე wrapper ობიექტი, მაშინ გვიბრუნდება უკვე არსებული ობიექტი.
    როგორც Xray-მ აღნიშნა, ავტობოქსინგის დროს გამოიყენება valueOf მეთოდი, ხოლო კონსტრუქტორი მხოლოდ მაშინ, თუ პულში ასეთი მნიშვნელობის ინსტანსი არ გვაქვს.

    რატომ ’10’-ის შემთხვევაში და არა ’1000’-ის შემთხვევაში?
    ხდება მხოლოდ შემდეგი ობიექტების მნიშვნელობების კეშირება:
    Boolean
    Byte
    Character \u0000-დან \u007f-ის ჩათვლით
    Short და Integer -128-დან 127-ის ჩათვლით

    10 ხვდება ამ ინტერვალში, ხოლო 1000 არა. ამიტომ მისთვის მაინც ახალი ობიექტი იქმნება.

    Reply
  • 17 იანვარი, 2009 at 23:17
    Permalink

    მდაააააა
    ვრაფერების პულის არსებობა, რატომღაც არ ვიცოდი 🙁
    მხოლოდ სტრინგებზე მეგონა რომ ესე იყო.
    კიდევ რაიმე ობიექტებისთვის ხომ არ არის პული?

    Reply
  • 18 იანვარი, 2009 at 23:29
    Permalink

    @rachvela

    არ მახსენდება სხვა პული. შეიძლება არც ვიცი მეტი. თუ რამე შემხვდა კიდევ, დავწერ.. ან გეტყვი.. 😀

    Reply
  • 26 თებერვალი, 2009 at 11:05
    Permalink

    vaime dedaaaaaa

    Reply
  • 21 მაისი, 2009 at 23:47
    Permalink

    daadebagireT bolo bolo da naxavT ,eg yvelaze kai gzaaa

    Reply

გაიარეთ ავტორიზაცია კომენტარის დასამატებლად: rachvela კომენტარის გაუქმება

თქვენი ელფოსტის მისამართი გამოქვეყნებული არ იყო. აუცილებელი ველები მონიშნულია *