Java:比较具有相同属性但不指向内存中相同点的相同对象
我有一个自定义适配器,如下所示:Java:比较具有相同属性但不指向内存中相同点的相同对象,java,android,object,compare,Java,Android,Object,Compare,我有一个自定义适配器,如下所示: private List<User> items = new ArrayList<>(); private Context context; public UserSpinnerAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<User> objects) { super(context, resource,
private List<User> items = new ArrayList<>();
private Context context;
public UserSpinnerAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull
List<User> objects) {
super(context, resource, objects);
this.items = objects;
this.context = context;
}
private List items=new ArrayList();
私人语境;
public UserSpinnerAdapter(@NonNull上下文,@LayoutRes int-resource,@NonNull
列出对象){
超级(上下文、资源、对象);
此项=对象;
this.context=上下文;
}
当我想找到从web api获取的对象用户的位置时,public int getPosition(@Nullable User item)
的结果总是-1。我想这是因为我传递给适配器的项不仅与适配器用户列表中的内容相同,尽管所有内容都相同,但指向另一个内存点
那么,我如何比较两个具有相同属性但实际分离的对象呢?您应该为
用户
对象实现一个等于
/哈希代码
,您应该为用户
对象实现一个等于
哈希代码
,您应该覆盖它等于比较对象的方法。您可以在类中按Alt+Insert
,然后选择equals()和hashCode()
,轻松完成此操作。例如,如果您的类有另一个自定义类型的字段
public class User {
...
private Location location;
...
}
您还必须为Location实现equals
/hashCode
,您应该为比较的对象重写equals
/hashCode
方法。您可以在类中按Alt+Insert
,然后选择equals()和hashCode()
,轻松完成此操作。例如,如果您的类有另一个自定义类型的字段
public class User {
...
private Location location;
...
}
您还必须为Location实现equals
/hashCode
,谢谢,但是它不需要覆盖hashCode,只需要equals()@Kenji就可以了;但是当重写equals时,您应该始终重写hashCode。谢谢,但是它在不重写hashCode的情况下工作,并且只使用equals()@Kenji,它会;但是当重写equals时,您应该总是重写hashCode。它也很有用。你说的位置是什么意思?@Kenji,这只是个例子。我的意思是,如果您的类User
具有自定义字段类型(例如Location
),并且您没有将equals
/hashCode
实现为Location
,那么您将得到User
的非相等对象,即使通过引用比较Location
,所有字段都是相等的。这也很有用。你说的位置是什么意思?@Kenji,这只是个例子。我的意思是,如果您的类User
具有自定义字段类型(例如Location
),并且您没有将equals
/hashCode
实现为Location
,那么您将得到User
的非相等对象,即使通过引用比较Location
,所有字段都是相等的。