zoukankan      html  css  js  c++  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。

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

  • 相关阅读:
    灭霸冲刺(7)
    灭霸冲刺(6)
    灭霸冲刺(5)
    灭霸冲刺(4)
    pip安装软件或模块时提示cannot import name 'main'
    mysql的安装与使用
    channels 2.x的使用
    charlesmitmproxyappium的安装与使用
    centos中redis安装
    django+nginx+gunicorn+pipenv微信小程序实践笔记
  • 原文地址:https://www.cnblogs.com/Newbie-Cai/p/5793951.html
Copyright © 2011-2022 走看看