美文网首页
Java集合框架

Java集合框架

作者: 冯员外_SundarFung | 来源:发表于2017-06-27 02:08 被阅读0次
    集合:

    1,是可以存储很多元素的容器。
    2,这个容器用于存储对象。
    3,而且该容器的长度是可变的。

    集合和数组的区别:

    1,
    数组是固定长度,
    集合是可变长度。
    2,
    数组可以存储引用类型,也可以存储基本类型。
    集合只能存储引用类型。

    集合框架的由来:

    集合有很多种,因为每一个集合中的数据结构(数据在容器中存取的具体的方式)都不一样。
    但都具备共性功能,就不断地向上抽取。就形成了集合框架。该框架的顶层Collection接口。

    学习框架原则:看顶层,用底层。

    了解一下api中的Collection中的共性方法。
    Collection中的共性方法:

    1,添加:
       add(Object)
       addAll(collection)
    2,删除:
       remove(object)
       removeAll(collection)
       clear();
       retainAll(collection);
    3,判断:
       contains(object)
       containsAll(collection)
       isEmpty();
    4,获取:
       size();
       iterartor();获取迭代器。每一个集合都具备。
    5,转换 
       toArray(); 将集合转成数组。  
    

    迭代器的使用:

     for(Iterator it = collection.iterator(); it.hasNext() ; ){
       System.out.println(it.next());
     } 
    

    迭代器:是容器中的一个内部类,因为该类要直接访问容器中的元素。
    同时对外提供了公共的访问规则Iterator接口。
    这样的好处,不需要知道具体的容器,只要是Collection中的容器
    都可以通过该种取出方法取出体系中的所有容器中的元素。
    降低了具体容器和取出方式的耦合性。
    想要获取集合中的迭代器对象,就可以通过iterator方法来完成。

    Collection

    • List :有序的(存入的顺序和取出的顺序保持一致),该集合中的元素都有索引,可以有重复元素。
    • Set :不允许有重复元素。

    List:特有方法:都是围绕的索引展开的。

     1,添加:
      add(index,element);
      add(index,collection);
     2,获取:
      get(index):通过角标获取元素。
      indexOf(object);
      lastIndexOf(object);
      subList(fromindex,toindex);
     3,删除:
      remove(index):通过角标删除元素,并返回被删除的元素。
     4,修改:
      set(index,element); 
     5,特有的迭代器。ListIterator。可以在迭代时进行元素的增删改查。
    

    List具备着对容器中的元素进行增删改查的功能。只有该集合有。为啥呢?因为索引。

    List
    • Vector:底层数据结构是一个数组。 而且数组可以增长。其实数组增长的原理:存储元素时,超出数组角标,会创建新数组,将原数组的数据复制到新数组中,并将新元素存储到新数组中。它是同步的。效率非常低。
    • ArrayList:底层数据结构也是可变长度的数组,是不同步的,比Vector效率高。查询元素的速度很快。
    • LinkedList:底层数据结构是链表数据结构,是不同步的。对元素的增删操作很快。
    Set
    • HashSet:数据结构是哈希表,是不同步的。
    • TreeSet:数据结构是二叉树结构。是不同步的。可以对Set集合中的元素进行指定方式的排序。默认用的元素的自然排序。

    Collection集合的子类对象阅读技巧。

    具体的容器是什么结构?是否是同步?

    通过名称就可以获得。容器的前缀名是数据结构的名字。后缀名是所属体系的名字。
    凡是后缀名是体系名的集合,通常都是不同步的。

    • ArrayList:数据结构是数组。所属于List体系。看到数组必须想到索引,必须要知道查询速度快。
    • LinkedList:数据结构是链表,看到链表就要想到,增删速度快,而且要接的 add,get,remove的first last方法。
    • HashSet:数据结构是哈希表,看到哈希就必须想到对元素进行hashCode和equals方法的复写。
    • TreeSet:数据结构是二叉树,看到树,就要想到比较排序,就要想到两个接口,Comparable Comparator。

    (二叉树结构也叫红黑结构左红右黑)默认元素的自然排序。可以对Set集合中的元素进行指定方式的排序。TreeSet判断元素唯一性的方式是比较方法的返回值是否为0,如果是0视为元素相同,不存。如果比较时主要条件相同就要看次要条件。弊端是不能存重复的

    哈希表提升了查询速度,并保证了元素的唯一性,元素不唯一性会破坏表结构。
    如果哈希值不同,直接存。如果哈希值相同,要进一步判断内容是否相同,用的是equals方法,如果equals返回true是相同元素则不存。如果返回false,不相同,则存储
    元素要往哈希表结构的容器中存储,必须具备hashCode和equals方法,Object中已经提供了这两个方法。堆内存(存数据,对象)用的数据就是哈希表。因为对象的自身特点不同,有可能哈希算法的依据也不同。所以有可能要覆盖hashCode方法。Object的hashCode方法是本地方法调用的是windows的底层算法 几乎很少有冲突,,所以就没法保证唯一性,所以要定义自己的算法来覆盖。

    技巧:为了保证唯一 一般在age后乘以一个数,因为很有可能两个人名字不同年龄不同但是算出的哈希值相同,这样会多判断一次equals,equals进栈会低效,所以为保证性能与唯一
    乘以个数。。。。
    TreeSet 不让它自动排序 可以控制return值 存入顺序和取出顺序一致则return正数 存入顺序和取出顺序相反return负数。

    TreeSet判断元素唯一性的方式,是比较方法的返回值是否为0.如果是0,视为元素相同,不存。

    排序方式有两种:
    1,让元素自身具备比较性,该元素需要实现Comparable接口,覆盖compareTo方法。让元素具备了自然排序。该种方式有弊端,如果元素自身具备的自然排序不是所需要的,怎么办?还有,万一元素根本就不具备自然排序怎么办?
    2,可以让容器自身具备比较性,而且应该添加元素之前。所以应该在容器对象创建时,就必须明确比较性。那就应该参考该容器的构造函数。发现可以指定一个比较器,定义一个Comparator接口的子类,并覆盖compare方法。将Comparator接口的子类对象作为参数传递给TreeSet集合的构造函数。

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

    两种数据结构:
    堆栈:先进后出First In Last Out (FILO)
    队列:先进先出First In First Out (FIFO)

    既要速度快 又要有序 可以选择LinkedHashSet


    Map

    Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用户标识集合里的每项数据。同一个Map对象的任何两个key通过equals方法比较总是返回false。

    HashMap,TreeMap是我们经常会用到的集合类。

    Map集合与Set集合、List集合的关系

    1.与Set集合的关系
    如果 把Map里的所有key放在一起看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复),实际上Map确实包含了一个keySet()方法,用户返回Map里所有key组成的Set集合。
    2.与List集合的关系
    如果把Map里的所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中索引不再使用整数值,而是以另外一个对象作为索引。

    怎样决定何时使用HashMap何时使用TreeMap?

    对 于插入、删除、定位元素频繁的操作,HashMap提供了最好的效率。如果想要按key的排序来遍历,那么TreeMap是不二选择。某些情况下,依赖集 合的大小,先向HashMap中添加元素,然后转换为TreeMap再按key的排序进行遍历也许会带来效率上的提高。

    HashMap

    HashMap的数据结构:

    数组的特点是:寻址容易,插入和删除困难;
    
    而链表的特点是:寻址困难,插入和删除容易。
    
    哈希表结合了两者的优点。
    
    哈希表有多种不同的实现方法,可以理解将此理解为“链表的数组”
    

    HashTable与HashMap的区别

    HashTable和HashMap存在很多的相同点,但是他们还是有几个比较重要的不同点。

    我们从他们的定义就可以看出他们的不同,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

    HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。如下:当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

    Hashtable的方法是同步的,而HashMap的方法不是。所以有人一般都建议如果是涉及到多线程同步时采用HashTable,没有涉及就采用HashMap,但是在Collections类中存在一个静态方法:synchronizedMap(),该方法创建了一个线程安全的Map对象,并把它作为一个封装的对象来返回,所以通过Collections类的synchronizedMap方法是可以我们你同步访问潜在的HashMap。

    遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

    相关文章

      网友评论

          本文标题:Java集合框架

          本文链接:https://www.haomeiwen.com/subject/sasscxtx.html