zoukankan      html  css  js  c++  java
  • 黑马程序员JAVA基础Java 集合之List 集合

      List 接口是 Collection 的一个子接口。List 集合代表一个有序集合,集合中每个元素都是有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。

    一.List 接口:

      List 作为 Collection 的一个子接口,除了可以使用Collection 接口里的所有方法外,还有特有的一些方法:

      1、增加:

      void add(int index , Object element) : 在集合列表指定位置插入element 元素。

      boolean addAll(int index , Collection c) : 在集合列表指定位置插入一组数据。

      2、删除:

      Object remove(int index) : 删除并返回index 索引处的元素。

      3、修改:

      Object set(int index , Object element) : 将index 索引处的元素替代成element 对象,返回新元素。

      注意:所指定的索引index 必须是List 集合的有效索引,不能越界。如:集合长度为4 ,就不能指定索引为4 处的元素。

      4、查找:

      int indexOf(Object o) 返回对象o在List集合中出现的位置索引。

      int lastindexOf(Object o) 返回对象o 在List集合中最后一次出现的位置索引。

      Object get(int index) 返回集合index 索引处的元素。

      List subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间所有元素组成的子元素。 

     1 public class ListDamo {
     2     
     3     public static void main(String[] args)
     4     {
     5 //        创建List 子接口实现类对象
     6         ArrayList books = new ArrayList() ; 
     7         
     8 //        添加元素。
     9         books.add("诛仙1") ; 
    10         books.add("诛仙2") ;
    11         books.add("诛仙3") ;
    12         books.add("诛仙4") ; 
    13         ForeachMethod(books) ; 
    14 //        在指定位置添加元素:
    15         books.add(1 , "诛仙6") ;
    16         books.add(2 , "诛仙7") ;
    17         IteratorMethod(books) ; 
    18 //        删除指定位置的元素:
    19         books.remove(1)  ;
    20         ForeachMethod(books) ;
    21         
    22         ArrayList books1 = new ArrayList() ; 
    23         books1.add("笑傲江湖") ; 
    24         books1.add("射雕英雄传") ; 
    25         books1.add("神雕侠侣") ; 
    26         
    27 //        在指定位置添加一组元素:
    28         books.addAll(1, books1) ;
    29         IteratorMethod(books) ; 
    30         
    31 //        修改指定位置的元素:
    32         books.set(5, "我修改了") ;
    33         IteratorMethod(books) ; 
    34         
    35 //        返回指定元素:
    36         System.out.println("get(1):"+ books.get(1));
    37         
    38     } 
    39     public static void ForeachMethod(ArrayList books)
    40     {
    41         System.out.println("------我是foreach 遍历的结果------");
    42 //        用foreach 遍历
    43         for(Object obj : books)
    44         {
    45             String book = (String) obj ;
    46             System.out.println(obj); 
    47         }
    48     }
    49     public static void IteratorMethod(ArrayList books)
    50     {
    51         System.out.println("------我是Iterator 遍历的结果------");
    52         Iterator it = books.iterator() ; 
    53         while(it.hasNext())
    54         {
    55             String book = (String) it.next() ;
    56             System.out.println(book);
    57         }
    58     }
    59 }

      上面的遍历用了两种方法foreach 和 Iterator 迭代器。但其实List 集合有个特有的迭代器——ListIterator 。

    二.ListIterator 接口

      ListIterator 接口是Iterator的子接口。但Iterator 接口中的方法有限只有判断(hasNext()),取出(next()),删除(remove())操作 。 而ListIterator 提供了专门操作List 的方法,ListIterator 接口在 Iterator 接口基础增加了如下方法:

      > boolean hasPrevious() ; 返回该迭代器关联的集合是否还有上一个元素。

      > Object previous() : 返回该迭代器的上一个元素。

      > void add() : 在指定位置上添加插入一个元素。

     1 public class ListIteratorText {
     2     public static void main(String[] args)
     3     {
     4         ArrayList books = new ArrayList() ; 
     5 //        添加元素:
     6         books.add("诛仙1") ; 
     7         books.add("诛仙2") ; 
     8         books.add("诛仙") ;
     9 //        用ListIterator 遍历
    10         ListIterator li = books.listIterator() ; 
    11 //        向后遍历
    12         System.out.println("-------我是向后遍历-------");
    13         while(li.hasNext())
    14         {
    15             String book = (String) li.next()  ;
    16 //            如果li的下一个对象为"诛仙"这把它修改为"天龙八部" 
    17             if(book.equals("诛仙")) 
    18                 li.set("天龙八部") ; 
    19 //            在每一个元素后面添加"----我是分割线---" 对象。
    20             li.add("----我是分割线---") ;
    21             System.out.println(book);
    22         } 
    23         System.out.println("-------我是向前遍历-------");
    24 //        像前遍历
    25         while(li.hasPrevious())
    26         {
    27             String book = (String) li.previous(); 
    28             System.out.println(book);
    29         } 
    30     }
    31 }

      注意:在迭代时,不可以通过集合对象的方法操作集合中的元素,只能用迭代器中的方法操作集合中的元素:增加、修改、删除。

      

    三.LinkedList 实现类

      LinkedList 不仅实现了 List 接口,还实现了Queue 接口的子接口 Deque 接口, 其中Deque 接口 代表一个双向队列。所以,LinkedList 实现类底层的数据结构是链表,其特点是:增删很快,但查询稍慢。

      所以LinkedList 除了实现List 接口中所有方法外,还实现了 Deque 接口中的可以双向操作队列的方法:

      1、增加:

        void addFirst(Object o) ;将指定元素插入该双向队列的开头。  

        void addLast(Object o) ;将指定元素插入该双向队列的结尾:

      JDK 1.6 出现的方法: 

        boolean offerFirst(Object o ) ; 将指定元素插入该双向队列的开头 

        boolean offerLast(Object o) ;将指定元素插入该双向队列的结尾。

      2、删除: 

        removeFirst() ;  获取、并删除第一个元素,如果双端队列为空,则会出现NoSuchElementException异常

        removeLast() ;  获取、并删除最后一个元素,如果双端队列为空,则会出现NoSuchElementException异常

      JDK 1.6 出现的方法

        Object pollFirst() ;  获取、并删除第一个元素,如果双端队列为空,则会返回null

        Object pollLast() ;  获取、并删除最后一个元素,如果双端队列为空,则会返回null

      3、获取:

        Object getFirst() ; 获取、但不删除该队列的第一个元素。如果为空,将会出现NoSuchElementException异常

        Object getLast() : 获取、但不删除该队列的最后一个元素。如果为空,将会出现NoSuchElementException异常

      JDK 1.6 出现的方法

        Object peekFirst() : 获取、但不删除第一个元素,如果双端队列为空,则会返回null 。

        Object peekLast() : 获取、但不删除最后一个元素,如果双端队列为空,则会返回null 。

      所以,在创建LinkedList 实例后,应使用 JDK 1.6 出现的方法。

     1 public class LinkedListDemo {
     2     
     3     public static void main(String[] args)
     4     {
     5         LinkedList linkList = new LinkedList() ; 
     6 //        添加,全在链表队列头添加元素。
     7         linkList.addFirst("笑傲江湖01");
     8         linkList.addFirst("笑傲江湖02");
     9         linkList.addFirst("笑傲江湖03");
    10         linkList.addFirst("笑傲江湖04");
    11         System.out.println(linkList);
    12 //        如果linkList 双向队列有最后一元素
    13         while(linkList.peekLast()!= null)
    14 //            获取并且删除最后一元素。
    15             System.out.println(linkList.pollLast() ); 
    16     }
    17 }

      4、使用 LinkedList 模拟一个堆栈或者队列数据结构

       首先:堆栈是先进后出,队列是先进先出; 

     1 class StackDemo
     2 {
     3     private LinkedList stack  ; 
     4 //    构造函数。
     5     StackDemo()
     6     {
     7         stack = new LinkedList() ; 
     8     }
     9 //    添加方法
    10     public void PushMethod(Object obj)
    11     {
    12         stack.offerFirst(obj) ; 
    13     }
    14 //    取出方法
    15     public Object  PopMethod()
    16     {
    17         return stack.pollFirst() ; 
    18     }
    19 //    判断堆栈是不是为空
    20     public boolean IsEmpty()
    21     {
    22         return stack.isEmpty() ; 
    23     }
    24 }
    25 //模拟队列
    26 class QueueDemo
    27 {
    28     private LinkedList stack  ; 
    29 //    构造函数。
    30     QueueDemo()
    31     {
    32         stack = new LinkedList() ; 
    33     }
    34 //    添加方法
    35     public void PushMethod(Object obj)
    36     {
    37         stack.offerLast(obj) ; 
    38     }
    39 //    取出方法
    40     public Object  PopMethod()
    41     {
    42         return stack.pollFirst() ; 
    43     }
    44 //    判断堆栈是不是为空
    45     public boolean IsEmpty()
    46     {
    47         return stack.isEmpty() ; 
    48     }
    49 }

    四. ArrayList 和 Vector 实现类

      ArrayList 和Vector 是List 接口的实现类,完全支持前面介绍的List 接口的全部功能。而且,两个实现类都是基于数组实现的List 类。

      ArrayList 和 Vector 类封装了一个动态再分配Object[] 数组。每个 ArrayList 和 Vector 对象有一个 capacity 属性(表示它们封装的Object[] 数组的长度),当向ArrayList 和Vector 对象中添加元素时,它们的capacity 会自动增加。 

      ArrayList 和Vector 类的区别:

      1、Vector 是一个很老的集合(JDK1.0) 就出现了;ArrayList 类是 (JDk 1.2 ) 出现的。所以 Vector 类中的方法名字很长,切很多方法重复。

      2、Vector 是线程安全的,而ArrayList 是线程不安全的。所以Vector 的性能比 ArrayList 的性能要低。而且Collections 工具类,可以将一个ArrayList 变成线程安全类。

      所以:尽量少用 Vector 类。

      练习 ArrayList :

      除去ArrayList 集合中的重复元素: 

     1     public static ArrayList SingleElement(ArrayList list)
     2     {
     3 //        创建新的ArrayList 对象。
     4         ArrayList alist = new ArrayList() ;
     5         
     6 //        遍历 list 实体。
     7         for(Object obj : list)
     8         {
     9 //            判断该对象在 alist 集合中是否存在。
    10             if( !alist.contains(obj) )
    11                     alist.add(obj) ; 
    12         }
    13         return alist ;
    14     }

      不过,如果要判断一个对象是否相等要在对象类中重写Object 类中的equals() 方法。

       

  • 相关阅读:
    Mysql安装
    mysql 密码过期
    svn 合并分支
    idea 分支主干管理
    linux删除数据恢复,extundelete
    linux 转换文件编码
    sina 接口 根据ip获取各个国家和地区
    SQL中char、varchar、nvarchar的区别
    C#中virtual和abstract区别,举例子
    父类和子类的关系、代码例子
  • 原文地址:https://www.cnblogs.com/jbelial/p/2984754.html
Copyright © 2011-2022 走看看