java集合

来源:互联网 发布:怎么删除mac上的文件 编辑:程序博客网 时间:2024/06/06 19:46

集合框架


       集合框架的组成及分类。

       集合中会有很多已知实现类,如:ArrayList,HashMap等。为什么会有这么多的类,因为每个类对数据的存储方式不同。存储方式也称为:数据结构。

       集合中存储的都是对象的引用(地址)。


 Collection接口

一.概述

        Collection表示一组对象,这些对象也成为Collection的对象。一些Collection允许有相同的元素,另外一些不允许有相同的元素。一些Collection是有序的,而另外一些是无序的。JDK不提供次接口的任何直接实现,它提供更具体的子接口(如Set,List)实现。

       Collection接口

       |-List  子接口,元素是有序的,元素可以重复,该集合体系有索引。

       |-Set  子接口,元素是无序的,元素不可以重复,该集合体系没有索引。


二.共性方法:

        1.添加元素  boolean  add(Object  obj);

        2.删除元素  boolean  remove(Object obj);//删除指定元素
                              void  clear();//移除所有元素
        3.判断元素  boolean contains(Object obj);//判断是否包含obj
                              boolean  isEmpty();//判断是否为空
        4.获取长度  int  size();//集合中的元素数。
        5.取交集元素  boolean  retainAll(obj);

三.迭代器:

       1.概述:

  迭代器就是集合取出元素的方式。 把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。取出方式就被定义成了内部类。但是每一个容器的数据结构不同,所以取出的方式也不同,取出的动作细节也不同,但是有共性内容判断和取出,将共性内容抽取。所以这些内部类都符合一些规则,这个规则就是迭代器(Iterator)。如何获取集合的取出对象呢?通过一个对外提供的方法:iterator()。

       2.方法:

       hasNext();//判断是否有下一个元素

       next();//返回下一个元素

       remove();//删除元素



                                                                        List接口

一.概述

       有序的Collection。此接口可以对列表中元素的位置精确定位,用户可以根据索引定位元素。 List集合有索引,所以可以操作角标的方法都是List特有方法。

       List接口           元素是有序的,元素可以重复,该集合体系有索引。

       |-ArrayList        底层的数据结构使用的是数组结构。特点是:查询速度快,增删稍慢,线程不同步。

       |-LinkedList      底层的数据结构使用的是链表数据结构。特点是:增删速度快,查询慢,线程不同步。

       |-Vector           底层的数据结构使用的是数组结构。线程同步。效率低,被ArrayList替代。


二.List特有方法

       1.增   
                add(index,element);
                addAll(index,collection);
       2.删   

                remove(index);//删除列表中指定位置元素
       3.改  

                set(index,element);
       4.查   

                get(index);
                subList(from, to);//包括头,不包括尾
                listIterator();//List集合特有的迭代器。

三.ListIterator

       List接口提供了特有的迭代器ListIterator。除了允许Iterator接口提供的正常操作外,该迭代器还允许元素插入和替换。

       ListIterator特有方法:

       add();//添加元素

       set();//替换元素

       remove();//移除元素


四.LinkedList

        特有方法:

    1.增  

        addFirst();将指定元素插入到列表的开头

        addLast();将指定元素插入到列表的结尾

     2.获取   

        getFirst();获取列表的第一个元素,如果列表中没有元素,会出现NoSuchElementException异常

        getLast();获取列表的最后一个元素,如果列表中没有元素,会出现NoSuchElementException异常

       3.删 

        removeFirst();移除并返回第一个元素,如果列表中没有元素,会出现NoSuchElementException异常

        removeLast();移除并返回最后一个元素,如果列表中没有元素,会出现NoSuchElementException异常


       JDK1.6出现替代方法:

      1.增 

        offerFirst();

        offerLasr();

      2.获取  

        peekFirst();获取列表的第一个元素,如果列表中没有元素,会返回null

        peekLast();获取列表的最后一个元素,如果列表中没有元素,会返回null

     3.删 

        pollFirst();移除并返回第一个元素,如果列表中没有元素,会出现返回null

        pollLast();移除并返回最后一个元素,如果列表中没有元素,会出现返回null



        LinkedList    示例:
      
       


        ArrayList     示例:


       


Set接口

一.概述

       一个不包含重复元素的Collection。
       Set已知实现类     元素是无序的,元素不可以重复,该集合体系没有索引。
       |-HashSet            底层数据结构是哈希表。HashSet通过hashCode和equals这两个方法保证元素唯一性的。
       |-TreeSet             底层数据结构是二叉树。TreeSet通过compareTo方法保证元素唯一性的。

二.HashSet

      此类实现Set接口,有哈希表支持。不保证迭代顺序,线程是不同步的。
      HashSet元素不可以重复,是如何保证元素唯一性的?
      通过元素的两个方法hashCode()和equals()来完成的,如果元素的hashCode的值相同,才会判断equals是否为true。如果元素的hashCode的值不同,就不会调用equals。
      注意:对于判断元素是否存在,以及删除等操作,依赖的是hashCode()和equals()方法。
      示例:


       


三.TreeSet

        底层的数据结构是二叉树。  TreeSet有两种排序方式,第一种是自然排序,使用元素的自然顺序对元素进行排序。第二种是比较器排序,根据创建对象时提供的Comparator排序。线程是不同步的。注意:当主要条件相同时,在比较次要条件。两种方式都存在时,以比较器为主。

      1.TreeSet排序的第一种方式:让元素自身具比较性。

      元素需要实现Comparable接口,覆盖compareTo方法,这种方法也称为:元素的自然比较,或者默认顺序。
      示例:
           
     


      2.TreeSet排序的第二种方式:当元素自身不具备比较性时,或者是具备的比较性不是所需要的时,这时需要让集合具备比较性。

      定义了比较器,将比较器对象作为参数传到TreeSet集合构造函数中。定义一个类,实现Comparator接口,覆盖compare方法。
      示例:
  
     


                                                                                       Map接口

一.概述

      该集合存储键值对Map<k,v>,一对一对往里存,而且要保证键的唯一性。
      Map接口
      |-HashMap       底层是哈希表数据结构,不可存入null键null值,线程是同步的。不安全一般不用。
      |-HashTable     底层是哈希表数据结构,允许存入null键null值,线程是不同步的。效率高。
      |-TreeMap        底层是二叉树数据结构,线程是不同步的,可以用于给Map集合中的键排序。
      什么时候使用Map集合?
      当数据之间存在映射关系,就要想到Map集合。

二.Map集合的常用方

      1.添加

      put(key,value);//如果出现添加相同的键,后添加的值会覆盖原有的键以及对应的值,并且put方法会返回被覆盖的值。

      putAll(Map<? extends K ,? extends V>  m);
      2.删除
      remove(key);//删除指定键以及对应的值

      clear();//删除集合中所有元素
      3.判断

      containsValue(value);//判断是否包含value
      containsKey(key);//判断是否包含键key
      isEmpty();//判断是否为空
      4.获取

      get(key);//通过键获得值
      size();//获取集合的长度 
      entrySet(); //Map两种取出方式
ketSet();

三.Map集合的两种取出方式

Map集合取出原理:先将Map集合转成Set集合,再通过迭代器取出

将Map集合中所有的键存到Set集合中,因为Set集合具备迭代器,取出Set集合中的键,通过Map集合的get(key)方法获取键对应的值。

1.Set<v> keySet
 

示例:


       


2 .Set<Map.Entry<k,v>> entrySet
将Map集合中所有的键存到Set集合中,取出Set集合中的键,键的数据类型是Map.Entry。通过Map集合的gatValue()和getKey()方法获取值。

示例:

       


        综合示例:


       


四.Map应用

      1. 示例:
      
       

       2.示例
      
         


其他

 Collections:用于操作集合的工具类

Arrays:用于操作数组的工具类


static <T>  List <T>  aslist()     将数组变成集合
把数组变成集合有什么好处?
可以使用集合的思想和方法操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删操作,因为数组是固定长度的。
如果数组中的元素是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。如果数组中的元素是基本数据类型,变成集合时,数组就作为集合的元素存在。

集合变数组
指定类型的数组长度到底要定义多长呢?
当指定类型的数组长度小于集合的size时,该方法内部会自动创建一个新的数组,长度为集合的size。当指定类型的数组长度大于集合的size是,不会创建数组了,使用传递进来的数组。所以要创建一个刚刚好的数组最优。
为什么将集合变成数组?
为了限定对元素的操作,不能进行增删了。


      


0 0
原创粉丝点击