黑马程序员——集合体系回顾和数据结构学习



---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a><a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

集合体系回顾:


(一)Collection

|--Collection(接口)

|--List(接口):有序,可重复(有角标),特有迭代器ListIterator,允许多个null

             |--ArrayList(类):不同步,查询快,增删稍慢,底层是数组结构

             |--LinkedList(类):不同步,查询稍慢,增删快,底层是链表结构

             |--Vector(类):同步,效率低,底层是数组结构,已被ArrayList取代

|--Set(接口):无序,不可重复,没有索引

             |--HashSet(类):底层是hash表,不同步,通过hashCodeequals保证唯一

             |--TreeSet(类):底层二叉树,不同步,使用自然顺序(默认)或比较器进行排序

(二)Map

|--Map(接口)

|--Hashtable(类):底层是Hash表结构,不可以存入null键值。同步,.效率低

       |--HashMap:底层是Hash表结构,允许用 null 值键,不同步,替代HashTable效率高。

       |--TreeMap:底层是二叉树结构。不同步。可以用于给map集合中的键进行排序。

psSet底层就是用来Map结构中的Key

(三)工具类Collections

由于Collections中全部为静态方法,因此不用实现对象,可以通过Collections.方法名()来使用。

常用方法:

1      sort:对List排序,可以自然排序,也可传入比较器。

2      max/min:获得collection的最大/小值,可指定比较器

3      BinarySearch:二分查找,可指定比较器

4      Fill:用指定元素替换List中所有元素

5      replaceAll:使用指定值替换List中所有某一指定值

6      reverse:翻转指定List中的所有顺序

7      reverseOrder:返回一个比较器,强行逆转自然顺序

8      shuffle:使用默认随机源对List顺序进行置换

9      synchronizedSet/synchronizedMap/synchronizedList/ synchronizedCollection

返回一个同步的(线程安全的)Set/Map/List/Collection

(四)工具类Arrays

       Arrays中同样全为静态方法,主要用于对数组进行各种操作(搜索或排序)。

       常用方法:

1      BinarySearch:二分查找,可查找任意类型数组,可指定比较器,可指定比较范围。

2      hashCode:基于指定数组内容返回哈希码

3      sort:升序排序,可指定范围,也可指定比较器

一. List
1).ArrayList


l ArrayList维护着一个对象数组。如果调用new ArrayList()后,它会默认初始一个size=10的数组。
l 每次add操作都要检查数组容量,如果不够,重新设置一个初始容量1.5倍大小的新数组,然后再把每个元素copy过去。
l 在数组中间插入或删除,都要移动后面的所有元素。(使用System.arraycopy()

2).LindedList
LinkedList
的实现是一个双向链表。每个节点除含有元素外,还包含向前,向后的指针。
新建一个LinkedList,生成一个头节点(header,就是一个头指针),它的元素为null

它自包含,nextprevious指针都指向自己。
执行add(Objectobj)方法后,会生成一个新节点

Header
节点的next指向链表的第一个节点,previous指向链表的最后一个节点,在这里都是first
再增加一个对象,它的形状像下面这样。

现在是一个标准的双向链表形状。每个节点都有自己的nextprevious指针。
l 增加节点,只会对链表的指针进行操作,速度快
l LinkedList实现了Deque,所以它有双向队列的特征,在链表两端可增删数据
l 使用index查找对象时,会以indexsize/2比较,从前或从后向中间搜索
l ListIterator可向前或向后迭代

比较ArrayListLinkedList的结构,就可以得出:
1
ArrayListremoveadd(index, Object)操作代价高,需要移动后面的每个元素。
2
LinkedListget(index)操作代价高,它要先循环遍历list,找到Object


二. Map
1).HashMap
HashMap
的结构是一个散列桶,初始化时生成如下结构

每个bucket包含一个Entry(map自定义的一种结构,包含一个往后的指针)的链表。
put(key,value)后,它的结构如下

keyhashcode再次散列,然后用这个hashlength-1进行按位与操作,得到bucketindex,然后检查当前bucket的链表,有没有这个key,如果有替换value,没有则跟在链表的最后。
l 允许keyvalue都可以是null
l Index=0bucketkey=nullvalue,也可以是其它hashcode0的项
l 初始容量必须为2的幂次(我的理解是,在生成index的时候有这样的代码:hase ^ (length - 1)),length – 1的二进制代码为全1,则容易进行hash的设计)
l 如果两个key散列后的index一样的话,第一个key生成的Entry先存在桶中,第二个key生成的Entry会将第一个Entry设为自己的next,串起来。(如图中,先put(yy, “first”),会将这个Entry设为bucket的第一项,后put(xx,”second”),则生成新Entry,它的nextkeyyyEntry,生成一个链表)
l put操作中,会比较thresholdcapacity * load_factor,一个临界值),如果size > threshold的话,生成一个当前bucket两倍数量的buckets,然后把现有的数据重新散列到新bucket
l HashMap迭代时,返回数据的顺序是:index0length-1,循环遍历每个bucket,把不为null的数据取出,每个bucket内的顺序由链表的顺序决定。而不是由插入数据决定。

2).LinkedHashMap
上面说过,Map的迭代不由插入顺序决定。如果要保持这种顺序呢?就要新增加一种结构来保持。

LinkedHashMap
HashMap的子类,增加一个双向链表,用来存储每个新加入的节点。在遍历时,按链表的顺序进行。其实差不多就是上面HashMapLinkedList的和吧。
三. Set
1).HashSet
HashSet
使用HashMap来保持元素。Key = 元素,value是一个公有的对象,对每个元素都一样,在HashMap里面key是惟一的,当然很适合于构造set集合。等同于用HashMap包装了次,显示Set自己的特性。

最后还要提到集合类里面一个很重要的类:Collections,它有很多自己独特的静态方法。当然它主要提供几种特殊集合(List, Map,Set),可以调用静态方法来获得:Unmodifiable*(不可修改集合,不可添加或删除元素)Synchronize*(保持同步集合,它的基本每个方法都加锁,防止并发操作)Checked*(声明之始传入特定类型,以后的操作都会验证加入元素是否属于已定类型)Singleton*(集合中只包含一个元素)。它们都是通过包装集合类中的抽象类获得,产生不同的行为。

上面是常见的几种集合类,其它类我很少使用到。
不记得是谁说过,我们最容易记住图像化的知识。

----------------------<ahref="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a><ahref="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!----------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值