有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:设置。contains()给出了错误的结果

从设定开始。contains(objecto)应该只使用equals来检查一个对象是否在一个集合中,以下两种方法如何产生不同的结果?在我的项目中,方法1不会引发异常,但方法2会引发异常

作为参考,对象“group”在集合“groups”中,因此方法1的工作方式与我预期的一样

boolean java.util.Set.contains(Object o)

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

方法1:

boolean ex = true;
for (AccessControlGroup acg : groups) {
  if ((acg.equals(group))) {
    ex = false;
  }
}
if (ex) {
  throw new IllegalStateException("Invalid group");
}

方法2:

if (!(groups.contains(group))) {
  throw new IllegalStateException("Invalid group");
}

进一步资料: 使用HashSet

访问控制组:

public List<AccessControlGroup> getInherits() {

    if (this.inherits == null) {
      this.inherits = new ArrayList<>();
    }
    return this.inherits;
}

public void setInherits(List<AccessControlGroup> inherits) {

    this.inherits = inherits;
}

public List<AccessControlPermission> getPermissions() {

    if (this.permissions == null) {
      this.permissions = new ArrayList<>();
    }
    return this.permissions;
}

public void setPermissions(List<AccessControlPermission> permissions) {

    this.permissions = permissions;
}

@Override 
public int hashCode() {

    final int prime = 31;
    int result = super.hashCode();
    // prevent infinity loops or other sick effects
    // result = prime * result + ((this.inherits == null) ? 0 : this.inherits.hashCode());
    result = prime * result + ((this.permissions == null) ? 0 : this.permissions.hashCode());
    result = prime * result + ((this.type == null) ? 0 : this.type.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {

    if (this == obj) {
      return true;
    }
    if (!super.equals(obj)) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    AccessControlGroup other = (AccessControlGroup) obj;
    // prevent infinity loops or other sick effects...
    // if (!Objects.equal(this.inherits, other.inherits)) {
    // return false;
    // }
    if (!Objects.equals(this.permissions, other.permissions)) {
      return false;
    }
    if (!Objects.equals(this.type, other.type)) {
      return false;
    }
    return true;
    }

访问控制:

@Override
public int hashCode() {

    final int prime = 31;
    int result = 1;
    result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {

    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    AccessControl other = (AccessControl) obj;
    if (!Objects.equals(this.id, other.id)) {
      return false;
    }
    return true;
}

共 (1) 个答案

  1. # 1 楼答案

    我打赌你在将group添加到集合groups后修改了它。这将改变它的哈希代码,这将把它留在groups中的错误桶中,这意味着contains将无法再找到它,除非新的哈希代码与旧的哈希代码发生冲突

    Set< AccessControlGroups > groups = new HashSet<>();
    AccessControlGroup group = new AccessControlGroup();
    groups.add( group );
    groups.contains( group ); // true
    group.setPermissions( new ArrayList<>() );
    groups.contains( group ); // false