String type; because it is treated like an object that has its own hash…code calculation
implementation。
Notice in the implementations of the Append() methods how a calculation is performed
and then added to the data member _runningTotal。 The return value is a Me reference; so that
the methods can be chained together。 This allows a client to use the HashCodeAutomater class;
as the following GetHashCode() implementation demonstrates:
…………………………………………………………Page 304……………………………………………………………
282 CH AP T E R 1 0 ■ L E A R N I N G A B OU T P E R S IS TE N CE
Class HashcodeExample
Public value As Integer
Public buffer As String
Public Sub New (ByVal val As Integer; ByVal buf As String)
value = val
buffer = buf
End Sub
Public Overrides Function GetHashCode() As Integer
Return New HashCodeAutomater()
。Append(value)
。Append(buffer)。toHashCode()
End Function
End Class
The implementation of HashcodeExample has two data members: value and buffer。 The
two data members make up the class’s state。 Not all data members are used when calculating
a class instance’s hash…code value。 For example; if HashcodeExample had a data member that
referenced a database connection; it should not be used when calculating the hash code; because
the database connection is the type used to get the state and does not influence the state—it is
a means to an end。
Implementing Equals()
Once the GetHashCode() method has been implemented; the Equals() method can be
implemented:
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If TypeOf(obj) Is HashCodeExample Then
If obj。GetHashCode() = Me。GetHashCode() Then
Return True
End If
End If
Return False
End Function
Because the rule for GetHashCode() is that two object instances with identical hash…code
values must return the same value; it makes sense to implement Equals() using GetHashCode()。
However; what started out as a good idea turns out to be a bad idea; as the following illustrates:
Dim s1 As String = 〃Hello〃
Dim s2 As String = 〃World〃
Dim x1 As Integer = 17 * 17 + s1。GetHashCode()
Dim x2 As Integer = 17 * 17 + s2。GetHashCode()
Dim h1 As HashCodeExample = New HashCodeExample (x2 * 37; s1)
Dim h2 As HashCodeExample = New HashCodeExample (x1 * 37; s2)
…………………………………………………………Page 305……………………………………………………………
CH A PT E R 1 0 ■ L E A R N I N G A B O U T P E R S IS T E N CE 283
Dim ht As Hashtable = New Hashtable()
ht。Add(h1; Nothing)
ht。Add(h2; Nothing)
This shows that having two objects with pletely different states results in the same
hash…code value and generates an exception because Equals() has been implemented incor
rectly。 In the implementation of Hashtable; when an added object collides with another already
existing object; an equality test is made。 If the equality test returns True; then the exception
is generated because Hashtable does not allow you to add an object with the same state as
another object。
The solution is not to fix the GetHashCode() method; but rather to modify the Equals() method:
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If TypeOf (obj) Is HashcodeExample Then
If obj。GetHashCode() Me。GetHashCode() Then
Return False
End If
Dim toTest As HashcodeExample =
DirectCast(obj; HashcodeExample)
If toTest。value = Me。value Then
If toTest。buffer = Me。buffer Then
Return True
End If
End If
End If
Return False
End Function
The logic of the modified Equals() method is to first test if both types are identical。 If not;
then False is returned。 Next; test if GetHashCode() returns unequal values。 GetHashCode() will
always return different values for objects that have different data members。 If the hash…code
values are equal; then es the hard work of individually testing each data member for equality。
The hard work is delegated as the last step; because any object that reaches that point will
probably be identical; but you need to be 100% certain。
The Important Stuff to Remember
In this chapter; you learned how to process a stream of data using the console。 Here are the
main items to remember:
o When data is moved from one medium to another; it is streamed。
o There are two major types of streams: text and binary。
o Text streams are universal and can be read by all puters。
…………………………………………………………Page 306……………………………………………………………
284 CH AP T E R 1 0 ■ L E A R N I N G A B OU T P E R S IS TE N CE
o Binary streams are specific to the program and sometimes to the processor。 Imagine the
situation of having to decipher a C++ data stream generated by a PowerPC chip。 Most
likely; the numbers that you read will be wrong because of the way that Intel or AMD
chips store their numbers。 Generally speaking; with binary streams; you will be conversing
with two implementations。 If not; use text streams。
o When streaming data; it is best to customize as little as poss
小说推荐
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VC语言6.0程序设计从入门到精通
- -Page 1-Visual C 6.0 程序设计从入门到精通求是科技 王正军 编著
- 最新章:第136章
- SQL 21日自学通(V3.0)(PDF格式)
- -Page 1-SQL 21 日自学通(V1.0 翻译人 笨猪目录目录 1译者的话 14第一周概貌 16从这里开始 16
- 最新章:第170章
- 2008年青年文摘精编版
- 作者:中国青年出版社“初恋”的惩罚.作者:凡 凡 文章来源《真情》2005年第4期 点击数:6608 更新时间:2005-6-5过了年,我就十八岁了。离高考只剩下四个多月了。这一段,班里的男女生相互间递纸条、写情书、约会等地下活动慢慢的多了起来。我这个“尖子生”也突然感到了不安、慌乱,并且自责。不知
- 最新章:第230章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章