使用HashMap是存储具有ID的Object的最简单的解决方案吗?

时间:2016-09-07 23:43:18

标签: java

我在某些代码中有一个类,ChatChannel(省略了一些不必要的代码),我遇到了一些麻烦。

public class ChatChannel {

    private static HashMap<String, ChatChannel> registeredChannels = new HashMap<>(); // ChannelID, ChatChannel Object

    public static void registerChannel(ChatChannel channel) {
        registeredChannels.put(channel.getId(), channel);
    }

    public static ChatChannel getChannelById(String id) {
        return registeredChannels.getOrDefault(id, null);
    }

    /** The actual ChatChannel item is defined BELOW THIS LINE **/

    private String name;
    private String id;

    public ChatChannel(String name, String id) {
        this.name = name;
        this.id = id;
    }

    public static String getId() {
        return id;
    }
}

基本上,这个课程允许我将用户发送的消息分开到&#34;频道。&#34;用户只能在加入的频道中接收消息,并且只能向其活动频道发送消息。应使用其ID(例如global)访问频道。

但是,我的问题是我不知道是否应该使用HashMapCollection来保持代码轻松简单。理想情况下,我希望能够在代码中的任何位置通过ChatChannel引用任何id,因此我不需要经常传递这些ChatChannels }。如果有的话,使用HashMap(和外部ID)的性能提升是多少?它是否大致等于使用Collection然后使用我的getId()方法迭代它?如果是这样,那被认为是'#34;正确&#34;爪哇?

2 个答案:

答案 0 :(得分:1)

回答上述问题“我应该使用HashMap或集合来提高性能吗?” - 在这种意义上你不能也不会使用“Collection”,因为Collection是一个抽象概念,在Java中表示为接口

集合可以是列表,地图或集合等。您可以编写一个方法,例如接受(任何类型)Collection,并对Collection中的所有内容执行操作,但在这种情况下,必须决定在您的实现中使用的集合。

由于您正在检索给定标识符String的通道,因此Map是一个有用的选择,因为它是一个键值映射;你不必遍历它来找到具有所需键的元素。

您通常应该一般地声明事物,然后使用特定实现实例化它们。也就是说,在代码中使用它时,你不关心它是什么类型的Map,只是它是一个Map。您分配的实际地图可能是HashMapLinkedHashMapTreeMap - 因为维护广告订单或保持排序似乎不是在这里,平原HashMap似乎是合适的。

private static Map<String, ChatChannel> registeredChannels = new HashMap<>();
//             ^^^ generic declarat   |  specific implementation ^^^^

您可能也知道可能有多少频道,或者至少是起始频道集的大小,因此您也可以考虑initialCapacityloadFactor参数构造函数,例如

// Allocate with room for 10 initial channels, expand the map size when 75% full
private static Map<String, ChatChannel> registeredChannels =
        new HashMap<>(10, 0.75);

答案 1 :(得分:0)

很可能你有连续范围内的ID ..比如1,2,3,4 ......或110,111,112,113,114 ......可能还有一些洞。然后很容易将这些序列散列到像0,1,2,3,4 ......这样的序列。
现在你可以使用超快速的纯数组(!)。数字0..n映射到数组中的索引,访问速度不能更快。索引包含指向会话数据的指针 基本上,数组是地图。键是索引号,值是它包含或指向的值。