集合笔记

来源:互联网 发布:nginx在windows配置 编辑:程序博客网 时间:2024/06/05 00:13

浅谈集合:

        集合就是容器,存放元素的东西。数组就是一个集合。

        集合的分类:从存放个数来讲:Collection (接口1)------list(接口1)-------ArrayList(类1)      Iterator(接口1)

                                                                                                                  --------LinkedList(类1)

                                                                                         ------set(接口1)---------HashSet(类1)

                                                                                                                     --------TreeSet(类1)

                                                       Map(接口2)-----------HashMap(类2)

                                                                         -----------TreeMap(类2)

  1、ArrayList:底层是用一个存放Object类型的数组来实现的 private Object [] elementData。也主要是在这个数组上进行操作。

             构造函数:是空的构造函数数组的长度为10。

             扩容问题:因为是底层是数组因此需要扩容。在每一次添加元素的时候都要判断是不是需要扩容,ensureCapacity()函数,就是用来确保add这个函数能够正常执行,size+1==length的时候就需要扩容。扩容的函数基本思路是length*3/2+1。这样操作后剩下的元素扩容前的一半容量。

             拷贝:如果扩容以后就需要进行元素的拷贝,这里用的函数是Arrays.copyof()。底层调用的是System.arraycopy().这个函数是c++写的。比较快。

2、LinkedList:主要的操作对象是一个内部类Entry节点实现的双向循环列表。

           构造函数:初始化是一个head的空节点。

           不存在扩容问题(也是集合中唯一一个不需要扩容的类)

          但是这里要进行null和非null的判断。

3、HashMap:主要是维护一个存放Entry节点的数组table。

      构造函数:这里的构造函数需要初始化table的长度,和增量因子,默认是16和0.75。当数组的元素个数达到当前元素个数的0.75倍的时候就进行扩容2倍。

     扩容:这里调用的tranfer函数进行扩容和ArrayList扩容思路一致。

      核心算法:用位运算的方式进行散列。这样不涉及到除法,这点也是Hashtable的改进之处(除留取余法)

4、HashTable:初始化大小为11.增量因子0.75.扩容:2倍+1

5、TreeMap:用红黑树的方式对Key进行排序,当然也可以覆盖Comparable接口,自定义排序顺序。key值不能为null.(HashMap中是可以为null的)。


TreeSet 和HashSet分别是TreeMap和HashMap实现的,只是把value的值进行了固定化。过完这段时间好好看看。

0 0