我曾經好多年對Java的==和equals的區別和聯系搞不清楚,后來搞清楚了,筆記在這里:
http://www.cnblogs.com/findumars/p/3240761.html
http://www.cnblogs.com/findumars/p/3746878.html
刨去更細節的內容,其實只要明白一個原理即可:兩個對象在內存中是兩個不同的區域,就算其所有內容完全一模一樣,也仍然是兩個不同的對象。只是編程嘛,就是描述邏輯,有些情況下我們必須定義什么叫做兩個對象相等。這個就隨你啦,你可以定義兩個對象的首地址相等才叫對象相等(其實是不可能實現的),可以定義它們的HashCode相等就對象相等,或者僅僅是對象名字相等就算對象相等。這個思想在OO中是通用的,不僅僅為Java所獨有。比如今天在Qt的文檔中發現這段描述:
bool QVector::contains ( const T & value ) const
Returns true if the vector contains an occurrence of value; otherwise returns false.
This function requires the value type to have an implementation of operator==().
http://qt-project.org/doc/qt-4.8/qvector.html#contains
其實就是說QVector不懂你說的包含是指什么。所以你必須為T類型的數據單獨定義==操作符。我覺得吧,比較兩個對象相等夠麻煩,除非邏輯確實需要直接保存和處理對象,否則一般情況下只要比較兩個對象的指針(首地址)即可。那樣多省事呀。就像Delphi里的TList,簡直是RTL的核心管理類,許多RTL類都是靠它來實現的,但TList通常還不是僅僅用來保存指針而已(不過也剛巧,TObject.Create返回的全部都是堆上的指針,如果直接保存對象可能會麻煩一些)。