Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по собственному ключу(key) в HashMap. (equals?) / 4 сообщений из 4, страница 1 из 1
03.04.2006, 01:31
    #33640043
sysmanx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по собственному ключу(key) в HashMap. (equals?)
Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.util.*;

public class TMain {

	public static class TT{
		String s;
		public TT(String s){
			this.s=s;
		}
		public boolean equals(Object obj){
			return s==((TT)obj).s;
		}
		
	};
	
	public static void main(String argv[]) {
		Map x= new HashMap();
		x.put(new TT("s"),"1231");
		System.out.println((String)x.get(new TT("s")));
	}
}

В консоли:
Код: plaintext
1.
null

В чём я ошибаюсь? Вроде в доках по интерфейсу Map написано что ключь сравнивается по методу equals, но в HashMap нечего такого ненашол.
...
Рейтинг: 0 / 0
03.04.2006, 08:19
    #33640137
ponomarevvb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по собственному ключу(key) в HashMap. (equals?)
Правильно, по методу equals (кроме карты IdentityHashMap). Но вот так:
Код: plaintext
1.
 return  s==((TT)obj).s;
сравнивать нельзя, уже много раз обсуждалось. Точнее, можно, но так сравнивается не содержимое строк, а ссылок на них. Правильно так (предварительно проверив на null ;-) ):
Код: plaintext
1.
 return  s.equals(((TT)obj).s);
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
03.04.2006, 09:50
    #33640262
Поиск по собственному ключу(key) в HashMap. (equals?)
Нужно переопределить метод hashCode.
Стандартная реализация возвращает разные значения. В итоге получается несуразная ситуация, когда два экземпляра равны по equals, но имеют разные hashCode. Поэтому одновременно с реализацией equals всегда нужно реализовать и hashCode.

Это имеет прямое отношение к HashMap. Он сначала ищет по хеш-значению (которое формируется на основе hashCode), а потом уже из отобранных объектов - по equals. В итоге, без правильной реализации hashCode более вероятно, что он просто ничего не найдет ( но может и найти, это уже как повезет с хеш-значением ).

Простейшая (но и самая не эффективная) реализация:
Код: plaintext
1.
2.
3.
public int hashCode () {
    return  0 ;
}

Реализация equals у вас тоже неправильная. Вот как надо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public boolean equals (Object o) {
    if (o == null || !(o instanceof TT)) {
        return false;
    }
    TT t = (TT) o;
    return s == t.s || (s != null && s.equals(t.s));
}

Почитайте любую книжку по основам Java - там это все расписано.
Сравнение объектов: теория
...
Рейтинг: 0 / 0
03.04.2006, 11:03
    #33640511
sysmanx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по собственному ключу(key) в HashMap. (equals?)
to ponomarevvb:
Да мне стыдно :) за такую глупую оплошность(return s==((TT)obj).s;). Но при реализации s.equals(((TT)obj).s); всеравно неработает.

to Ненавижу регистрацию:
Спасибо. Действительно перегрузил hashCode и заработало!. Получается что если не перегрузить , то работает hashCode от адреса объекта(Object).
Код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
import java.util.*;

public class TMain4 {

	public static class TT{
		String s;
		public TT(String s){
			this.s=s;
		}
		public boolean equals(Object obj){
			return s.equals(((TT)obj).s);
		}
		public int hashCode(){
			return s.hashCode();
		} 
		
	};
	
	public static void main(String argv[]) {
		HashMap x= new HashMap();
		TT c=new TT("s");
		x.put(c,"1231");
		TT d=new TT("s");
		System.out.println(c.hashCode());
		System.out.println(d.hashCode());
		System.out.println((String)x.get(d));
		

	}
}

На консоли:
Код: plaintext
1.
2.
115
115
1231
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по собственному ключу(key) в HashMap. (equals?) / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]