你的位置:首页 > Java教程

[Java教程]【Java学习笔记】集合框架Ⅱ


迭代

    ●迭代是取出集合中元素的一种方式。

    ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。

    ●用法:

第一种

for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个{  System.out.println(iter.next());    }

第二种

Iterator iter = l.iterator();while(iter.hasNext()){   System.out.println(iter.next());}

迭代注意事项

    ●迭代器在Collection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。

    ●迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

    ●迭代器的next方法返回值类型是Object,所以要记得类型转换。

 

集合框架中的常用接口

    Collection接口有两个子接口:List(列表),Set(集)

    List:可以存放重复元素,元素存取是有序的(存入和取出的顺序一致)。

    Set:不可以存放重复元素,元素存取是无序的。

List接口

    List特有的常见方法:有一个共同特点就是都可以操作角标。

    1、添加

        void   add(int index , E element);

         void    add(int index , Collection<? extends E> c);

       boolean  addAll(int index , Collection<? extends E> c);

      

 1 import java.util.ArrayList; 2  3 public class Test { 4  5   public static void main(String[] args) { 6     ArrayList al = new ArrayList(); 7     al.add("dfsdf"); 8     al.add("ere"); 9     al.add("fgf");10     11     ArrayList a2 = new ArrayList();12     a2.add("dfsdf");13     a2.add("ere");14     a2.add("fgf");15     16     17     al.addAll(1, a2);18     19     System.out.println(al);20     21     al.add(1, a2);22     System.out.println(al);23 24   }25 26 }

 

    2、删除:

        E  remove(int index);

    3、修改:

        E  set(int index, E element);

    4、获取:

        E  get(int index);

        int  indexOf(Object o);

        int  lastIndexOf(Object o);

        List  subList(from , to); //不包尾

 

List集合是可以完成对元素的增删改查。

List子接口:

    Vector:内部是数组数据结构,是同步的。增删,查询都很慢。

    ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。

    LinkedList:内部是链表数据结构,是不同步的,增删元素的速度很快。

LinkedList常用方法:

    void  addFirst(E e);

    void  addLast(E e);

    jdk1.6

    boolean  offerFirst(E e);

    boolean  offerLast(E e);

    

 

    E    getFirst();   //获取但不移除,如果链表为空,抛出NoSuchElementException

    E    getLast();

    jdk1.6

    E   peekFirst();  //获取但不移除,如果链表为空,返回null。

    E   peekLast();

 

    E  removeFirst(); //获取但不移除,如果链表为空,抛出NoSuchElementException

    E  removeLast();

    jdk1.6

    E  pollFirst();  //获取但不移除,如果链表为空,返回null。

    E  pollLast();

 

Set接口:

      元素不可以重复,是无序的。

      Set接口中的方法和Collection一致。

Set子接口:

                 HashSet:

          内部数据结构是哈希表,是不同步的。

          

                               如何保证集合的元素唯一性呢?

            是通过对象的hashCode和equals方法来完成对象的唯一性的。

              如果对象hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。

             如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。

                如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

 

         记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。

         一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖hashCode,equals方法。

 

      TreeSet:

          可以对Set集合中的元素进行排序,是不同步的。

          判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。

 

            TreeSet对元素进行排序的方式一:

                   让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖ComparaTo方法。

 

            如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然排序,怎么办?

                  那就使用方式二。

            方式二:

                  让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。

                   将该对象作为参数传递给TreeSet集合的构造函数。

 

集合的一些技巧

    需要唯一性吗?

      需要:Set

          需要制定顺序吗?

 

              需要:TreeSet

 

              不需要:HashSet

 

              但是想要一个和存储一致的顺序(有序):LinkedHashSet

 

      不需要:List

        需要频繁增删吗?

          需要:LinkedList

          不需要:ArrayList

 

    如何记住每一个容器的结构和所属体系呢?

      看名字!!!

     List

      --ArrayList

      --LinkedList

    Set

      --HashSet

      --TreeSet

    后缀名就是该集合所属的体系。

    前缀名就是该集合的数据结构。

 

    看到array:就要想到数组,就要想到查询快,有角标。

    看到link:就要想到链表,就要想到增删快,就要想到 add/get/remove +   First/Last的方法。

    看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode和equals方法。

    看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable,Comparator。

 

    而且通常这些常用的集合容器都是不同步的。