Pure Java – 73 Generics & Collections – Map – 01

Merhaba Arkadaslar,
Bu bolumde java.util.Map arabirini ve bu arabimini uygulayan java.util.HashMap , java.util.Hashtable , java.util.LinkedHashMap siniflarini inceleyecegiz. Hatirlayacagimiz gibi Map , key/value mantigina gore calismaktadir. Key unique/essiz olmalidir value ise duplicate olabilir.

Basit bir ornek ile baslayalim. HashMap’e put metodunu kullanarak eleman ekleyebiliriz. put metodunda key/value parametreleri alir.
HashMap unordered ve unsorted bir yapiya sahiptir , HashMap index based yapida calismaz.
Map’in elemanlarini dondurmek icin keySet metodunu kullanabiliriz. Diger kullanimlari da inceleyecegiz.

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

public class HashMapTest {

	public static void main(String[] args) {
		Map map = new HashMap();

		map.put(1, "one");
		//Map'lere eleman eklemek icin put metodunu kullaniriz.
		map.put(2, "two");
		map.put(3, "three");
		map.put(4, "four");
		map.put("mykey", "myvalue");

		for (Object key : map.keySet()) {
			System.out.println("key:" + key + " value:" + map.get(key));
		}
	}
}

HashMap’in diger metotlarini inceleyelim. HashMap’te isEmpty , size , containsKey , containsValue , remove , clear metotlarini kullanabiliriz. get metodu List’teki gibi calismaz. get metoduna ilgili key verilir ve geriye value dondurur. HashMap index based bir yapiya sahip degildir.

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

public class HashMapMethodTest {

	public static void main(String[] args) {
		Map<Integer, String> myMap = new HashMap<Integer, String>();

		boolean isEmpty = myMap.isEmpty();
		int size = myMap.size();

		System.out.println("isEmpty:" + isEmpty);
		System.out.println("size:" + size);

		myMap.put(10, "test1");
		myMap.put(20, "test2");
		myMap.put(30, "test3");
		myMap.put(40, "test4");

		String value = myMap.get(20);
		// get metodune key verip value aliyoruz. 
		System.out.println("value:" + value);

		boolean containsKey = myMap.containsKey(10);
		// key'i 10 olan eleman var mi ?
		System.out.println("containsKey 10 : " + containsKey);

		boolean containsValue = myMap.containsValue("test1");
		// value test1 olan elaman var mi ?

		System.out.println("containsValue test1 : " + containsValue);

		myMap.remove(10);
		// key'i 10 olan elamani sil.

		containsKey = myMap.containsKey(10);
		System.out.println("containsKey 10 : " + containsKey);

		containsValue = myMap.containsValue("test1");
		System.out.println("containsValue test1 : " + containsValue);

		isEmpty = myMap.isEmpty();
		size = myMap.size();

		System.out.println("isEmpty:" + isEmpty);
		System.out.println("size:" + size);

		myMap.clear();
		// clear metodu tum Map'teki elemanlari siler.

		isEmpty = myMap.isEmpty();
		size = myMap.size();

		System.out.println("isEmpty:" + isEmpty);
		System.out.println("size:" + size);

	}
}

Map yapisinda , key unique/essiz/tek olmalidir , duplicate izin verilmez. Ayni key’e sahip eleman eklendiginde eski elemani override eder. Key farkli olduktan sonra value duplicate olabilir.

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

public class HashMapDuplicate {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();

		map.put("key1", "value1");
		map.put("key1", "new value1");
		// key unique olmalidir. Ayni key'e sahip eleman eklendiginde eski
		// elemani override eder.

		map.put("key2", "value1");
		map.put("key2", "new value1");
		// key farkli olduktan sonra value ayni olabilir.

		for (String key : map.keySet())
		{
			System.out.println(key + " " + map.get(key));
		}

	}
}

java.util.LinkedHashMap , ordered yapiya sahiptir;

import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapTest {

	public static void main(String[] args) {
		Map<String, String> linkedMap = new LinkedHashMap<String, String>();
		// LinkedHashMap , ekleme sirasina gore calisir. LinkedHashMap ordered
		// yapidadir.
		linkedMap.put("key1", "value1");
		linkedMap.put("key2", "value2");
		linkedMap.put("key3", "value3");
		linkedMap.put("key4", "value4");

		for (String key : linkedMap.keySet()) {
			System.out.println(key + " " + linkedMap.get(key));
			// ordered
		}
	}

}

HashMap null key degerine ve null value degerlere sahip olabilir. Hashtable ise null key veya null degerlere sahip olamaz.

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

public class NullKeyAndValues {

	public static void main(String[] args) {
		Map hashMap = new HashMap();

		hashMap.put(null, null);
		// HashMap e null key veya null value olabilir.

		Map hashtable = new Hashtable();
		hashtable.put(null, null);
		// Hashtable null key veya null value eklenemez.
		// calisma zamaninda hata verecektir.
		// java.lang.NullPointerException

	}
}

String ya da Wrapper tipteki elemanlar ile calistigimiz durumda isin icine equals ve hashCode metotlari girmektedir. Aciklamalari kod icerisinde bulabilirsiniz. Ornegi anlayamiyorsaniz oncesinde equals ve hashCode’u tekrar etmekte fayda var. Unutmayalim Map icerisinde elemanin bulunmasi 2 asamalidir

  • once ilgili bucket bulunur(hashCode’a bakilir)
  • sonrasinda equals a bakilir.
import java.util.HashMap;
import java.util.Map;

class Animal {

}

class Dog {
	String name;
	int age;

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Dog other = (Dog) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public Dog(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}

class Car {
	public Car(String hp, String brand, Integer price) {
		super();
		this.hp = hp;
		this.brand = brand;
		this.price = price;
	}

	String hp;
	String brand;
	Integer price;

	@Override
	public int hashCode() {
		return brand.length();
	}

	// hashCode olarak bu metot kullanildiginda brand degisirse ilgili elemana
	// ulasamayiz.

	// @Override
	// public int hashCode() {
	// return 10;
	// }
	// hashCode olarak bu metot kullanildiginda brand degisse de ilgili elemana
	// ulasilabilir.Cunku hashCode degeri degismemekte.

	// Map mantiginda elemanlarin bulunmasi icin once hashCode degerine bakilir.
	// Sonrasinda equals a bakilir.

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Car other = (Car) obj;
		if (brand == null) {
			if (other.brand != null)
				return false;
		} else if (!brand.equals(other.brand))
			return false;
		if (hp == null) {
			if (other.hp != null)
				return false;
		} else if (!hp.equals(other.hp))
			return false;
		if (price == null) {
			if (other.price != null)
				return false;
		} else if (!price.equals(other.price))
			return false;
		return true;
	}

}

public class HashMapReferenceType {

	public static void main(String[] args) {

		Animal animal = new Animal();
		Animal animal2 = new Animal();

		Map animalMap = new HashMap();
		animalMap.put(animal, "animal value");

		System.out.println("animal : " + animalMap.get(animal2));
		// animal2.hashCode() == animal.hashCode() false oldugu icin ve
		// animal2.equals(animal) false oldugu icin null deger donecektir.

		Dog dog = new Dog("dog1", 5);
		Dog dog2 = new Dog("dog1", 5);

		Map dogMap = new HashMap();
		dogMap.put(dog, "dog value1");

		// dog.equals(dog2); true
		// dog.hashCode() == dog2.hashCode() false oldugu durumda elemani
		// bulamaz
		System.out.println("dog :" + dogMap.get(dog2));

		Car car = new Car("50", "ford", 100);

		Map hashMap = new HashMap();
		hashMap.put(car, "value1");

		System.out.println(hashMap.get(car));

		car.brand = "bmw";
		System.out.println(hashMap.get(car));

	}
}

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *