{"id":605,"date":"2024-11-07T14:38:30","date_gmt":"2024-11-07T14:38:30","guid":{"rendered":"https:\/\/iseebugs.pl\/?p=605"},"modified":"2024-11-07T14:38:30","modified_gmt":"2024-11-07T14:38:30","slug":"porownywanie-typow-integer","status":"publish","type":"post","link":"https:\/\/iseebugs.pl\/index.php\/2024\/11\/07\/porownywanie-typow-integer\/","title":{"rendered":"Por\u00f3wnywanie typ\u00f3w Integer"},"content":{"rendered":"\n<p>O tym, \u017ce Stringi s\u0105 przechowywane w String Pool prawie ka\u017cdy kto ma styczno\u015b\u0107 z Jav\u0105 s\u0142ysza\u0142, tak samo o tym, \u017ceby obiekty referencyjne por\u00f3wnywa\u0107 metod\u0105 equals a nie za pomoc\u0105 &#8222;==&#8221;. Ale czy wszyscy s\u0142yszeli o Integer Pool i dlaczego to wa\u017cne?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mechanizm pool<\/h2>\n\n\n\n<p>W JVM obiekty kt\u00f3re tw\u00f3rcy uwa\u017caj\u0105 za cz\u0119sto u\u017cywane s\u0105 przechowywane w specjalnych pulach aby oszcz\u0119dzi\u0107 pami\u0119\u0107 i poprawi\u0107 wydajno\u015b\u0107 aplikacji. <\/p>\n\n\n\n<p>Po za najbardziej znan\u0105 pul\u0105 String\u00f3w istniej\u0105 jeszcze 3 pule dla klas opakowuj\u0105cych(Wrapper Class). \u0141\u0105cznie istniej\u0105 nast\u0119puj\u0105ce poole:<\/p>\n\n\n\n<ul>\n<li>String Pool<\/li>\n\n\n\n<li>Integer Pool<\/li>\n\n\n\n<li>Boolean Pool<\/li>\n\n\n\n<li>Character Pool<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">String pool<\/h2>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, istnieje obiekt typu String o warto\u015bci np. <code>String a = \"aabbcc\";<\/code>. Mechanizm puli polega na tym, \u017ce przy &#8222;tworzeniu&#8221; nowego obiektu, JVM tak naprawd\u0119 nie tworzy nowego obiektu tylko przypisuje referencje do ju\u017c utworzonego obiektu. W przypadku utworzenia obiektu <code>String b = \"aabbcc\"<\/code> obydwa obiekty b\u0119d\u0105 wskazywa\u0142y na to samo miejsce w pami\u0119ci JVM. W takim przypadku por\u00f3wnywanie tych obiekt\u00f3w za pomoc\u0105 &#8222;==&#8221; oraz equals zwr\u00f3ci nam w obu przypadkach true. &#8222;==&#8221; zwr\u00f3ci nam true poniewa\u017c por\u00f3wnanie to sprawdza czy referencje por\u00f3wnywanych obiekt\u00f3w wskazuj\u0105 na ten sam obiekt. Por\u00f3wnanie equals r\u00f3wnie\u017c zwr\u00f3ci nam true poniewa\u017c funkcja por\u00f3wnuje warto\u015bci kt\u00f3re s\u0105 jednakowe. <\/p>\n\n\n\n<p>Kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>String a = \"aabbcc\";\nString b = \"aabbcc\";\nboolean result = a.equals(b);\nSystem.out.printf(\"Is a equals b?: %b %n\", result);\n\nString c = \"aabbcc\";\nString d = \"aabbcc\";\nresult = c == d;\nSystem.out.printf(\"Is c equals c?: %b %n\", result);<\/code><\/pre>\n\n\n\n<p>Wynik:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Is a equals b?: true \nIs c equals c?: true <\/code><\/pre>\n\n\n\n<p>Nie mog\u0119 tu nie wspomnie\u0107, \u017ce w przypadku tworzenia nowego Stringa przy pomocy s\u0142owa kluczowego new nie trafi on do puli String\u00f3w tylko na stert\u0119 obiekt\u00f3w i w takim przypadku por\u00f3wnanie obiekt\u00f3w przy pomocy &#8222;==&#8221; zwr\u00f3ci false.<\/p>\n\n\n\n<p>Kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>String a = \"aabbcc\";\nString b = \"aabbcc\";\nboolean result = a.equals(b);\nSystem.out.printf(\"Is a equals b?: %b %n\", result);\n\nString c = \"aabbcc\";\nString d = new String(\"aabbcc\");\nresult = c == d;\nSystem.out.printf(\"Is c equals c?: %b %n\", result);<\/code><\/pre>\n\n\n\n<p>Wynik:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Is a equals b?: true \nIs c equals c?: false <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Integer pool<\/h2>\n\n\n\n<p>O ile o powy\u017cszym mechanizmie ka\u017cdy kto pracuje z Jav\u0105 jest zaznajomiony to o pozosta\u0142ych pulach nie wszyscy s\u0142yszeli. Najwi\u0119ksze konsekwencje dla naszego kodu mo\u017ce mie\u0107 nie znajomo\u015bc mechanizmu Integer Pool i prawid\u0142owego por\u00f3wnywania obiekt\u00f3w typu Integer. Automatycznie chcieliby\u015bmy por\u00f3wnywa\u0107 obiekty Integer w taki sam spos\u00f3b jak typy prymitywne to znaczy za pomoc\u0105 znak\u00f3w r\u00f3wno\u015bci &#8222;==&#8221;. Jest to b\u0142\u0105d kt\u00f3ry mo\u017ce powodowa\u0107 b\u0142\u0119dne dzia\u0142anie programu a ponadto jest trudny do wychwycenia.<\/p>\n\n\n\n<p>W Puli Integer\u00f3w przechowywane s\u0105 warto\u015bci od -128 do 127 to znaczy, \u017ce dla tych warto\u015bci nie s\u0105 tworzone nowe obiekty w pami\u0119ci, tylko tworzone obiekty wskazuj\u0105 poprzez swoj\u0105 referencje na ju\u017c istniej\u0105ce. Poni\u017cej oraz powy\u017cej tych warto\u015bci Integery nie odwo\u0142uj\u0105 si\u0119 do obiekt\u00f3w z puli Integer\u00f3w, lecz s\u0105 tworzone obiekty kt\u00f3re nie maj\u0105 wsp\u00f3lnych referencji. Przeanalizujmy analogiczny przyk\u0142ad jaki by\u0142 w przypadku String\u00f3w.<\/p>\n\n\n\n<p>Kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Integer a = 127;\nInteger b = 127;\nboolean result = a.equals(b);\nSystem.out.printf(\"Is a equals b?: %b %n\", result);\n\nInteger c = 127;\nInteger d = 127;\nresult = c == d;\nSystem.out.printf(\"Is c equals d?: %b %n\", result);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>Is a equals b?: true \nIs c equals d?: true <\/code><\/pre>\n\n\n\n<p>W powy\u017cszym przyk\u0142adzie wszystkie obiektu znajduj\u0105 si\u0119 w puli Integer\u00f3w wi\u0119c zar\u00f3wno por\u00f3wnanie ich za pomoc\u0105 equals jak i &#8222;==&#8221; zwr\u00f3ci nam true. Ale ciekawiej dzieje si\u0119 kiedy wyjdziemy poza zakres puli Integer\u00f3w.<\/p>\n\n\n\n<p>Kod:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Integer a = 128;\nInteger b = 128;\nboolean result = a.equals(b);\nSystem.out.printf(\"Is a equals b?: %b %n\", result);\n\nInteger c = 128;\nInteger d = 128;\nresult = c == d;\nSystem.out.printf(\"Is c equals d?: %b %n\", result);<\/code><\/pre>\n\n\n\n<p>Wynik:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Is a equals b?: true \nIs c equals d?: false <\/code><\/pre>\n\n\n\n<p>Je\u017celi wyjdziemy poza pul\u0119 Integer\u00f3w JVM tworzy niezale\u017cne od siebie obiekty o warto\u015bci &#8222;128&#8221;. W tym przypadku por\u00f3wnanie warto\u015bci za pomoc\u0105 equals zwr\u00f3ci oczekiwany wynik &#8222;true&#8221;, lecz por\u00f3wnanie referencji za pomoc\u0105 &#8222;==&#8221; zwr\u00f3ci na false. Dlatego tak wa\u017cne jest aby wszystkie obiekty referencyjne por\u00f3wnywa\u0107 za pomoc\u0105 metody equals, nawet wrapper class.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Dowiedzieli\u015bmy si\u0119 dlaczego obiekty typu Integer powinni\u015bmy zawsze por\u00f3wnywa\u0107 metod\u0105 equals a nie za pomoc\u0105&#8221;==&#8221;, oraz zapoznali\u015bmy si\u0119 z mechanizmem Pool w JVM.<\/p>\n\n\n\n<p>A co zwr\u00f3ci nam por\u00f3wnywanie typu prymitywnego int z Integer za pomoc\u0105 equals oraz &#8222;==&#8221;? To ju\u017c zostawiam Tobie i zach\u0119cam do zabawy z kodem \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por\u00f3wnywanie typ\u00f3w Integer. R\u00f3b to dobrze! \ud83d\ude09<\/p>\n","protected":false},"author":1,"featured_media":608,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"footnotes":""},"categories":[53,52],"tags":[54,42,58,55,57],"_links":{"self":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/605"}],"collection":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/comments?post=605"}],"version-history":[{"count":4,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/605\/revisions"}],"predecessor-version":[{"id":610,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/posts\/605\/revisions\/610"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/media\/608"}],"wp:attachment":[{"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/media?parent=605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/categories?post=605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iseebugs.pl\/index.php\/wp-json\/wp\/v2\/tags?post=605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}