ვიცით, რომ ობიექტების შედარებისას არის რამდენიმე ვარიანტი:
== შედარების ოპერატორის საშუალებით ვადგენთ მიუთითებენ (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");
საინტერესო პოსტია.
ძაღლის თავი 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);
}
@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 არა. ამიტომ მისთვის მაინც ახალი ობიექტი იქმნება.
მდაააააა
ვრაფერების პულის არსებობა, რატომღაც არ ვიცოდი 🙁
მხოლოდ სტრინგებზე მეგონა რომ ესე იყო.
კიდევ რაიმე ობიექტებისთვის ხომ არ არის პული?
@rachvela
არ მახსენდება სხვა პული. შეიძლება არც ვიცი მეტი. თუ რამე შემხვდა კიდევ, დავწერ.. ან გეტყვი.. 😀
vaime dedaaaaaa
daadebagireT bolo bolo da naxavT ,eg yvelaze kai gzaaa