Почему метод hashcode и equals не работает с ArrayList? - PullRequest
0 голосов
/ 11 июля 2019

Если вы запускаете следующий код, hashmap отклоняет дубликат, но ArrayList принимает дубликат.

Почему arraylist также запрещает дубликат, используя методы hashcode () и equals ()?

public class EmpData {

	int Id; 
	String FirstName; 
	String LastName;
		
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((FirstName == null) ? 0 : FirstName.hashCode());
		result = prime * result + Id;
		result = prime * result + ((LastName == null) ? 0 : LastName.hashCode());
		return result;
	}



	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		
		EmpData other = (EmpData) obj;
		if (FirstName == null) {
			if (other.FirstName != null)
				return false;
		} else if (!FirstName.equals(other.FirstName))
			return false;
		if (Id != other.Id)
			return false;
		if (LastName == null) {
			if (other.LastName != null)
				return false;
		} else if (!LastName.equals(other.LastName))
			return false;
		
		return true;
	}

	


	@Override
	public String toString() {
		return "EmpData [Id=" + Id + ", FirstName=" + FirstName + ", LastName=" + LastName + "] \n";
	}



	public EmpData(int id, String firstName, String lastName) {
		Id = id;
		FirstName = firstName;
		LastName = lastName;
	}



	public static void main(String[] args) {
     
		EmpData obj1 = new EmpData(1,"Mk","Jk");
		EmpData obj2 = new EmpData(1,"Mk","Jk");
		
	    Map<EmpData,String> myMap = new HashMap<>(); myMap.put(obj1, "First");
		myMap.put(obj2, "Second");
		 
		System.out.println("Hashmap values are: " + myMap);
		
		ArrayList<EmpData> newArray = new ArrayList<>();
	
		newArray.add(obj1);		
		newArray.add(obj2);
		
		System.out.println("Array values are: " + newArray);
	
	}

}

Приведенный выше код дает следующий вывод:

Hashmap values are: {EmpData [Id=1, FirstName=Mk, LastName=Jk] 
=Second}
Array values are: [EmpData [Id=1, FirstName=Mk, LastName=Jk] 
, EmpData [Id=1, FirstName=Mk, LastName=Jk] 
]

Как я могу заставить Arraylist использовать методы hascode () и equals ()?Это тот случай, когда хэш-код и метод equals используются только с hashmap?

1 Ответ

2 голосов
/ 11 июля 2019

ArrayList использует equals() при вызове таких методов, как int indexOf(Object o) и boolean remove(Object o);, но никогда не использует hashCode() и допускает присутствие дублирующих элементов.

Неважно, если вы переопределите hashCode и equals или нет. Даже если вы добавили obj1 несколько раз к ArrayList, вы получите List с несколькими ссылками на один и тот же объект.

Вы можете использовать HashSet (или LinkedHashSet), если хотите удалить дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...