자바 3: 대상 의 일반적인 행동

5408 단어 자바 테마
본 고 는 이러한 통용 행 위 를 말 하 는데 한 가지 유형 을 정의 하려 면 먼저 본 고 에서 언급 한 몇 가지 문 제 를 고려 해 야 한다.
머리말
  • 류 의 분류:
  • 활동 실체, 예 를 들 어 Thread, 안 드 로 이 드 의 Activity
  • 하나의 스 레 드 는 하나의 Thread 대상 이 고 두 스 레 드 가 같 으 면 같은 대상 이 어야 한다
  • 하나의 안 드 로 이 드 인터페이스 가 바로 하나의 Activity 대상 이다. 두 화면 이 같 으 려 면 같은 대상
  • 이 어야 한다.
  • 값 클래스, 예 를 들 어 Person
  • 한 학생 이 여러 대상 에 대응 할 수 있 으 므 로 똑 같이 판단 해 야 한다. 두 학생 이 같은 대상 인지 아 닌 지 에 의존 해 서 는 안 된다
  • .

  • 자바 의 대상
  • 일반 대상
  • 배열 대상

  • 1 equals 방법
    두 대상 이 동일 한 지 판단 하 는 데 몇 가지 상황 이 있 습 니 다. * 1 활동 실체 * 2 값 류 * 3 Random 유사 한 류, 같은 논 리 는 무엇 입 니까?같은 난수 서열 을 만 들 수 있 습 니까? *4 Set, Map, List 의 같은 논리 * 5 개인 클래스, 패키지 급 개인 클래스: equals 는 이상 을 던 져 야 합 니 다. equals 방법 은 영원히 호출 되 지 않 기 때 문 입 니 다.
    값 류 는 일반적으로 equals 방법 을 덮어 자신의 논리 적 동일 한 개념 을 실현 해 야 한다.
  • equals 의 5 가지 원칙:
  • reflexive: x. equils (x) 는 true
  • 로 돌아 가 야 합 니 다.
  • symmetric: x. equals (y) 는 true 이 고 y. equals (x) 는 반드시 true
  • 이다.
  • transitive: x. equals (y) 는 true 이 고 y. equals (z) 는 true 이 며 x. equals (z) 는 반드시 true
  • 이다.
  • consistent: 비교 필드 가 수정 되 지 않 으 면 x. equals (y) 는 몇 번 을 조정 하 든 트 루 나 false
  • 로 일치 합 니 다.
  • x. equals (null) 는 false
  • 여야 합 니 다.

    EffectiveJava 의 작 가 는 이 몇 가지 원칙 을 위반 하 는 예 를 확실히 제시 하 였 으 며, 여기에 너무 많은 설명 을 하지 않 았 다.
    일반적인 equals 구현:
    
    //  class T
    @Override
    public boolean equals(Object o){
    
        if(this == o) return true;
        if(!(o instanceof T)) return false;
        T t = (T)o;
    
        //          ,    null
        if(!(field == t.field || (field != null && field.equals(t.field)))){
            return false;
        }
    
        //     field:     equals,   false
        //...
    
        //      ,  true
        return true;
    
    
        //   equals  ,      hashCode
    }
    

    2 hashCode 방법
    equals 판단 이 같은 두 대상, hashCode 도 같 아야 합 니 다.
    만약 equals 를 덮어 쓰 고 hashCode 를 덮어 쓰 지 않 는 다 면 무슨 일이 일어 날 까요?예 를 들 어 Person 클래스 에 대해 equals 가 덮어 쓰 이 고 같은 id 의 학생, equals 는 true 이지 만 hashCode 는 덮어 쓰 지 않 았 습 니 다.
    Person p1 = new Person(1); Person p2 = new Person(1);
    p1. equals (ps) true 되 돌리 기
    Map
    
    //  ,    hashCode   ,       equals     
    //    equals ,    hashCode
    //                    ,     ,    hash
    
    
    @Override
    public int hashCode(){
        int result = 17;
    
        result = 31 * result + int;  //byte, short, char, int   int
        result = 31 * result + (boolean ? 1 : 0);
        result = 31 * result + (int)(long ^ (long >>> 32));
        result = 31 * result + Float.floatToIntBits(float);
    
        //double
        long ld = Double.doubleToLongBits(f);
        result = 31 * result + (int)(ld ^ (ld >>> 32));
    
        //  
        result = 31 * result + (ref == null ? 0 : ref.hashCode());
    
        //  
        if(arr == null || arr.length == 0){
            result = 31 * result + 0;
        }else{
                  ,  hash,             , :
            result = 31 * result + Arrays.hashCode(arr);
        }
    
        return result;
    }
    

    3 toString
    toString 은 더 좋 은 인쇄 를 위해 서 입 니 다. 더 이상 할 말 이 없습니다.
    4 Comparable 인터페이스
    Comparable 은 클래스 가 실현 해 야 할 인터페이스 Comparator 로 하나의 전략 으로 함수 대상 을 전송 할 수 있 습 니 다.
    5 clone 방법
    대상 관리 10 절 참조

    좋은 웹페이지 즐겨찾기