大数据之路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。