Java 何时使用多个链接的哈希映射与元组值类型的哈希映射
我目前有一个解决方案,使用两个哈希映射和匹配的键将值链接在一起(即键:前缀长度,值:子网掩码/可用地址数) 这里是否存在一个重要的设计问题?使用元组值类型将这些hashmap合并在一起会更好吗?这会增加两个简单映射的复杂性吗类似的问题给出了两种选择,但似乎没有给出何时使用其中一种而不是另一种的场景 以下实施示例:Java 何时使用多个链接的哈希映射与元组值类型的哈希映射,java,android,hashmap,Java,Android,Hashmap,我目前有一个解决方案,使用两个哈希映射和匹配的键将值链接在一起(即键:前缀长度,值:子网掩码/可用地址数) 这里是否存在一个重要的设计问题?使用元组值类型将这些hashmap合并在一起会更好吗?这会增加两个简单映射的复杂性吗类似的问题给出了两种选择,但似乎没有给出何时使用其中一种而不是另一种的场景 以下实施示例: private static HashMap<Integer, Integer> prefixAndNumberOfAddresses; private static Ha
private static HashMap<Integer, Integer> prefixAndNumberOfAddresses;
private static HashMap<Integer, String> prefixAndSubnets;
static {
prefixAndNumberOfAddresses = new HashMap<Integer, Integer>();
prefixAndNumberOfAddresses.put(8, 16777214);
prefixAndNumberOfAddresses.put(9, 8388606);
prefixAndNumberOfAddresses.put(10, 4194302);
prefixAndNumberOfAddresses.put(11, 2097150);
prefixAndNumberOfAddresses.put(12, 1048574);
prefixAndNumberOfAddresses.put(13, 524286);
prefixAndNumberOfAddresses.put(14, 262142);
prefixAndNumberOfAddresses.put(15, 131070);
prefixAndNumberOfAddresses.put(16, 65534);
prefixAndNumberOfAddresses.put(17, 32766);
prefixAndNumberOfAddresses.put(18, 16382);
prefixAndNumberOfAddresses.put(19, 8190);
prefixAndNumberOfAddresses.put(20, 4094);
prefixAndNumberOfAddresses.put(21, 2046);
prefixAndNumberOfAddresses.put(22, 1022);
prefixAndNumberOfAddresses.put(23, 510);
prefixAndNumberOfAddresses.put(24, 254);
prefixAndNumberOfAddresses.put(25, 126);
prefixAndNumberOfAddresses.put(26, 62);
prefixAndNumberOfAddresses.put(27, 30);
prefixAndNumberOfAddresses.put(28, 14);
prefixAndNumberOfAddresses.put(29, 6);
prefixAndNumberOfAddresses.put(30, 2);
}
static {
prefixAndSubnets = new HashMap<Integer, String>();
prefixAndSubnets.put(8, "255.0.0.0");
prefixAndSubnets.put(9, "255.128.0.0");
prefixAndSubnets.put(10, "255.192.0.0");
prefixAndSubnets.put(11, "255.224.0.0");
prefixAndSubnets.put(12, "255.240.0.0");
prefixAndSubnets.put(13, "255.248.0.0");
prefixAndSubnets.put(14, "255.252.0.0");
prefixAndSubnets.put(15, "255.254.0.0");
prefixAndSubnets.put(16, "255.255.0.0");
prefixAndSubnets.put(17, "255.255.128.0");
prefixAndSubnets.put(18, "255.255.192.0");
prefixAndSubnets.put(19, "255.255.224.0");
prefixAndSubnets.put(20, "255.255.240.0");
prefixAndSubnets.put(21, "255.255.248.0");
prefixAndSubnets.put(22, "255.255.252.0");
prefixAndSubnets.put(23, "255.255.254.0");
prefixAndSubnets.put(24, "255.255.255.0");
prefixAndSubnets.put(25, "255.255.255.128");
prefixAndSubnets.put(26, "255.255.255.192");
prefixAndSubnets.put(27, "255.255.255.224");
prefixAndSubnets.put(28, "255.255.255.240");
prefixAndSubnets.put(29, "255.255.255.248");
prefixAndSubnets.put(30, "255.255.255.252");
}
私有静态HashMap前缀和numberOfAddresses;
专用静态哈希映射前缀和子网;
静止的{
prefixAndNumberOfAddresses=新HashMap();
前缀和numberOfAddresses.put(816777214);
prefixAndNumberOfAddresses.put(98388606);
前缀和numberOfAddresses.put(104194302);
前缀和numberOfAddresses.put(112097150);
前缀和numberOfAddresses.put(121048574);
前缀和numberOfAddresses.put(13524286);
前缀和numberofAddresses.put(14262142);
前缀和numberOfAddresses.put(1513070);
前缀和numberOfAddresses.put(1665534);
前缀和numberOfAddresses.put(1732766);
前缀和numberofAddresses.put(1816382);
前缀和numberofAddresses.put(198190);
前缀和numberofAddresses.put(204094);
前缀和numberofAddresses.put(212046);
前缀和numberofAddresses.put(221022);
前缀和numberOfAddresses.put(23510);
前缀和numberOfAddresses.put(24254);
前缀和numberOfAddresses.put(25126);
前缀和numberofAddresses.put(26,62);
前缀和numberofAddresses.put(27,30);
前缀和numberOfAddresses.put(28,14);
前缀和numberofAddresses.put(29,6);
前缀和numberofAddresses.put(30,2);
}
静止的{
prefixAndSubnets=新HashMap();
前缀和子网。put(8,“255.0.0.0”);
前缀和子网。put(9,“255.128.0.0”);
前缀和子网。put(10,“255.192.0.0”);
前缀和子网。put(11,“255.224.0.0”);
前缀和子网。put(12,“255.240.0.0”);
前缀和子网。put(13,“255.248.0.0”);
前缀和子网。put(14,“255.252.0.0”);
前缀和子网。put(15,“255.254.0.0”);
前缀和子网。put(16,“255.255.0.0”);
前缀和子网。put(17,“255.255.128.0”);
前缀和子网。put(18,“255.255.192.0”);
前缀和子网。put(19,“255.255.224.0”);
前缀和子网。put(20,“255.255.240.0”);
前缀和子网。put(21,“255.255.248.0”);
前缀和子网。put(22,“255.255.252.0”);
前缀和子网。put(23,“255.255.254.0”);
prefixAndSubnets.put(24,“255.255.255.0”);
prefixAndSubnets.put(25,“255.255.255.128”);
prefixAndSubnets.put(26,“255.255.255.192”);
prefixAndSubnets.put(27,“255.255.255.224”);
前缀和子网。put(28,“255.255.255.240”);
前缀和子网。put(29,“255.255.255.248”);
前缀和子网。put(30,“255.255.255.252”);
}
在这种情况下,最好使用一个值为元组的HashMap
原因很简单,如果您使用两个HashMap
:
当查询一个键的完整数据时,必须对两个HashMap
如果要打印所有子网掩码/地址数,必须确保两个HashMap
的大小相同
两个独立的HashMap
s非常麻烦且容易出错。将两者合并到一个HashMap
中,保存一个查找和一些代码行
正如我在评论中所说的,如果您需要非常频繁地访问该查找表(每秒一次,或每秒100次),那么使用该表查找可能会更好。否则,您可以采用编程方法。当然,它有点慢,但它肯定更优雅,更面向对象
public class SubnetMask {
private int prefix;
public SubnetMask(int prefix) {
if (prefix < 8 || prefix > 30) {
throw new IllegalArgumentException("Prefix must be in [8;32]");
}
this.prefix = prefix;
}
public long getNrOfAvailableAddresses() {
return (long) Math.pow(2, 32 - this.prefix) - 2;
}
// returns something like "255.255.192.0"
public String getSubnetMaskRepresentation() {
long bits = 0xffffffff ^ (1 << 32 - this.prefix) - 1;
return String.format("%d.%d.%d.%d",
(bits & 0x0000000000ff000000L) >> 24,
(bits & 0x0000000000ff0000) >> 16,
(bits & 0x0000000000ff00) >> 8, bits & 0xff);
}
}
公共类子网掩码{
私有int前缀;
公共子网掩码(int前缀){
如果(前缀<8 | |前缀>30){
抛出新的IllegalArgumentException(“前缀必须在[8;32]中”);
}
this.prefix=前缀;
}
公共长getNrOfAvailableAddresses(){
return(long)Math.pow(2,32-this.prefix)-2;
}
//返回类似“255.255.192.0”的内容
公共字符串getSubnetMaskRepresentation(){
长位=0xFFFFFF^(1>24,
(位&0x0000000000ff0000)>>16,
(位&0x0000000000ff00)>>8,位&0xff);
}
}
注:x.x.x.x表示法的翻译取自gma的答案
PPS.:Intellij Idea建议简化长位=…
语句。不要这样做,它似乎给出了一个错误的结果。最好编写一个合适的类,而不是使用元组。您甚至不需要hashmap。适当的类可以足够智能,在您将前缀传递给其构造函数后,动态计算可用地址和子网掩码。当然,hashmap会快得多,但它的代码也要多得多。