如何在HashMap中存储特定对象,并将id作为键

时间:2016-04-26 02:45:20

标签: java hashmap software-design

我正在制作一个节目。我将用户存储在ArrayList中,因此我有一个UserCollection类,它充当了用户的存储类。但是看到UserCollection被认为是一个数据库'数据库中的每个用户条目都应具有唯一的ID。最初我有一个userID作为User类中的一个字段,但现在我试图处理UserCollection中的id部分。如果我要使用一个hashmap,其中key是id,那么值是User,我将如何继续迭代id,这样每次将一个新用户存储到hashmap中时,它们的密钥都会从1到n用户数量。我还使用CRUD方法存储/删除/更新用户等。

public class UserCollection{

Map<Integer, User> userMap = new HashMap<Integer,User>();

public User create(User user){
 userMap.put(??,user) // not sure how to iterate the id or what to put in it
 return user;
}

public User read(Integer keyID){
  if(userMap.containsKey(keyID)){
     return userMap.get(keyID); //something definitely wrong
  }
}

//Other remaining CRUD methods after. 

}

最初我只有一个持有用户的ArrayList。但是因为我在数据库中意识到用户将拥有独特的身份,现在我很困惑我将如何处理它们。如果我在HashMap中处理它们,我还需要在User类中有一个userID字段吗?

2 个答案:

答案 0 :(得分:1)

你在这里问了几个问题。我将轮流接受每一个:

  1. 如何确保每个用户都有唯一的ID?
  2. 最简单的方法是使用一个静态字段来跟踪最大的生成ID:

    class User {
        private static int largestID = 0;
        private final int id = largestID++;
    
        public int getID() {
            return id;
        }
        ...
    }
    

    这有效,但有很多问题。只要您存储用户&amp;重启程序,或者想重用id,它需要改变。

    另一种方法是从您的收藏中找到现有客户的最大ID。以下示例代码使用Java 8:

    class UserCollection {
        private final Map<Integer,User> users = new HashMap<>();
    
        public int nextID() {
            return users.keySet().stream()
                .mapToInt(n -> n).max().orElse(-1) + 1;
        }
    }
    

    这样效率很低,但对于很多应用来说可能还不错。

    1. 我是否需要将ID存储在User类中?
    2. 您有两种选择。您可以将其存储在类中,并提供获取ID的机制(如上所述)。或者,您确保处理用户的所有内容都存储并返回ID,而不是对象的引用。这允许该方法的客户端然后使用该ID访问用户。

      这两者都是合法的解决方案。如果您使用第一个(在类中存储ID),那么您应该更改将用户添加到集合中的方法:

      class UserCollection {
          public void addUser(User user) {
              users.put(user.getID(), user);
          }
      }
      

      如果你使用第二个,那么ID字段必须是最终的,因为客户依赖它不会改变。

答案 1 :(得分:0)

您可以执行以下操作以确保您的用户在班级生命周期中拥有唯一ID。

public class UserCollection
{
   private static int id = 0;
   private static final Object lock = new Object();

   private Map<Integer, User> userMap = new HashMap<Integer,User>();

   public User create (User user)
   {
     // only add one user at a time to the map
     synchronized (lock)
     {
        id++;
        userMap.put(id, user);
     }
     return user;
   }

   // Rest of the class
}