........
public class Address {
        InetAddress IP;
        int port;
        String usrID;
       
}.......
static List<Address> IPTable = new ArrayList<Address>();
.......
其中ArrayList的contains和indexOf等方法分别在类Address内容完全相同但地址不同的情况下无法判定是否包含此对象和正确返回索引,因此需要重载其中的equals和hashcode方法,可小弟我是初学者,希望高手帮我写一下。

解决方案 »

  1.   

    代码如下吧:
    public class Address { 
            InetAddress IP; 
            int port; 
            String usrID; 
            
      public boolean equals(Address address){
            if(this==address)return true;        if(this.IP!=address.getIP())return false; 
            if(this.port!=address.getPort())return false; 
            if(this.usrID!=address.getUsrID())return false; 
            
            return true;
    }
      public int hashCode(){
            return IP.hashCode()+port+usrID.hashCode();
    }

    似乎不够完美,不过我一时也想不起一个能够完全唯一的函数了,呵呵
      

  2.   

    你重写equals 和hashcode的地方错了,Address 里包含InetAddress 对象IP,
    这时候要在InetAddress 里重写equals 和hashcode方法,而不是在这里
      

  3.   

    //比如InetAddress类为
    public class InetAddress 
    {
    private string ip;
    private string port; // getIp()方法  getPort()方法
    // setIp()方法  setPort()方法
    }重写equals 和hashcode方法如下:
    public boolean equals(Object other) {
             if ( (this == other ) ) return true;
     if ( (other == null ) ) return false;
     if ( !(other instanceof InetAddress) ) return false;
     InetAddress castOther = ( InetAddress ) other; 
             
     return ( (this.getIp()==castOther.getIp()) || ( this.getIp()!=null && castOther.getIp()!=null && this.getIp().equals(castOther.getIp()) ) )
    && ( (this.getPort()==castOther.getPort()) || ( this.getPort()!=null && castOther.getPort()!=null && this.getPort().equals(castOther.getPort()) ) );
     }
       
       public int hashCode() {
             int result = 17;
             result = 37 * result + ( getIp() == null ? 0 : this.getIp().hashCode() );
             result = 37 * result + ( getPort() == null ? 0 : this.getPort().hashCode() );
             return result;
       }   
      

  4.   

    在inetAddress里重写,那是不是修改JDK源代码呀?还是在别的啥地方?
      

  5.   

    吓!equals和hashcode到底要在哪个地方重写啊?如何找到那地方?告诉我就给分
      

  6.   

    你的Address是要放在ArryaList中,所以在Address中重写是正确的,因为你要判断的是Address的重复
      

  7.   

    eclipse IDE能自动生成equals和hashcode方法,你也可以使用apache commons包里面工具实现!
      

  8.   

    <java code>
    //供参考
    import org.apache.commons.lang.builder.EqualsBuilder;
    import org.apache.commons.lang.builder.HashCodeBuilder;public class Address {
    InetAddress IP;
    int port;
    String usrID; // 如果 usrID唯一就直接用它作为HASHCODE // eclipse 自动生成
    @Override
    // public int hashCode () {
    // final int prime= 31;
    // int result= 1;
    // result= prime * result + ( (IP == null) ? 0 : IP.hashCode());
    // result= prime * result + ( (usrID == null) ? 0 : usrID.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;
    // final Address other= (Address) obj;
    // if (IP == null) {
    // if (other.IP != null)
    // return false;
    // } else if (!IP.equals(other.IP))
    // return false;
    // if (usrID == null) {
    // if (other.usrID != null)
    // return false;
    // } else if (!usrID.equals(other.usrID))
    // return false;
    // return true;
    // }


    // org.apache.commons.lang.builder.HashCodeBuilder 辅助生成
    public int hashCode () {
    return new HashCodeBuilder(17,37).append(IP).append(usrID).toHashCode();
    }

    // org.apache.commons.lang.builder.EqualsBuilder 辅助生成
    public boolean equals (Object obj) {
    Address d= null;
    if (obj != null && Address.class.isAssignableFrom(obj.getClass())) {
    d= (Address) obj;
    } return new EqualsBuilder().append(IP,d.IP).append(usrID,d.usrID).isEquals();
    }
    }class InetAddress {}
    </java code>
      

  9.   

    class InetAddress
    {
          InetAddress IP; 
          String usrID;
          int port;
          public boolean equals (Object o) {
    // TODO Auto-generated method stub
       if(o instanceof InetAddress)
       {
       InetAddress R=(InetAddress)o;
       if((R.usrID==this.usrID)&&(R.port==this.port)&&(R.IP==this.IP)){
           return true;}
       else{
         return false;
       } 
          
       }
       else
       {
       return false;
       } 
       }   

       public int hashCode() {
    // TODO Auto-generated method stub
        return (port+this.usrID.hashCode()+this.IP.hashCode()) ;
    }}