数据结构在java中的使用

        在java使用中,java底层封装查找使用的是快速排序,封装的排序使用的是二分查找法,这是大多数计算机语言一般所做的数据结构封装。同时,这点可以在Arrays,Collections查看。说到底,在java中数据最底层最重要的其实还是数据结构方面的内容,例如排序,查找,插入等。

        这里java操作排序,查找一般使用Arrays,Collections,collection及其子类,Map及其子类。 但是实际上,java使用的最底层的二分查找法,java6的查找使用的是MergeSort,而java7则是TimSort,ComparableTimSort。而DualPivotQuickSort则是最底层的快速排序。可以在Arrays,Collections查看。

        对于Arrays,Collections这里牵扯到Comparator,Comparable两个接口。在实际比较中频繁使用Comparator,Comparable这两个接口,在Arrays,Collections的sort(XX,Comparator)中需要实现Comparator,而sort(XX)中,参数需要时Comparable的子类。而最关键的是Arrays,Collections有binarySearch()。

        注意在Arrays,Collections中使用的sort(Object[],Comparator)方法其实使用的是二分查找法。同时注意,ListIterator与Iterator不同的地方在于ListIterator有set()方法可以设置遍历到的元素。而sort(basedata[ ])则是使用快速排序实现的,即使用java底层封装的DualPivotQuickSort进行快速查找。总的来说就是,对象的sort()方法,使用的是二分查找,而基础数据类的sort()使用的是快速排序。(基本数据类型所使用的DualPivotQuickSort和对象所使用的ComparableTimSort自身都是有包含sort()方法的。但是这里注意,在Arrays的使用上,都是直接调用这两个类的sort(),而Collections则是将对象里面所包含的数据分离,在排好序之后再使用ListIterator方法将排序好的数据复制给对象,也就是说,只是对象的数据在排序后改变了,而对象本身并没改变过。)

        注意Collections,Arrays封装了很多用于排序,查找的方法。

        对于使用到数据类型的操作,如排序,查找,插入的类,基本上都是有自己的方法,或底层,或自己实现。可以在源代码里面查找,但是往往在outline窗口不会对这些方法进行显示,甚至对于这些不公开的方法代码我们使用一些常见操作是很难看到的,但是可以使用ctrl+F查看。

        我们常用的容器类有List,Set,Map,Queue。这里注意Collection的意思是收藏器。

        Map的瓶颈在于键的查找,因为使用的是线性查找,所以效率差,导致实际上使用Map时,优先选择的是HashMap。SortMap是为了TreeMap所设的接口,TreeMap是定序的,同时需要实现Comparable接口,其实TreeMap是红黑树的实现,同时他也是唯一一个有subMap()的Map子类。

        Set是没有get()方法的,因为Set内部自行维护顺序,但是可以使用Iterator遍历。SortSet是为了TreeSet而设定的接口,因为Set是无序的,而TreeSet是定序的,所以TreeSet必须实现Comparable接口。关键需要明白Set是无序的,所以一旦涉及到排序,就基本需要写排序的方法。

        注意Hashtable,Vector,Stack都是老的容器类,只是为了兼容旧版本而存在,所以应该尽量避免使用。

        其实更多的是应该从属性来看一个容器类。如Array,Linked,Sorted,Hash,Tree,而这些属性其实基本上都是比java底层封装的快速排序,二分查找要快。其实存储数据最快的是数组。在散列(也就是Hash哈希属性)中,使用的就是数组存储,例如HashMap,使用的就是以键获得数组下表,而数组存储的实际上不是对象本身,而是list,也就是说,通过键计算对象所要存储的list数组下标,同时应该注意hashCode()应该与equals()一起实现,这是哈希操作的需要,同时,Hash属性是注重查找的属性。而Tree属性则是使用不同的树实现,如TreeMap使用的就是红黑树,而TreeSet是在TreeMap基础上实现的,这里Tree属性是定序的,是注重排序的属性。Array,Linked使用的是数组,Linked尽管是链表,但是基础还是数组,所以就这点应该说Array,Hash的查找速度是很快的,而Linked由于链表的使用更注重插入。这里最关键的是Sorted属性,一般使用Sort属性的都是接口,如SortedMap,SortedSet,他们都是接口,他们分别被TreeMap,TreeSet实现,而Sorted属性是需要传入Comparator,或者传入的元素需要实现Comparable。(注意在java中数组是效率最高的存储,随意访问队形引用序列的方式,而数组本身是一种简单的线性序列。应该说,数组并未使用任何的排序,查找这些数据结构的应用,数组是硬件级的,我们的存储,随机访问都是访问存储空间里的数据引用,所以数组很快。简单点说,就是数组是对硬件存储空间进行直接操作。但是我们也可以使用Arrays对数组进行查找,毕竟数组的随机访问并非使用数组内容查找,而是下标。)

        (在所有的数据结构的应用中最难的是树,但却有是最重要的,树有二叉树,平衡二叉树(AVL),红黑树,B-树,B+树,字典树,这里最重要的是红黑树,因为TreeMap,TreeSet使用的就是红黑树。)

        这里最关键的是Hash属性的hashCode(),equals()的实现,Tree属性的Comparator,Comparable的实现,或者说红黑树的实现。可以查看一些容器类的源码学习这些技巧(未完成)




(未完成)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值