И далее, ты эту реализацию сломал своими мутабельными ключами. В списке теперь лежит ключ, у которого хеш не соответствует списку. Естественно, мапа не найдет по этому ключу ничего, тк будет искать в другом списке(бакете).
Бакеты не хранят одинаковые по хешу ключи, они хранят ключи с хешами, одинаковыми по модулю количества бакетов.
static final int hash(Object key){
int h;
return (key == null)? 0 : (h = hey.hashCode())^(h>>>16);
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Person List</title>
<link rel="stylesheet" type="text/css" th:href="@{/css/style.css}"/>
</head>
<body>
<h1>Person List</h1>
<a href="addPerson">Add Person</a>
<br/><br/>
<div>
<table border="1">
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
<tr th:each ="person : ${persons}">
<td th:utext="${person.firstName}">...</td>
<td th:utext="${person.lastName}">...</td>
</tr>
</table>
</div>
</body>
</html>