adt:對資料的抽象;體現為一組對資料的操作
af:內部表示—>抽象表示
**基於af定義adt的等價操作
等價關係:自反、對稱、傳遞
從af的角度:af對映到同樣的結果—>等價
從外部觀察者角度:對兩個物件呼叫任何相同的操作都會得到相同的結果—>等價
==:引用等價性,即是否指向記憶體中同一位址(在快照圖中指向同乙個圈圈)
?對基本資料型別使用
.equals():物件等價性,自定義adt時需要重寫object的equals()
?對物件型別使用
在object中實現的預設equals()是在判斷引用等價性
錯誤的示例:
?是overload,不是override
正確的示例:
先用instanceof判斷型別,再呼叫私有的輔助函式判斷等價性
《在沒有af的前提下無腦判斷每個域是否相同不可取>
關於instanceof
用於判斷乙個物件是否是某一特定型別,動態檢查
除了實現equals()方法之外,最好不要使用
(1)滿足等價關係
(2)一致性:多次呼叫equals應返回相同結果,除非物件被修改
(3)x!=null?x.equals(null)==false
(4)相等物件的hashcode()結果必須一致(除非你能保證該類的物件不會被加入到某種雜湊結構中)?equals()和hashcode()必須同時重寫
觀察等價性:不改變狀態的情況下,兩個mutable物件是否看起來一致(通過呼叫除mutators外的方法)?比較常用
行為等價性:呼叫物件的任何方法都展示一致的結果(通過呼叫任何方法)
在jdk中,不同的 mutable類使用不同的等價性標準
《對immutable物件來說,觀察等價性和行為等價性是等價的,因為沒有mutator>
如果mutable的物件在集合類中:
當其發生改變後,集合類的行為不確定!
例:
listlist = new arraylist<>();
list.add("a");
set> set = new hashset>();
set.add(list);
set.contains(list)→true
list.add("goodbye");
set.contains(list)→false
原因:向list新增元素後,list的hashcode()改變了
總結:不可變型別必須重寫 equals() 和 hashcode();可變型別不應重寫 equals() 和 hashcode()
3 5ADT 和OOP 中的」等價性」
1.等價關係 2.不變型別的等價性 3.引用等價性和物件等價性 4.可變資料型別的觀察等價性和行為等價性 5.object契約 6.autoboxing and equality 1 equivalence relation 等價關係 adt 是對資料的抽象,體現為一組對資料的操作 抽象函式 af ...
第三章 ADT與OOP ADT與OOP中的等價性
首先先談一下引用等價性與物件等價性,試想有兩個同樣的產品ab,那麼a是否等價於b呢?先說結論從引用等價性來講a不等價於b,而從物件等價性來講a等價於b。原因 a與b是同樣的產品,所以樣子形狀等等屬性都是一樣的所以物件等價性等價,但a與b雖說一模一樣,但畢竟是兩個物品,所以引用等價性不等價。回到正題,...
android中ADT和SDK的關係
adt android development tools sdk software development kit 手機rom中包含兩個基本的image,乙個是boot.image,這個image中主要是kernel和檔案系統 目錄下的一些東西。kernel我就不說了,目錄下主要是init和相關的...