我在某些代码中有一个类,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
)访问频道。
但是,我的问题是我不知道是否应该使用HashMap
或Collection
来保持代码轻松简单。理想情况下,我希望能够在代码中的任何位置通过ChatChannel
引用任何id
,因此我不需要经常传递这些ChatChannels
}。如果有的话,使用HashMap
(和外部ID)的性能提升是多少?它是否大致等于使用Collection然后使用我的getId()
方法迭代它?如果是这样,那被认为是'#34;正确&#34;爪哇?
答案 0 :(得分:1)
回答上述问题“我应该使用HashMap或集合来提高性能吗?” - 在这种意义上你不能也不会使用“Collection”,因为Collection是一个抽象概念,在Java中表示为接口。
集合可以是列表,地图或集合等。您可以编写一个方法,例如接受(任何类型)Collection,并对Collection中的所有内容执行操作,但在这种情况下,必须决定在您的实现中使用的种集合。
由于您正在检索给定标识符String的通道,因此Map是一个有用的选择,因为它是一个键值映射;你不必遍历它来找到具有所需键的元素。
您通常应该一般地声明事物,然后使用特定实现实例化它们。也就是说,在代码中使用它时,你不关心它是什么类型的Map,只是它是一个Map。您分配的实际地图可能是HashMap
或LinkedHashMap
或TreeMap
- 因为维护广告订单或保持排序似乎不是在这里,平原HashMap
似乎是合适的。
private static Map<String, ChatChannel> registeredChannels = new HashMap<>();
// ^^^ generic declarat | specific implementation ^^^^
您可能也知道可能有多少频道,或者至少是起始频道集的大小,因此您也可以考虑initialCapacity
和loadFactor
参数构造函数,例如
// 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映射到数组中的索引,访问速度不能更快。索引包含指向会话数据的指针
基本上,数组是地图。键是索引号,值是它包含或指向的值。