zoukankan      html  css  js  c++  java
  • 大数据之路week01--day02_2 初始集合(Collection)

    1、对象数组(掌握)

      (1)数组既可以存储基本数据类型,也可以存储引用类型。它存储引用类型的时候的数组就叫对象数组。

      (2)案例:

        用数组存储5个学生对象,并遍历数组。(这里添加)

     1 package day02;
     2 
     3 /** 
     4 * @author WYH
     5 * @version 2019年11月12日 下午10:28:33
     6 */
     7 public class test {
     8     public static void main(String[] args) {
     9         Students[] s = new Students[5];
    10         
    11         Students s1 = new Students("xiao",21);
    12         Students s2 = new Students("da",22);
    13         
    14         s[0] = s1;
    15         s[1] = s2;
    16         
    17         for(int i = 0;i<s.length;i++) {
    18             System.out.println(s[i]);
    19         }
    20         
    21         
    22     }
    23 
    24 }

    2、集合(Collection)(掌握)

      (1)集合的由来?

        我们学习的时Java -- 面向对象 --操作很多对象 --存储 -- 容器(数组和StringBuffer)-- 数组而数组得长度固定,所以不适合做变化得需求,Java就提供了集合供我们使用。

      (2)集合和数组得区别?

        A: 长度区别

          数组固定

          集合可变

        B: 内容区别

          数组可以是基本类型,也可以是引用类型

          集合只能是引用类型

        C: 元素内容

          数组只能存储同一种类型

          集合可以存储不同类型(其实集合一般存储得也是同一种类型)

      (3)集合的继承体系结构?

          由于需求不同,Java就提供了不同得集合类,而这多个集合类得数据结构不同,但是他们都是要提供存储和遍历功能得容器,我们把他们得共性不断向上提取,

    最终就形成了集合得继承体系结构。

      Collection

        |--List

          |--ArrayList

          |--Vector

          |--LinkList

        |--Set

          |--HashSet

          |--TreeSet

      (4)Collection得功能概述(自己查询API文档)

        A: 添加功能

        B:删除功能

        C: 判断功能

        D: 获取功能

        E: 长度功能

        F: 交集(了解)

        G: 把集合转数组(了解)

      (5)Collection集合得遍历

        A: 把集合转数组(了解)

     1 package javaclassset;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 
     6 public class CollectionDemo3 {
     7 
     8     public static void main(String[] args) {
     9         Collection c1 = new ArrayList();
    10         
    11         c1.add("Hello"); //Object obj = "Hello"; 
    12         c1.add("world");
    13         c1.add("java");
    14         
    15         
    16         
    17         Object[] obj = c1.toArray();
    18         
    19         for(int i = 0;i<obj.length;i++) {
    20             String s = (String)obj[i];
    21             System.out.println(s);
    22         }
    23 
    24     }
    25 
    26 }

        B: 迭代器(集合专用方式)

     1 package javaclassset;
     2 
     3 import java.util.ArrayList;
     4 
     5 import java.util.Collection;
     6 import java.util.Iterator;
     7 
     8 public class CollectionDemo3 {
     9 
    10     public static void main(String[] args) {
    11         Collection c1 = new ArrayList();
    12         
    13         c1.add("Hello"); //Object obj = "Hello"; 
    14         c1.add("world");
    15         c1.add("java");
    16         
    17         
    18         //转数组for循环遍历
    19         Object[] obj = c1.toArray();
    20         
    21         for(int i = 0;i<obj.length;i++) {
    22             String s = (String)obj[i];
    23             System.out.println(s);
    24         }
    25           
    26         //迭代器遍历
    27         Iterator it = c1.iterator();
    28         
    29         while(it.hasNext()) {
    30             System.out.println(it.next());
    31         }
    32         }
    33 
    34     }

           (6)迭代器

        A: 是集合得获取元素得方式

        B: 是依赖于集合而存在得

        C:迭代器得原理和源码

          a:为什么定义为了一个接口而不是一个实现类(如果是实现类,那么就要提供具体得实现方法,但是我们的集合有很多种,所以是一个接口)

          b: 看了看迭代器的内部类实现

      (7)Collecton集合的案例(遍历方式 迭代器)

        集合的操作步骤:

          A: 创建集合对象

          B: 创建元素对象

          C: 把元素添加带集合

          D: 遍历集合

        A: 存储字符串并遍历

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 import java.util.Iterator;
     6 
     7 public class IteratorDemo1 {
     8     public static void main(String[] args) {
     9         Collection c = new ArrayList();
    10         c.add("Hello");
    11         c.add("World");
    12         c.add("java");
    13         
    14         Iterator it = c.iterator();
    15         
    16         while(it.hasNext()) {
    17             System.out.println(it.next());
    18         }
    19         
    20         
    21     }
    22 
    23 }

        B: 存储自定义对象并遍历(Student类自己写,这个不难)  

     1 package javaclassset;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 import java.util.Iterator;
     6 
     7 import com.wyh.Iterator.Student;
     8 
     9 public class ColletionStudentDemo {
    10 
    11     public static void main(String[] args) {
    12         
    13         Collection c = new ArrayList();
    14         
    15         
    16         Student s1 = new Student("王友虎",22);
    17         Student s2 = new Student("李宏灿",21);
    18         Student s3 = new Student("赵以浩",23);
    19         Student s4 = new Student("李先锋",24);
    20         Student s5 = new Student("齐博源",25);
    21         
    22         
    23         c.add(s1);
    24         c.add(s2);
    25         c.add(s3);
    26         c.add(s4);
    27         c.add(s5);
    28         
    29         //转数组for循环遍历
    30         Object[] objs = c.toArray();
    31         for(int i = 0;i<objs.length;i++) {
    32             
    33             Student s = (Student) objs[i];
    34             System.out.println("姓名:"+s.getName()+"  年龄:"+s.getAge());
    35         }
    36         
    37         
    38         //迭代器遍历
    39         Iterator it = c.iterator();
    40         while(it.hasNext()) {
    41             Student s = (Student)it.next();
    42             System.out.println(s.getName()+"-----"+s.getAge());
    43         }
    44                 
    45     
    46         
    47         
    48 
    49     }
    50 
    51 }

    3、集合(List)(掌握)

      (1)List是Collection的子接口

        特点:有序(存储顺序和取出顺序一致),可重复。

      (2)List的特有功能:(下面的程序中有,自己拷贝进行实验)

        A: 添加功能

        B: 删除功能

        C: 获取功能

        D: 迭代器功能

        E: 修改功能

      (3)List集合的特有遍历功能

        A: 由size()和get()结合。

        B: 代码演示

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 
     7 /** 
     8 * @author WYH
     9 * @version 2019年11月9日 下午4:39:09
    10 * 
    11 * List:
    12 * 有序集合(也称为序列(“存储与取出的顺序一致”) )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。 
    13 * 与集合不同,列表通常允许重复的元素。
    14 * 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。 
    15 * 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。 
    16 */
    17 public class ListDemo1 {
    18     
    19         static void show(List list) {
    20         Iterator it = list.iterator();
    21         while(it.hasNext()) {
    22             String s = (String)it.next();
    23             System.out.println(s);
    24         }
    25     }
    26     
    27     public static void main(String[] args) {
    28         //创建List集合
    29         List l1 = new ArrayList();
    30         
    31         //创建字符串对象并进行添加
    32         l1.add("a");
    33         l1.add("b");
    34         
    35         System.out.println("add(int index, E element):**********************************");
    36         
    37         //add(int index, E element):将指定的元素插入此列表中的指定位置(可选操作)下标从0开始
    38         l1.add(1,"xiaowang");//没有问题
    39         //l1.add(11,"li");//IndexOutOfBoundsException 报错,下表越界!
    40         l1.add(3,"xiaoli");//在集合界后面一个可以添加
    41         //l1.add(5,"asd"); //IndexOutOfBoundsException 报错,下表越界!
    42         show(l1);
    43         
    44         System.out.println("获取功能 Object get(int index) :******************************");
    45         
    46         //B:获取功能 get(int index) 返回此列表中指定位置的元素。
    47         System.out.println("get:"+l1.get(2));
    48         //IndexOutOfBoundsException 报错,下表越界!
    49         //System.out.println("get:"+l1.get(11));
    50         
    51         System.out.println(" Object remove(int index)删除该列表中指定位置的元素(可选操作)。****");
    52         //remove(int index) 删除该列表中指定位置的元素(可选操作)。 
    53         System.out.println("remove:"+l1.remove(1)); //返回移除的元素
    54         show(l1);
    55         //System.out.println("remove:"+l1.remove(11)); //IndexOutOfBoundsException 报错,下表越界!
    56         
    57         System.out.println("Object set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。 ****");
    58         System.out.println("set:"+l1.set(1, "xiaowangya")); //返回被修改的元素
    59         show(l1);
    60         System.out.println("List集合特有的遍历方式******************");
    61         
    62         //List集合特有的遍历方式
    63         for(int i = 0;i<l1.size();i++) {
    64             String s = (String)l1.get(i);
    65             System.out.println(s);
    66         }
    67         
    68         //用Iterator迭代器遍历
    69         show(l1);
    70 
    71         
    72     }
    73 }

      (4)列表迭代器的特有功能:(了解)

        可以逆向遍历,但是要先正向遍历,所以毫无意义,基本不会使用。

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 import java.util.ListIterator;
     7 
     8 /** 
     9 * @author WYH
    10 * @version 2019年11月9日 下午7:31:41
    11 * 
    12 * ListIterator : List集合特有的迭代器
    13 * 
    14 */
    15 public class ListIteratorDemo1 {
    16     public static void main(String[] args) {
    17         //创建集合
    18         List i = new ArrayList();
    19         
    20         //创建字符串对象并将其添加到集合中
    21         i.add("王友虎");
    22         i.add("李宏灿");
    23         i.add("赵以浩");
    24         i.add("齐博源");
    25         i.add("李先锋");
    26         
    27         //ListIterator 继承了 Iterator,所以可以用它的实现
    28         Iterator it = i.iterator();
    29         while(it.hasNext()) {
    30             String s = (String)it.next();
    31             System.out.println(s);
    32         }
    33         System.out.println("----------------------");
    34 
    35         
    36         // previous()逆向打印
    37         ListIterator list = i.listIterator();
    38         /*//如果逆向打印处于第一个位置,输出为空
    39          * System.out.println("------------逆向打印------------------");
    40         while(list.hasPrevious()) {
    41             String s3 = (String)list.previous();
    42             System.out.println(s3);
    43         }*/
    44         while(list.hasNext()) {
    45             String s2 = (String)list.next();
    46             System.out.println(s2);
    47         }
    48         System.out.println("------------逆向打印------------------");
    49         while(list.hasPrevious()) {
    50             String s3 = (String)list.previous();
    51             System.out.println(s3);
    52         }
    53         
    54         
    55         
    56     }
    57 
    58 }

      (5)并发修改异常

        A: 出现的异常

          迭代器遍历集合,集合修改集合元素

        B: 原因

          迭代器是依赖集合二点,而集合的改变,迭代器并不知道。

        C: 解决方案

          a: 迭代器遍历,迭代器修改(ListIterator)

            元素添加在刚刚迭代器的位置

          b: 集合遍历,集合修改(size()和get())

            元素添加在集合的末尾

        两种方式如下:

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 import java.util.ListIterator;
     6 
     7 /** 
     8 * @author WYH
     9 * @version 2019年11月9日 下午7:51:26
    10 * 
    11 * 并发修改异常:ConcurrentModificationException
    12 * 
    13 */
    14 public class ListIteratorDemo2 {
    15     public static void main(String[] args) {
    16         //创建集合对象
    17         List list = new ArrayList();
    18         
    19         //创建字符串对象并将其添加到集合中去
    20         list.add("王友虎");
    21         list.add("李宏灿");
    22         list.add("赵以浩");
    23         list.add("齐博源");
    24         list.add("李先锋");
    25         
    26         /*//创建迭代器(Iterator迭代器)(错误示范-----------------)
    27         Iterator it = list.iterator();
    28         //找到元素并进行添加张国兴
    29         while(it.hasNext()) {
    30             String s = (String)it.next();
    31             if("李宏灿".equals(s)) {
    32                 list.add("123");
    33             }
    34         }
    35         System.out.println("list:"+list);*/
    36         
    37         //方法1:创建ListIterator迭代器,迭代器调用add方法进行添加
    38         ListIterator listt = list.listIterator();
    39         while(listt.hasNext()) {
    40             String s = (String)listt.next();
    41             if("李宏灿".equals(s)) {
    42                 listt.add("张国兴"); //在找到的元素后面进行添加
    43             }
    44         }
    45         System.out.println("list:"+list);
    46         
    47         //方法2:利用for循环直接对集合进行遍历,集合中有添加的方法
    48         for(int i = 0;i<list.size();i++) {
    49             String s = (String)list.get(i);
    50             if(s.equals("李宏灿")) {
    51                 list.add("张果喜"); //在末尾进行添加
    52             }
    53         }
    54         System.out.println("list:"+list);
    55         
    56         
    57         
    58     }
    59 
    60 }

      (6)常见数据结构

        A: 栈 先进后出

        B: 队列 先进先出

        C: 数组 查询快,增删慢

        D: 链表 查询吗,慢,增删快

      (7)List的子类特点(面试题)

        ArrayList

          底层数据结构是数组,查询快,增删慢。

          线程不安全,效率高。

        Vector

          底层数据结构是数组,查询快,增删慢。

          线程安全,效率低。

        LinkedList

          底层数据结构是链表,查询慢,增删快。

          线程不安全,效率高。

        到底使用谁呢?看需求?

        分析:

          要安全吗?

            要:Vector(即使要,也不适用这个,后面再说)

            不要:ArrayLIst或者LinkedList

              查询多:ArrayList

              增删多:LinkedList

          都不知道选啥的时候,选ArrayList。

     

  • 相关阅读:
    Android中的内部类引起的内存泄露
    Android的消息机制: Message/MessageQueue/Handler/Looper
    ArrayList/Vector的原理、线程安全和迭代Fail-Fast
    JVM中的Stack和Frame
    JVM中的垃圾收集算法和Heap分区简记
    无锁编程以及CAS
    简述Java内存模型的由来、概念及语义
    MQTT协议简记
    RabbitMQ的工作队列和路由
    RabbitMQ 入门
  • 原文地址:https://www.cnblogs.com/wyh-study/p/11846177.html
Copyright © 2011-2022 走看看