#wrapper etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
#wrapper etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

25 Ağustos 2020 Salı

Avoid Creating Unnecessary Objects

Merhaba,

Bu yazimda Effective Java kitabindaki Avoid Creating Unnecessary Objects maddesindeki bir ornekten bahsedecegim. Java da Autoboxing - Unboxing kavramlari


Yapacagimiz islem tum integerlari toplayan bir kod yazmak. Sum'i long olarak tanimladik cunku int deger toplamin sonucunu tutmak icin kucuk kaliyor.

private static long sum() { 
Long sum = 0L;
 for (long i = 0; i <= Integer.MAX_VALUE; i++) 
    sum += i;
return sum;
}

Bu kodu calistirdigimizda sorunsuz calisiyor. Benim bilgisayarimda 8 saniyede calisti.


Bir de sum degerini Long degil de long olarak calistirmayi denedim. Bu durumda ise 1 saniye surdu.

Buradan cikarilacak ders sudur:


Prefer primitives to boxed primitives, and watch out for unintentional autoboxing


Yani diyorki boxed primitive yerine primivite tercih edin.

Boxed olanlar wrapper classlaridir. Onlari kullanmak her zaman gerekli olmayabilir.


Autoboxing Ornegi:


int olan primitive bir degeri Integer Wrapper class olan ArrayList te tutmak

private static List<Integer> sum() { 
List<Integer> list = new ArrayList<>();
 for (int i = 0; i <= 10; i++) 
    list.add(i);
return list;
}


30 Kasım 2019 Cumartesi

Java - equals() ve hashCode() Methodları

Bu yazimda equals() ve hashCode() methodlarinin ne ise yaradigini gorecegiz. Oncelikle asagidaki ornek uzerinden gidelim.

import java.util.HashMap;
import java.util.Map;
public class Example {
 public static void main(String[] args) {
  Person p1 = new Person(1);
  Person p2 = new Person(1);

  Map<Person, String> pMap = new HashMap<Person, String>();
  pMap.put(p1, "Jon");
  pMap.put(p2, "Jon");
  
  System.out.println(pMap.size());
  
  Integer i1 = new Integer(1);
  Integer i2 = new Integer(1);
  Map<Integer, String> iMap = new HashMap<Integer, String>();
  
  iMap.put(i1, "1");
  iMap.put(i2, "1");
  
  System.out.println(iMap.size());
 }
}

class Person{
 int id;
 
 public Person(int id) {
  this.id = id;
 }
}

Ornegimizi aciklamaya calisalim. Person adinda id si olan bir classimiz var. Ve ben main classimda bir ayni id li iki ayri Person objesi olusturuyorum ve bunlari map e ekliyorum, soru ise map in size i nedir.

Ayni seyi Integer icin de yapiyoruz. Ayni degerli iki ayri integer objesi olusturuyoruz ve bir map olusturup bu iki integer i ekliyoruz. Ikisi de ayni degeri iceriyor. Ayni sekilde size i print ettiryoruz.

Sonucun ne olmasini bekleriz.

Output:
2
1

Yani person Map te ayni degeri icermesine ragmen size 2 dondu ama integer map te ayni degeri icerdigi icin 1 dondu. Bu nasil oldu.


Aciklama

Integer bir Wrapper class ve icerisinde hashCode ve equals metodlari tanimli olarak geliyor. O yuzden hashCode ve equals methodlari calistigi icin ayni degeri yeniden eklememize izin vermedi.

Ama Person classini biz yazdik ve icinde hashCode ve equals methodlari yok. Bu yuzden de bir kontrol yapmadi ve ayni degerleri ekleyebildik. Olmasi gereken once hashCode degerleri esit mi diye bakacak esitse equals methodu ile contentleri esit mi diye bakacak.

O yuzden Person classina hashCode() ve equals() methodlarini ekleyelim. Istersek kendimiz yazabiliriz istersek IDE den implement edebiliriz.

package com.examples;

import java.util.HashMap;
import java.util.Map;

public class Example {

 public static void main(String[] args) {
  Person p1 = new Person(1);
  Person p2 = new Person(1);
  
  Map pMap = new HashMap();
  pMap.put(p1, "Jon");
  pMap.put(p2, "Jon");
  
  System.out.println(pMap.size());
  
  Integer i1 = new Integer(1);
  Integer i2 = new Integer(1);
  Map iMap = new HashMap();
  
  iMap.put(i1, "1");
  iMap.put(i2, "1");
  
  System.out.println(iMap.size());
 }
}

class Person{
 int id;
 
 public Person(int id) {
  this.id = id;
 }
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + id;
  return result;
 }
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  Person other = (Person) obj;
  if (id != other.id)
   return false;
  return true;
 } 
}

Bu durumda output ikisi icinde 1 olacak. hashCode ve equals methodlari sayesinde ayni degeri eklememize izin vermeyecek.