powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по собственному ключу(key) в HashMap. (equals?)
4 сообщений из 4, страница 1 из 1
Поиск по собственному ключу(key) в HashMap. (equals?)
    #33640043
sysmanx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код:
Код: 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
Поиск по собственному ключу(key) в HashMap. (equals?)
    #33640137
ponomarevvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно, по методу equals (кроме карты IdentityHashMap). Но вот так:
Код: plaintext
1.
 return  s==((TT)obj).s;
сравнивать нельзя, уже много раз обсуждалось. Точнее, можно, но так сравнивается не содержимое строк, а ссылок на них. Правильно так (предварительно проверив на null ;-) ):
Код: plaintext
1.
 return  s.equals(((TT)obj).s);
--С уважением, ponomarevvb--
...
Рейтинг: 0 / 0
Поиск по собственному ключу(key) в HashMap. (equals?)
    #33640262
Нужно переопределить метод 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
Поиск по собственному ключу(key) в HashMap. (equals?)
    #33640511
sysmanx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск по собственному ключу(key) в HashMap. (equals?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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