熬之滴水穿石:JAVA的世界(10)

                          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这个接口的分别是 HashMapLinkHashMap, HashTable,和 Set接口一样, TreeMap并不是实现了Map接口,它是通过实现 SortMap接口实现的,而 sortMap接口则是继承Map接口而来的。

所以 TreeMapTreeSet其实是有许多相似的地方,所以 TreeSet是通过 TreeMap实现的。只是 Map只用了 Key-Value,Set只用了Key。同理 HashSetHashMap也是如此。
TreeSet,TreeMap,HashMap,HashSet,LinkedHashMap这几个数据接口有很多相似的地方,彼此关系紧密。TreeSet强大的地方就是它是以有序的状态保存数据。像我们将字母存储进去,它会按照字母的顺序排列,因为在该对象中有着 sort方法。在该结构中, TreeSet是不允许有重复元素出现的。如果有也会以最新的元素替换掉之前的那个元素。 TreeSet实际是通过 TreeMap实现的, TreeMap与之不同的是有 Key和ValueLinkHashMap  与  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中高级的用法泛型....
                                                                                                                                                                    (未完待续........)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值