gpt4 book ai didi

java - ArrayList contains() 未使用类的 equals() 方法

转载 作者:行者123 更新时间:2023-12-01 18:36:49 25 4
gpt4 key购买 nike

我知道这个问题有很多答案。但我还没有找到解决方案。

class IpAddressRange
{
InetAddress start;
InetAddress end;

public IpAddressRange(String start, String end) throws Exception
{
this.start = InetAddress.getByName(start);
this.end = InetAddress.getByName(end);
}

@Override
public boolean equals(Object input)
{
System.out.println("Inside equals");
long lv = IpAddressRange.ipToLong(start);
long hv = IpAddressRange.ipToLong(end);
if(input != null && input instanceof InetAddress)
{
long iv = IpAddressRange.ipToLong((InetAddress)input);
if( iv >= lv && iv <= hv)
return true;
}
return false;
}

@Override
public String toString()
{
return start.getHostAddress() + "-" + end.getHostAddress();
}

public static long ipToLong(InetAddress ip) {
byte[] octets = ip.getAddress();
long result = 0;
for (byte octet : octets) {
result <<= 8;
result |= octet & 0xff;
}
return result;
}
}

当我在 ArrayList 上使用 contains() 时,它没有使用 equals() 方法。

 ArrayList<IpAddressRange> allocatedList = new ArrayList<IpAddressRange>();
allocatedList.add(new IpAddressRange("10.10.10.10","10.10.10.12"));

下面是调用contains()的代码:

 InetAddress inetAddress1 = InetAddress.getByName("10.10.10.11");
allocatedList.contains(inetAddress1);

但是这个contains()并没有调用IpAdressRange类的equals()方法。

最佳答案

问题在于您的 equals() 实现与 InetAddress 的实现不一致。 equals() 方法应该是对称的。

看一下合约here :

The equals method implements an equivalence relation on non-null object references:

  • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. For any non-null reference value x, x.equals(null) should return false.

重点是,您可以像 anIpAddressRange.equals(anInetAddress) 返回 true 一样实现它,但反之则不行,因为您无法编辑来自 InetAddressequals() 方法。

关于java - ArrayList contains() 未使用类的 equals() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612974/

25 4 0