使用未命名的对象

时间:2017-04-05 09:12:13

标签: java oop

我正在学习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方法返回索引位置?

2 个答案:

答案 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