zoukankan      html  css  js  c++  java
  • 黑马程序员——java学习8(166-179)——集合,Collection,List

    1、集合

    存储对象的方式

    1.1、区别于数组

    (1)集合长度可变,数组长度固定

    (2)集合只能存对象,数组存储基本数据类型

    同:存的都是地址,

    1.2、CPUD

    1.3、迭代器(内部类比作抓娃娃机,迭代过程比作爪子,爪子各不相同,功能有共性,都在机器内部)

     

    集合取出元素的方式

     1 import java.util.*;
     2 class  CollectionDemo
     3 {
     4     public static void main(String[] args) 
     5     {
     6         
     7         method_get();
     8 
     9 
    10     }
    11     public static void method_get()
    12     {
    13         ArrayList al=new ArrayList();
    14         al.add("java1");
    15         al.add("java2");
    16         al.add("java3");
    17         al.add("java4");
    18 
    19         /*
    20         Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素    接口不能创建对象,通过集合的iterator方法,返回迭代器。
    21         while(it.hasNext())
    22         {
    23             sop(it.next);
    24         }
    25         */
    26         for(Iterator it=al.iterator();it.hasNext();)
    27         {
    28             sop(it.next());
    29         }
    30 
    31     }
    32     public static void method_2()
    33     {
    34         ArrayList al1=new ArrayList();
    35         al1.add("java1");
    36         al1.add("java2");
    37         al1.add("java3");
    38         al1.add("java4");
    39 
    40         ArrayList al2=new ArrayList();
    41         al2.add("java1");
    42         al2.add("java2");
    43         al2.add("java5");
    44         al2.add("java6");
    45         
    46         //al1.retainAll(al2);//取交集,al1中只保留和al2中相同的元素
    47         al1.removeAll(al2);//去掉相同,留不同
    48         
    49         sop("al1:"+al1);
    50         sop("al2:"+al2);
    51     }
    52     public static void base_method()
    53     {
    54         //创建一个集合容器,使用Collection接口的子类,ArrayList
    55         ArrayList al=new ArrayList();
    56 
    57         //1、添加元素
    58         al.add("java1");//add(Object obj)
    59         al.add("java2");
    60         al.add("java3");
    61         al.add("java4");
    62 
    63         //打印原集合
    64         sop("原集合"+al);
    65         //3、删除元素
    66         //al.remove("java2");
    67         //al.clear();清空
    68 
    69         //4、判断元素
    70         sop("java03是否存在:"+al.contains("java03"));
    71         sop("集合是否为空?"+al.isEmpty());
    72         //2、获取个数,集合长度
    73         sop("size:"+al.size());
    74         //打印改变后的集合
    75         sop(al);
    76     }
    77     public static void sop(Object obj)
    78     {
    79         System.out.println(obj);
    80     }
    81 }

    Collection

      |--List:元素有序,可以重复,因为该集合体有索引(下标)

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

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

        |--Vector:底层是数组数据结构,线程同步,被ArrayList替代

      |--Set:元素无序,元素不可以重复。

    1.4、List

      特有方法,凡是可以操作角标的方法都是该体系特有的方法

      add(index,element);

      addAll(index, Collection);

      remove(index);

      set(index,element)

      get(index);    

      subList(from,to);

      listIterator();

     1 package learn;
     2 
     3  import java.util.*;
     4 class  ListDemo
     5 {
     6     public static void sop(Object obj)
     7     {
     8         System.out.println(obj);
     9     }
    10     public static void method()
    11     {
    12         ArrayList al=new ArrayList();
    13         al.add("java01");
    14         al.add("java02");
    15         al.add("java03");
    16         
    17         
    18         sop("原集合是"+al);
    19         //在指定位置添加元素
    20         al.add(1,"java09");
    21 
    22         //删除指定位置元素
    23         //al.remove(2);
    24     
    25         //修改元素
    26         //al.set(2,"java07");
    27 
    28         //通过角标获取元素        
    29         //sop(al.get(1));
    30         //获取所有元素
    31         for(int x=0;x<al.size();x++)
    32         {
    33             sop("al("+x+")="+al.get(x));
    34         }
    35         Iterator it=al.iterator();
    36         while(it.hasNext())
    37         {
    38             sop("next:"+it.next());
    39         }
    40         //通过indexOf获取对象的位置
    41         sop("index="+al.indexOf("java02"));
    42         List sub=al.subList(1,3);
    43         sop("sub="+sub);
    44     }
    45     public static void main(String[] args) 
    46     {
    47         //演示列表迭代器
    48         ArrayList al=new ArrayList();
    49         al.add("java01");
    50         al.add("java02");
    51         al.add("java03");
    52     
    53         ListIterator li=al.listIterator();
    54         
    55         while(li.hasNext())
    56         {
    57             Object obj=li.next();
    58             if(obj.equals("java02"))
    59 //                li.add("java09");
    60                 li.set("java006");
    61         }
    62         while(li.hasPrevious())
    63         {
    64             sop("pre: "+li.previous());//逆向遍历
    65         }
    66 //        sop("hasNext: "+li.hasNext());
    67 //        sop("hasPrevious: "+li.hasPrevious());
    68         sop(al);
    69 //        Iterator it=al.iterator();
    70 //        
    71 //        //在迭代过程中,准备添加或者删除元素
    72 //        while(it.hasNext())
    73 //        {
    74 //            Object obj=it.next();
    75 //            if(obj.equals("java02"))
    76 ////                al.add("java008");    //异常,有两个方法并发
    77 //                it.remove();    //元素还是内存中,只是从集合中移除了地址
    78 //            sop("obj="+obj);
    79 //                
    80 //        }
    81 //        sop(al);
    82     }
    83 }

    1.4.1、ListIterator

     List集合特有迭代器 ListIterator是Iterator的子接口

    在迭代时,不可通过集合对象的方法,操作集合中的元素,

    因为会发生并发修改异常
    ConcurrentModificationException异常

    Iterator: 判断,取出,删除

    ListIterator: 添加,修改

    1.4.2、枚举

     1 package learn;
     2 import java.util.*;
     3 /*
     4  * 枚举就是Vector特有的取出方式
     5  * 发现枚举和迭代器很像,因为枚举的名称以及方法的名称都过长
     6  * 所以被迭代器取代了
     7  * IO中会用到
     8  * */
     9 public class VectorDemo {
    10     public static void main(String[] args) {
    11         Vector v=new Vector();
    12         v.add("java01");
    13         v.add("java02");
    14         v.add("java03");
    15         v.add("java04");
    16         
    17         Enumeration en=v.elements();
    18         
    19         while(en.hasMoreElements())
    20         {
    21             System.out.println(en.nextElement());
    22         }
    23         
    24     }
    25 }

     LinkedList练习

     1 package learn;
     2 
     3 import java.util.LinkedList;
     4 
     5 /*
     6  * 使用LinkedList模拟一个堆栈或者队列数据结构
     7  * 堆栈:先进后出,杯子
     8  * 队列:先进先出, first in first out FIFO,水管
     9  * */
    10 class Duilie
    11 {
    12     private LinkedList link;
    13     Duilie()
    14     {
    15         link = new LinkedList();
    16     }
    17     public void myAdd(Object obj)
    18     {
    19         link.addFirst(obj);
    20     }
    21     public Object myGet()
    22     {
    23         return link.removeLast();
    24     }
    25     public boolean isNull()
    26     {
    27         return    link.isEmpty();
    28     }
    29     
    30     
    31 }
    32 public class LinkedListTest {
    33     public static void main(String[] args) {
    34         Duilie dl=new Duilie();
    35         dl.myAdd("java01");
    36         dl.myAdd("java02");
    37         dl.myAdd("java03");
    38         dl.myAdd("java04");
    39         while(!dl.isNull())
    40         {
    41             System.out.println(dl.myGet());
    42         }
    43     }
    44 }
     1 package learn;
     2 
     3 import java.util.LinkedList;
     4 /*
     5  * LinkedList特有方法
     6  * addFirst()
     7  * addLast() ----offer
     8  * getFirst()
     9  * getLast()----peak   jdk1.6  没有则返回null
    10  * 获取元素,不删除
    11  * removeFirst()
    12  * removeLast()----poll
    13  * 获取元素,删除,若集合没元素会出现NoSuchElementException
    14  * */
    15 public class LinkListDemo {
    16     public static void main(String[] args) {
    17         LinkedList link=new LinkedList();
    18         link.addFirst("java01");
    19         link.addFirst("java02");
    20         link.addFirst("java03");
    21         link.addFirst("java04");
    22 //        sop(link);
    23 //        sop(link.getFirst());
    24 //        sop(link.getLast());
    25 //        sop(link.removeFirst());
    26 //        sop("size="+link.size());
    27         while(!link.isEmpty())
    28         {
    29             sop(link.removeLast());
    30         }
    31     }
    32     public static void sop(Object obj)
    33     {
    34         System.out.println(obj);
    35     }
    36 }

    去除ArrayList集合中的重复元素

     1 package learn;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 
     6 /*
     7  * 去除ArrayList集合中的重复元素 
     8  * */
     9 public class ArrayListTest {
    10     public static void main(String[] args) {
    11         ArrayList al=new ArrayList();
    12         al.add("java01");
    13         al.add("java02");
    14         al.add("java01");
    15         al.add("java02");
    16         al.add("java01");
    17 //        al.add("java03");
    18         /*
    19          * 在迭代器循环中next调用一次,就要hasNext判断一次
    20         Iterator it=al.iterator();
    21         while(it.hasNext())
    22         {
    23             sop(it.next()+"..."+it.next());
    24         }
    25         */
    26         sop(al);
    27         al=singleElement(al);
    28         sop(al);
    29         
    30     }
    31     public static void sop(Object obj)
    32     {
    33         System.out.println(obj);
    34         
    35     }
    36     public static ArrayList singleElement(ArrayList al)
    37     {
    38         ArrayList newal=new ArrayList();
    39         Iterator it=al.iterator();     //根据传递进来的arraylist创建迭代器,存放如全新的newal
    40         while(it.hasNext())
    41         {
    42             Object obj=it.next();
    43             if(!newal.contains(obj))
    44             {
    45                 newal.add(obj);
    46             }
    47             
    48         }
    49         return newal;
    50     }
    51 }
     1 package learn;
     2 
     3 /*
     4  *将自定义对象作为元素存到ArrayList集合中,并去除重复元素
     5  *比如:存入对象,同姓名,同年龄,视为同一个人,为重复元素 
     6  * */
     7 import java.util.ArrayList;
     8 import java.util.Iterator;
     9 
    10 class Person{
    11     private String name;
    12     private int age;
    13     Person(String name,int age)
    14     {
    15         this.name=name;
    16         this.age=age;
    17     }
    18     //Person的字符串方法
    19     public boolean equals(Object obj)
    20     {
    21         
    22         if(!(obj instanceof Person))
    23             return false;
    24         Person p =(Person)obj;
    25         System.out.println(this.name+"..."+p.name);
    26         //字符串的equals方法
    27         return this.name.equals(p.name)&& this.age==p.age;
    28         
    29     }
    30     public String getName()
    31     {
    32         return name;
    33     }
    34     public int getAge()
    35     {
    36         return age;
    37     }
    38 }
    39 
    40 
    41 public class ArrayListTest2 {
    42     public static void sop(Object obj)
    43     {
    44         System.out.println(obj);
    45     }
    46     public static void main(String[] args) {
    47         
    48     
    49         ArrayList al=new ArrayList();
    50         al.add(new Person("lisi01",30));//al.add(Object obj);//Object obj=new Person("lisi01",30);
    51         al.add(new Person("lisi02",32));
    52         al.add(new Person("lisi02",32));
    53         al.add(new Person("lisi03",33));
    54         al.add(new Person("lisi04",35));
    55         al.add(new Person("lisi04",35));
    56         
    57         al=singleElement(al);
    58         sop("remover 03:"+al.remove(new Person("lisi03",33)));
    59         Iterator it=al.iterator();
    60         while(it.hasNext())
    61         {
    62 //            Object obj=it.next();
    63 //            Person p=(Person)obj;
    64             Person p=(Person)it.next();
    65             sop(p.getName()+"..."+p.getAge());
    66         }
    67         
    68     }
    69     public static ArrayList singleElement(ArrayList al)
    70     {
    71         //定义一个临时容器
    72         ArrayList newal=new ArrayList();
    73         Iterator it=al.iterator();     //根据传递进来的arraylist创建迭代器,存放如全新的newal
    74         while(it.hasNext())
    75         {
    76             Object obj=it.next();
    77             if(!newal.contains(obj))//contains中含有equals
    78             {
    79                 newal.add(obj);
    80             }
    81             
    82         }
    83         return newal;
    84     }
    85 }

    1.5、Set

    1.5.1、HashSet

     1 package learn;
     2 
     3 import java.util.HashSet;
     4 import java.util.Iterator;
     5 
     6 //|--Set:无序(存入、取出顺序不一致),元素不可重复
     7 //        |--HashSet:底层数据结构是哈希表
     8 //        |--HashSet是如何保证元素唯一性
     9             //通过元素的hashCode和equals
    10             //若元素HashCode值相同,才会判断equals是否为true
    11             //不同则不调
    12 //注意,对于判断元素是否存在,以及删除操作,依赖的方法是,元素的hashcode(先)和equals方法
    13 //set集合的功能时和Collection一致的
    14 public class HashSetDemo {
    15     public static void sop(Object obj){
    16         System.out.println(obj);
    17     }
    18     public static void main(String[] args) {
    19         //按照地址存进去的
    20         HashSet hs = new HashSet();
    21         
    22         //添加失败
    23         sop(hs.add("java01"));    
    24         sop(hs.add("java01"));    
    25         hs.add("java01");
    26         hs.add("java01");
    27         hs.add("java02");
    28         hs.add("java03");
    29         hs.add("java04");
    30         Iterator it=hs.iterator();
    31         while(it.hasNext())
    32         {
    33             sop(it.next());
    34         }
    35     }
    36 }
     1 package Test;
     2 import java.util.HashSet;
     3 import java.util.Iterator;
     4 /*
     5  * 往HashSet集合中存入自定义对象,姓名年龄相同视为重复对象
     6  * */
     7 class Person{
     8     private String name;
     9     private int age;
    10     Person(String name,int age)
    11     {
    12         this.name=name;
    13         this.age=age;
    14     }
    15     public int hashCode()
    16     {
    17         System.out.println(this.name+"...hashCode");
    18         return name.hashCode()+age*39;//防止相加后的哈希值相同
    19     }
    20     //Person的字符串方法
    21     public boolean equals(Object obj)
    22     {
    23         
    24         if(!(obj instanceof Person))
    25             return false;
    26         Person p =(Person)obj;
    27         System.out.println(this.name+"...equals..."+p.name);
    28         //字符串的equals方法
    29         return this.name.equals(p.name)&& this.age==p.age;
    30         
    31     }
    32     public String getName()
    33     {
    34         return name;
    35     }
    36     public int getAge()
    37     {
    38         return age;
    39     }
    40 }
    41 
    42 public class HashSetTest {
    43     public static void sop(Object obj)
    44     {
    45         System.out.println(obj);
    46     }
    47     public static void main(String[] args) {
    48         HashSet hs=new HashSet();
    49         hs.add(new Person("a1",11));
    50         hs.add(new Person("a2",12));
    51         hs.add(new Person("a3",13));
    52         hs.add(new Person("a2",12));
    53 //        hs.add(new Person("a4",14));
    54         Iterator it=hs.iterator();
    55         while(it.hasNext())
    56         {
    57             Person p=(Person)it.next();
    58             sop(p.getName()+"..."+p.getAge());
    59         }
    60     }
    61 }
  • 相关阅读:
    DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
    UVA10071 Back to High School Physics
    UVA10071 Back to High School Physics
    UVA10055 Hashmat the Brave Warrior
    UVA10055 Hashmat the Brave Warrior
    UVA458 The Decoder
    UVA458 The Decoder
    HDU2054 A == B ?
    HDU2054 A == B ?
    POJ3414 Pots
  • 原文地址:https://www.cnblogs.com/sunxlfree1206/p/4690816.html
Copyright © 2011-2022 走看看