【发布时间】:2018-05-10 15:38:41
【问题描述】:
好的,所以我的问题很简单。我搜索了 StackOverFlow、google 和 JavaDocs 高低,但似乎找不到我的具体问题的答案。
据我了解(这里归结为基础知识),每个对象都有一个 hashCode() 作为唯一标识符。我们将以此为例...
class Team {
public Team(String teamName){teamName.this = teamName;}
String teamName;
}
class NBALeague {
ArrayList<Team> teamsInALeague = new ArrayList<>();
teamsInALeague.add(new Team("Rockets"));
teamsInALeague.add(new Team("Warriors"));
teamsInALeague.add(new Team("Cavaliers"));
teamsInALeague.add(new Team("76ers"));
//each unique team when instantiated is assigned a hashCode!
//now when I change the objects (or add to them rather) they are then
//each given a new hashCode()
public void buildASchedule(){
Team rockets = teamsInALeague.get(0);
Team warriors= teamsInALeague.get(1);
Team cavaliers= teamsInALeague.get(2);
Team philly= teamsInALeague.get(3);
String definingString = "This Team is Called: ";
ArrayList anotherArrayList = new ArrayList();
anotherArrayList.add(definingString + rockets.teamName);
//Moving an object from one array list to another doesnt affect
//its hashcode(), but adding a string to the object does
既然anotherArrayList.get(0) 有了一个全新的哈希码,我该如何覆盖它?
我知道我必须重写 hashcode() 和 equals() 方法,以确保在放入 HashSet 时,该集合可以识别重复项,但是因为这些新的哈希码是在向对象添加字符串时生成的我不知道如何覆盖哈希码。通常我会通过 Team 类覆盖这两种方法,但同样不会因为更改对象创建新的哈希码而起作用。请有人帮忙!!!
【问题讨论】:
-
你通过扩展类来覆盖方法
-
好吧,即使我扩展了类,我也无法使用 override 方法来定位特定的连接项......如果你能给我看一个很棒的例子!非常感谢!
-
哈希码的默认实现会为同一个对象返回相同的哈希值。如果 ojbect 有一个 String 字段并且您填充了该字段,则哈希仍然是相同的。如果您看到它发生了变化,那是因为它正在创建一个不同的对象。
-
"每个对象都有一个 hashCode() 作为唯一标识符" 不。它不是唯一的 ID。它是一个整数,所以大约有 50 亿种可能性,但 you don't actually need very many objects to be fairly certain of a collision。
-
嗯......很好的解释......好吧,也许我的例子对于我的实际问题来说过于简化了。让我们假设“teamName”字段不存在。如果一个对象连接到另一个对象以形成一个 arrayList 项(例如,如果我采用:anotherArrayList.add(rockets + Warriors); 并创建一个新的 hashcode(),我将如何覆盖这个新的具体的哈希码?
标签: java overriding equals hashset hashcode