ობიექტების შედარება (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");

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

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

    ძაღლის თავი 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);
    }

  2. @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 არა. ამიტომ მისთვის მაინც ახალი ობიექტი იქმნება.

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

  4. @rachvela

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

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

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

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>