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


January 6th, 2009 at 5:47 pm
საინტერესო პოსტია.
ძაღლის თავი 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);
}
January 6th, 2009 at 9:30 pm
@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 არა. ამიტომ მისთვის მაინც ახალი ობიექტი იქმნება.
January 17th, 2009 at 11:17 pm
მდაააააა
ვრაფერების პულის არსებობა, რატომღაც არ ვიცოდი
მხოლოდ სტრინგებზე მეგონა რომ ესე იყო.
კიდევ რაიმე ობიექტებისთვის ხომ არ არის პული?
January 18th, 2009 at 11:29 pm
@rachvela
არ მახსენდება სხვა პული. შეიძლება არც ვიცი მეტი. თუ რამე შემხვდა კიდევ, დავწერ.. ან გეტყვი..
February 26th, 2009 at 11:05 am
vaime dedaaaaaa
May 21st, 2009 at 11:47 pm
daadebagireT bolo bolo da naxavT ,eg yvelaze kai gzaaa