确定InetSocketAddress是IPv6还是IPv4

时间:2011-08-15 02:50:22

标签: java

我需要确定InetSocketAddress是有效的IPv6还是IPv4。我能看到的唯一两种方法是使用 instanceof 运算符,或检查getAddress()的长度(应该返回byte[])。这两个都不太理想(instanceof很慢,而getAddress必须复制数组)。

有更好的选择吗?

4 个答案:

答案 0 :(得分:4)

我认为你找不到比instanceof更快的东西。在这种特殊情况下,我希望JIT编译器优化它以加载和比较一对指针;即大约5台机器指令。

但即使instanceof明显慢于我理解的速度,它也不太可能对您的应用程序的整体性能产生重大影响。

我建议您只使用instanceof,如果您此时有确凿证据,则只需要优化它;例如在实际工作量上分析您的应用程序的证据。

答案 1 :(得分:4)

更快的解决方案是比较类型。 Inet4Address和Inet6Address类型是final,因此它们不能被子类化。

Inet4Address.class == IPtoCheck.getClass();
Inet6Address.class == IPtoCheck.getClass();

测试显示,这是instanceof的两倍多,并且不受所比较类型的影响,而Inet4和Inet6地址上instanceof的性能则不同。

答案 2 :(得分:1)

如果您不喜欢instanceof,可以尝试:

Inet4Address.class.isAssignableFrom(IPtoCheck);
Inet6Address.class.isAssignableFrom(IPtoCheck);

我认为没有比instanceof或更高版本更快的解决方案。

答案 3 :(得分:1)

与使用其隐式DNS开销构建InetAddress本身的开销相比,instanceof中的任何开销都是微不足道的。