ვიცით, რომ ობიექტების შედარებისას არის რამდენიმე ვარიანტი:
== შედარების ოპერატორის საშუალებით ვადგენთ მიუთითებენ (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