zoukankan      html  css  js  c++  java
  • JAVA集合介绍

    一、集合概述

             Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而数组长度固定,不能满足变化的要求。所以,java提供了集合。

             特点

                    1.        长度可以发生改变

                    2.        只能存储对象

                    3.        可以存储多种类型对象

               与数组区别          

     

    数组

    集合

    长度

    固定

    可变

    存储元素

    基本类型/引用类型

    引用类型

    元素类型的一致性

    必须一致

    可以不一致

     

    ArrayList默认构造的容量为10,没错。
    ArrayList的底层是由一个Object[]数组构成的,
    而这个Object[]数组,默认的长度是10
    所以有的文章会说ArrayList长度容量为10。

    然而你所指的size()方法,只的是“逻辑”长度。
    所谓“逻辑”长度,是指内存已存在的“实际元素的长度”
    而“空元素不被计算”

    即:当你利用add()方法,向ArrayList内添加一个“元素”时,
    逻辑长度就增加1位。 而剩下的9个空元素不被计算。


    ArrayList、LinkedList与Vector的对比
    从图中可以看出,这三者都实现了List 接口.所有使用方式也很相似,主要区别在于因为实现方式的不同,所以对不同的操作具有不同的效率。
    ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
    LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.
    当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义.
    Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
    Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%+1,int newCapacity = (oldCapacity * 3)/2 + 1;
    LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
    注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。 
    下面是ArrayList的部分源代码:
    /**
    * Constructs an empty list with the specified initial capacity.
    *
    * @param initialCapacity the initial capacity of the list.
    * @exception IllegalArgumentException if the specified initial capacity
    * is negative
    */
    public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
    throw new IllegalArgumentException("Illegal Capacity: "+
    initialCapacity);
    this.elementData = (E[])new Object[initialCapacity];
    }

    /**
    * Constructs an empty list with an initial capacity of ten.
    */
    public ArrayList() {
    // 注意这里。默认长度为10。这回知道了吧
    this(10);
    }

    二、集合体系

              集合作为一个容器,可以存储多个元素,但是由于数据结构的不同,java提供了多种集合类。将集合类中共性的功能,不断向上抽取,最终形成了集合体系结构。

              数据结构:数据存储的方式

              Java中集合类的关系图

              

             集合体系导图(用鼠标拖动图片可看大图右击图片选择在新标签页中打开图片(I)


    三、Collection

               Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行,于是衍生出两个子类接口List和Set。

               

          Collection基本功能

              A:添加功能

                              boolean add(Object obj):向集合中添加一个元素

                              boolean addAll(Collection c):向集合中添加一个集合的元素。

              B:删除功能

                              void clear():删除集合中的所有元素。

                              boolean remove(Object obj):从集合中删除指定的元素

                              boolean removeAll(Collection c):从集合中删除一个指定的集合元素。

              C:判断功能

                              boolean isEmpty():判断集合是否为空。

                              boolean contains(Object obj):判断集合中是否存在指定的元素。

                              boolean containsAll(Collection c):判断集合中是否存在指定的一个集合中的元素。

              D:遍历功能

                              Iterator iterator():就是用来获取集合中每一个元素。

              E:长度功能

                              int size():获取集合中的元素个数

              F:交集功能

                              boolean retainAll(Collection c):判断两个集合中是否有相同的元素。???

              G:把集合转换成数组

                              Object[] toArray():把集合变成数组。

           List接口

                List接口下的集合元素存储有序,可以重复。

                List的特有功能

                  A:添加功能

                      void add(int index, Object obj):在指定位置添加元素

                  B:删除功能

                      Object remove(int index):根据指定索引删除元素,并把删除的元素返回。

                  C:修改功能

                      Object set(int index, Object obj):把指定索引位置的元素修改为指定的值,返回修改前的值。

                  D:获取功能

                      int indexOf(Object o):返回指定元素在集合中第一次出现的索引

                      Object get(int index):获取指定位置的元素

                      ListIterator listIterator():列表迭代器

                  E:截取功能

                      List subList(int fromIndex, int toIndex):截取集合。

          Set 接口

                   Set接口下的元素无序,不可以重复。其下面分为HashSet和TreeSet。

                  HashSet

                   底层数据结构是哈希表,线程不安全,效率高。

                   保证唯一性依赖两个方法:hashCode()和equals()。

                   顺序:

                           判断hashCode()值是否相同。

                           相同:继续走equals(),看返回值

                                       如果true:就不添加到集合。

                                       如果false:就添加到集合。

                           不同:就添加到集合。

                  TreeSet

                    底层数据结构是二叉树,线程不安全,效率高。

                    保证元素唯一性的方法时根据返回值是否是0。

                    保证排序的两种方式:

                            自然排序(元素具备比较性):实现Comparable接口

                            比较器排序(集合具备比较性):实现Comparator接口


                  未完待续,下篇为迭代器+Map集合

  • 相关阅读:
    大数据【一】集群配置及ssh免密认证
    安卓测试【三】adb简单命令及monkey使用
    安卓测试【二】eclipse离线安装ADT
    初始化对象的知识细节
    安卓测试【一】android sdk环境变量配置
    自动化测试用例排序(三个算法随机、贪心、额外贪心)
    java实现文件复制粘贴功能
    Javsssist用InsertAt()方法对语句插桩
    Javassist进行方法插桩
    JUnit手动设计测试方法以及与Randoop的自动生成测试的比较
  • 原文地址:https://www.cnblogs.com/taotingkai/p/6076649.html
Copyright © 2011-2022 走看看