22--强大的数据结构
(未完待续........)
用JAVA写代码尤其是需要用到数据结构时,真是切实的感受到数据结构在JAVA中的易用性。在JAVA入门的阶段使用率很高的是
ArrayList,随着后来的深入,我知道了其它JAVA集合的内容。
针对使用的情况把我所知的内容都说出来。在JAVA中其实主要是有
List,Set,Map这三种方式组成了数据结构的接口。那些我们熟悉的
TreeSet,HashMap,LinkedList,ArrayList,HashSet,LinkedHashMap都是从中继承接口实现的。
List主要是线性存储元素可以知道元素存储的位置,可以在元素中引用对象,并且多个元素可以引用相同的对象。
Set最大的特点就是不会重复,不允许在它的集合中有重复的元素存在。Map的特点就是通过键值找对应的值,
Map会维护与
Key相关的值。两个
Key可以引用相同的对象,但是Key值是不允许重复的。好了,我们按照这三个接口,依次把我熟悉的那些数据结构一一的引出来。
数据结构最大的Boss接口是
collection,它下面有三个继承它接口的,分别就是
List,Set和Map。
实现
List这个接口的最典型的分别是
LinkList,vetor,ArrayList,
LinkedList相当于是一个有着链表的容器。链表这种方式的存在,让LinkList处理添加、删除、查询等操作时明显的高于ArrayList的操作的效率,因为在每个元素空间里都保存了下一个元素的链接。vetor只能同步访问操作,ArrayList在前面的章节已经有了说明。
实现
Set这个接口的最典型的分别是
HashSet,LinkHashSet,我们熟悉的
TreeSet并不是实现Set这个接口,而是实现的SortSet这个接口,而
SortSet接口是继承Set接口而来的。
实现
MAP这个接口的分别是
HashMap,
LinkHashMap,
HashTable,和
Set接口一样,
TreeMap并不是实现了Map接口,它是通过实现
SortMap接口实现的,而
sortMap接口则是继承Map接口而来的。
所以
TreeMap和
TreeSet其实是有许多相似的地方,所以
TreeSet是通过
TreeMap实现的。只是
Map只用了
Key-Value,Set只用了Key。同理
HashSet和
HashMap也是如此。
TreeSet,TreeMap,HashMap,HashSet,LinkedHashMap这几个数据接口有很多相似的地方,彼此关系紧密。TreeSet强大的地方就是它是以有序的状态保存数据。像我们将字母存储进去,它会按照字母的顺序排列,因为在该对象中有着
sort方法。在该结构中,
TreeSet是不允许有重复元素出现的。如果有也会以最新的元素替换掉之前的那个元素。
TreeSet实际是通过
TreeMap实现的,
TreeMap与之不同的是有
Key和Value。
LinkHashMap
与
HashMap
的不同之处在于它是链表结构的方式并且还是双重链接列表。
我们知道了Set的一个特点就是防止元素重复,其实就是采取其hashcode的值来判断对象加入的位置。但同时也会与其它已加入对象的
HashCode的值作比较,如果没有相符的则表明对象没有重复的出现。判断对象是否相等,其实有2种判断的方式,一种是引用相等性,另一种则是对象的相等性。引用的相等性实际上是指对于同一个对象的两个引用是否相等,每个对象都有一个本身的序号,这个序号通过
Hashcode获取。如果两个引用要判断是否相等,我曾在前面的堆与栈中作了相应的描述。对于引用的比较则可以用==来比较,引用相同的对象字节组合也是一样的,对象的相等则需要用
equals方法来了。因此我们必须要用
override一下
hashcode的方法来确保对象有相同的值。如果两个对象相等,
hashcode必须也是相等的,调用的
equals方法也会返回true。反过来如果两个对象拥有相同的
hashcode值,它们也不一定是相等的。这个理论跟我们在数据结构中所讲的key值冲突有关系,也许不同的对象会返回同一个
hashcode值。这个时候我们就需要用
eques方法来判断两个对象是否相等,实际是采用
hashcode方法是缩小范围的方式来寻找最终的对象。
同样TreeSet在防止重复元素和HashSet是一样的,但它最强大的莫过于让元素一直保持有序的状态。当然要使用TreeSet,我们一定要让我们的对象去实现
Comparable的接口,并且实现C
ompare To方法。还有一种办法就是采取重载的方式,取
Comparator参数来构造函数来创建
TreeSet。关于Map的用法,想再下一个章节结合来说,因为这也是我认为在JAVA中高级的用法泛型....