我正在学习Java,并且在列表中使用对象时遇到以下问题。
我创建了一个名为User
的课程。
此类使用构造函数,在创建新对象时需要两个字符串:
String username, String password
我正在练习从用户类创建User对象列表,并编写了以下内容:
public void createAndManipulateListOfUsers(){
List<User> userList = new ArrayList<>();
userList.add(new User("user1","password1"));
userList.add(new User("user2","password2"));
现在假设我想使用indexOf
方法找到其中一个用户对象的索引位置,我怎么办呢,因为我没有命名对象?
我以稍微不同的方式处理相同的情况,在将每个对象添加到列表之前创建并命名每个对象,如下所示:
List<User> userList = new ArrayList<>();
User bob = new User("user1","password1");
User jim = new User("user2","password2");
userlist.add(bob);
userlist.add(jim);
/* because i've given each object a name on creation
i am able to use the objects like this:*/
System.out.println(userList.indexOf(bob));
assertEquals(0,userList.indexOf(bob));
那么有没有办法可以识别我的第一个例子中创建的User
个对象,以便使用indexOf
方法返回索引位置?
答案 0 :(得分:0)
诀窍是indexOf
循环遍历List
并在每个回合使用equals
。
如果您希望它识别List
内的用户,您必须通过覆盖equals
告诉java如何判断针用户是否与列表中的用户相同来自Object
的方法。
请注意,这是出于教育目的,在大多数情况下,您应该创建参考,就像在第二个样本中一样。
您可以在compilejava上尝试此操作:
import java.lang.Math;
import java.util.ArrayList;
import java.util.List;
// one class needs to have a main() method
public class HelloWorld
{
// arguments are passed using the text field below this editor
public static void main(String[] args)
{
List<User> userList = new ArrayList<>();
userList.add(new User("user1","password1"));
userList.add(new User("user2","password2"));
User needle = new User("user2","password2");
System.out.println(userList);
System.out.println(userList.indexOf(needle));
}
}
// you can add other public classes to this editor in any order
public class User
{
private String a;
private String b;
public User(String a, String b) {
this.a = a;
this.b = b;
}
@Override
public boolean equals(Object other){
User otheruser = (User)other;
return (this.a.equals(otheruser.a) && this.b.equals(otheruser.b));
}
}
答案 1 :(得分:0)
这取决于您希望如何识别对象(User
实例)。您给出的示例(您称之为“命名它们”)通过引用(内存中的〜地址)来标识对象。您实际执行的操作是将此引用存储到命名变量,然后使用它来标识User
实例。
识别用户的其他可能方法是:
equals()
方法,表示如果其中某些(或全部)字段相等,则两个User
实例实际上描述了同一用户;然后使用具有相同相关字段的新User
实例进行查询Map<KEY, User>
而不是List<User>
按照某个标识符存储和检索用户 - KEY
以适合您需要的任何类型作为密钥类型(例如String
)