java如何重写特定arrayList项的hashcode()和equals()

java如何重写特定arrayList项的hashcode()和equals(),java,overriding,equals,hashset,hashcode,Java,Overriding,Equals,Hashset,Hashcode,我的问题很简单。我上下搜索了StackOverFlow、google和JavaDocs,但似乎找不到我具体问题的答案 据我所知(这里将其归结为基本内容),每个对象都会获得一个hashCode()作为唯一标识符。我们将以此为例 class Team { public Team(String teamName){teamName.this = teamName;} String teamName; } class NBALeague {

我的问题很简单。我上下搜索了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
班级团队{
公共团队(字符串teamName){teamName.this=teamName;}
字符串组名;
}
NBALeague类{
ArrayList teamsInALeague=新的ArrayList();
增加(新球队(“火箭”);
添加(新团队(“勇士”);
增加(新队伍(“骑士”);
增加(新球队(“76人”);
//实例化时,为每个唯一的团队分配一个hashCode!
//现在,当我更改对象(或者添加到对象中)时,它们是
//每个给定一个新的hashCode()
public void buildASchedule(){
火箭队=teamsInALeague.get(0);
团队战士=团队战士。获取(1);
骑士队=teamsinalague.get(2);
费城队=teamsInALeague.get(3);
String definingString=“这个团队被称为:”;
ArrayList anotherArrayList=新建ArrayList();
另一个数组列表.add(定义字符串+火箭队.teamName);
//将对象从一个数组列表移动到另一个数组列表不会影响
//它的hashcode(),但向对象添加字符串会
既然
另一个arraylist.get(0)
有了一个全新的hashcode,我该如何重写它


我知道我必须重写
hashcode()
equals()
method,以确保在放入HashSet时,该集合可以识别重复项,但由于这些新的hashcode是在向对象添加字符串时生成的,因此我不知道如何重写hashcode。通常,我会通过Team类重写这两个方法,但这同样不起作用,因为更改对象会创建新的hashcode.请帮帮我!!!

你似乎有两个误解:hashCode实际上是什么,以及
+
操作符是如何工作的

我将首先讨论后一个问题。除了赋值(
=
)之外,在对象上应用运算符时,它不会以任何方式更改对象

anotherArrayList.add(definingString + rockets.teamName);
不会以任何方式更改或影响
rockets
变量。它不会“更改hashCode”或任何其他内容,它只是复制
rockets.teamName
的值,将其与其他内容连接,并创建一个全新的对象。而该全新对象将是一个字符串,因此您无论如何都无法将其添加到列表中

现在,关于hashCode。对象没有“分配hashCode”或类似的内容。hashCode()没有什么特别的、神奇的或自动的,它只是一个返回整数的方法。它返回您告诉它返回的内容,如果不重写它,默认实现将返回一个给定对象的从不更改的数字

如果用另一个对象替换该对象,例如,将另一个
Team
放在列表中的该位置,则该对象将有其自己的hashCode,该hashCode可能与第一个不同。但只需使用该对象或其某个字段即可
不会以任何方式影响它。

您可以通过扩展类来覆盖方法。即使我扩展了类,我也无法使用覆盖方法针对特定的连接项……如果您能给我一个非常好的示例!非常感谢!哈希代码的默认实现将为t返回相同的哈希值相同的对象。如果ojbect有一个字符串字段,而您填充了该字段,则哈希值仍然相同。如果您看到它发生了变化,那是因为它是一个不同的正在创建的对象。“每个对象都获得一个hashCode()作为唯一标识符”不。它不是唯一的ID。它是一个整数,所以有大约50亿个可能性。嗯…很好的解释…好的,也许我的例子对于我的实际问题来说太简单了。让我们假设“teamName”字段不存在。如果一个对象连接到另一个对象,形成一个arrayList项(例如,如果我采用:anotherArrayList.add(rockets+warriors);这将创建一个新的hashcode(),我将如何覆盖新的特定hashcode?新建编辑:ArrayList anotherArrayList=new arrarylist();anotherArrayList.add(definingString+rockets.teamName);如前所述,这不会更改原始值。但它确实创建了一个新对象,它是一个组合字符串。现在让我们假设我想将这个新字符串放入哈希集中,并且我想确保没有两个字符串出现两次。我意识到我必须重写hashcode()和equals()方法,但由于这些是非团队对象的新字符串,我会在NBA Leagues类中重写这些方法吗?如果是,有人能举个例子吗