[TOC]
Collection集合框架 描述: 集合的由来数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义太麻烦,java内部给我们提供了集合类能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
;
集合原理:(重点)
集合的底层部分采用数组方式,比如创建一个10个大小的数组,之后往里面填数组当填满之后,它又创建了一个比原数组1.5倍大的数组,把原数组的数据都拷贝到新数组中,原数组将成为垃圾被丢弃;(然后一直循环)
数组和集合的区别
区别1 :
数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
区别2:
数组长度是固定的,不能自动增长
集合的长度的是可变的,可以根据元素的增加而增长
集合继承体系图: Collection(单列集合的根接口)
List : 有序(存和取的顺序一致),有索引可以存储重复;
ArrayList 数组实现
LinkedList 链表实现
Vector (已被替换掉) 数组实现
Set : 无序()存和取的顺序补一致,无索引不可以存储重复;
HashSet 哈希算法
TreeSet 二叉数算法
weiyigeek.top-集合继承体系图
数组和集合什么时候用?
1.如果元素个数是固定的推荐用数组;
2.如果元素个数不是固定的推荐用集合;
注意事项:
collectionXxx.java使用了未经检查或不安全的操作.
要了解详细信息,请使用 -Xlint:unchecked重新编译.java编译器认为该程序存在安全隐患温馨提示:这不是编译失败,所以先不用理会,等学了泛型你就知道了
基础语法:1 2 3 4 5 6 7 8 9 10 11 12 java.util public interface Collection <E > //<E > 泛型 jdk1 .5出现所以,注意接口不能直接new 需要找到它的已知实现类 ;extends Iterable<E> #实例化常常采用集合继承体系进行实现 boolean add (E e) boolean remove (Object o) int size () boolean contains (Object o) boolean isEmpty () void clear ()
集合继承ArrayList 基础实例: 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package com.weiyi.Collection;public class Students { private String name; private int age; public Students () { } public Students (String name, int age) { this .name = name; this .age = age; } public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } }
案例需要上面的学生类1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 package com.weiyigeek.Collection;import java.util.ArrayList;import java.util.Collection;import com.weiyi.Collection.Students; public class Demo1_Collection { public static void main (String[] args) { Students[] arrs = new Students[5 ]; arrs[0 ] = new Students("张三" , 23 ); arrs[1 ] = new Students("李四" , 25 ); arrs[2 ] = new Students("王五" , 27 ); for (int i = 0 ; i < arrs.length; i++) { System.out.println(arrs[i]); } Collection c = new ArrayList(); boolean b1 = c.add("abc" ); boolean b2 = c.add(true ); boolean b3 = c.add(100 ); boolean b4 = c.add(10.24 ); boolean b5 = c.add(new Students("张三" ,23 )); boolean b6 = c.add("abc" ); System.out.println(c); System.out.println(c.toString()); System.out.println("集合元素个数 :" + c.size()); c.remove("abc" ); System.out.println("删除指定元素 : " +c); System.out.println("判断是否包含 " + c.contains(10.24 )); c.clear(); System.out.println("清空元素 : " + c); System.out.println("判断是否为空 : " + c.isEmpty()); } }
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 com.weiyi.Collection.Students@15 db9742 com.weiyi.Collection.Students@6 d06d69c com.weiyi.Collection.Students@7852e922 null null [abc, true , 100 , 10.24 , com.weiyi.Collection.Students@4e25154f , abc] [abc, true , 100 , 10.24 , com.weiyi.Collection.Students@4e25154f , abc] 集合元素个数 :6 删除指定元素 : [true , 100 , 10.24 , com.weiyi.Collection.Students@4e25154f , abc] 判断是否包含 true 清空元素 : [] 判断是否为空 : true
Tips : 数组和集合存储引用数据类型存的都是地址值
weiyigeek.top-
集合转数组遍历: 描述:集合常用方法1 2 3 4 5 Object[] toArray() boolean addAll (Collection c) boolean removeAll (Collection c) boolean containsAll (Collection c) boolean retainAll (Collection c)
基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 package com.weiyigeek.Collection;import java.util.ArrayList;import java.util.Collection;import com.weiyi.Collection.Students;public class Demo2_Collection { public static void main (String[] args) { Collection c = new ArrayList(); c.add("a" ); c.add("b" ); c.add("c" ); c.add("d" ); Object[] arr = c.toArray(); for (int i = 0 ; i < arr.length; i++) { System.out.print(arr[i] + " " ); } System.out.println("\n##########分割线上##########" ); Collection c1 = new ArrayList(); c1.add(new Students("赵老师" ,24 )); c1.add(new Students("经老师" ,23 )); c1.add(new Students("渣渣辉" ,25 )); c1.add(new Students("刘师傅" ,26 )); Object[] arr1 = c1.toArray(); for (int i = 0 ; i < arr1.length; i++) { Students s = (Students)arr1[i]; System.out.println(s.getName() + " " + s.getAge()); } Collection c2 = new ArrayList(); c2.add("a" ); c2.add("b" ); c2.add("c" ); c2.add("d" ); Collection c3 = new ArrayList(); c3.add("1" ); c3.add("2" ); c3.add("3" ); c3.add("4" ); c3.add("a" ); System.out.println("##########分割线###########" ); c2.add(c3); System.out.println(c2); c2.addAll(c3); System.out.println(c2); boolean b = c2.removeAll(c3); System.out.println("需要注意删除是交集" ); System.out.println(c2); boolean b1 = c2.containsAll(c3); System.out.println("c2是否包含c3 : " + b1); boolean b2 = c2.retainAll(c3); System.out.println(b2); System.out.println(c2); } }
执行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 a b c d ##########分割线上########## 赵老师 24 经老师 23 渣渣辉 25 刘师傅 26 ##########分割线########### [a, b, c, d, [1 , 2 , 3 , 4 ]] [a, b, c, d, [1 , 2 , 3 , 4 ], 1 , 2 , 3 , 4 ] 需要注意删除是交集 [a, b, c, d, [1 , 2 , 3 , 4 ]] c2是否包含c3 : false true []
集合之迭代器(Iterator) 描述:其实迭代都是遍历,而遍历也可以看做是迭代;迭代器概述集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历);
迭代器原理:
迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法
这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式好处有二:
第一规定了整个集合体系的遍历方式都是hasNext()和next()方法
第二代码有底层内部实现,使用者不用管怎么实现的会用即可
1 2 3 4 5 java.util public interface Iterator<E> boolean hasNext() E next()
迭代器源码解析1 2 3 4 5 6 * 1,在eclipse中ctrl + shift + t找到ArrayList类 * 2,ctrl+o查找iterator()方法 * 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口 * 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法 * 5,hasNext() 是判断集合中是否有参数,以及cursor标志位是否 == 集合的size个数 * 6,Next() 是集合进行迭代并输出迭代值
基础方法:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package com.weiyigeek.Collection;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.Iterator;import com.weiyi.Collection.Students;@SuppressWarnings ("rawtypes" )public class Demo3_Collection { @SuppressWarnings ("unchecked" ) public static void main (String[] args) { Collection c = new ArrayList(); c.add("Weiyi" ); c.add("Geek" ); c.add("1024" ); c.add("Java" ); Iterator it = c.iterator(); boolean bl = it.hasNext(); Object obj = it.next(); System.out.print(bl + " " ); System.out.println(obj); while (it.hasNext()) { System.out.println(it.next()); } Collection c1 = new ArrayList(); c1.add(new Students("张伟" , 15 )); c1.add(new Students("张杰" , 29 )); c1.add(new Students("张根硕" , 35 )); c1.add(new Students("大张伟" , 25 )); Iterator it1 = c1.iterator(); while (it1.hasNext()) { Students s = (Students)it1.next(); System.out.println(s.getName() + " " + s.getAge()); } } }
执行结果:1 2 3 4 5 6 7 8 9 true WeiyiGeek 1024 Java 张伟 15 张杰 29 张根硕 35 大张伟 25
有序集合List 描述:List集合中不能有重复元素,否则返回false;List集合中才有索引,而set中是没有索引的 List集合的特有功能1 2 3 4 * void add(int index,E element) * E remove(int index) * E get(int index) * E set(int index,E element)
基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package com.weiyigeek.Collection;import java.util.List;import java.util.ArrayList;import com.weiyi.Collection.Students;public class Demo4_List { public static void main (String[] args) { List l = new ArrayList(); l.add("Weiyi" ); l.add("Geek" ); l.add("Love" ); l.add("Java" ); l.add(0 ,"Start" ); l.add(5 ,"END" ); System.out.println(l); Object demo1 = l.remove(3 ); System.out.println(l + " 删除的集合元素是 " + demo1); Object demo2 = l.get(1 ); System.out.println("获取指定的索引的集合元素 :" + demo2 + l.get(2 )); for (int i = 0 ; i < l.size(); i++) { System.out.print(l.get(i) + " - " ); } l.set(3 , "Editer" ); System.out.println("\n修改后的集合元素 : " + l); List list = new ArrayList(); list.add(new Students("Weiyi" ,28 )); list.add(new Students("Geek" ,32 )); for (int i = 0 ; i < list.size(); i++) { Students s = (Students)list.get(i); System.out.println(i + " - " + s.getName() + " " + s.getAge()); } } }
执行结果:1 2 3 4 5 6 7 [Start, Weiyi, Geek, Love, Java, END] [Start, Weiyi, Geek, Java, END] 删除的集合元素是 Love 获取指定的索引的集合元素 :WeiyiGeek Start - Weiyi - Geek - Java - END - 修改后的集合元素 : [Start, Weiyi, Geek, Editer, END] 0 - Weiyi 28 1 - Geek 32
集合继承Vector 描述:Vector是Java中的老员工了从jdk1.0但是现在已经被ArrayList所替代,Vector类实现了一个可增长对象数组,可以通过索引来访问元素,也可以根据需求来进行收缩对象数组;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #包 java.util.Vector<E> #类 public class Vector <E >extends AbstractList <E >implements List <E >, RandomAccess , Cloneable , Serializable #成员属性 protected int elementCount //#Vector对象的有效成分的数量。成分 elementData[0]通过 elementData[elementCount-1]是实际的项目 * public void addElement (E obj) * public E elementAt (int index) * public Enumeration elements () public interface Enumeration<E> boolean hasMoreElements () E nextElement ()
基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Vector v = new Vector(); v.addElement("Weiyi" ); v.addElement("Geek" ); v.addElement("Java" ); Enumeration en = v.elements(); while (en.hasMoreElements()) { System.out.print(en.nextElement() + " " ); } Weiyi Geek Java
集合继承LinkedList 描述:双向链表实现的 List和 Deque接口。实现了所有的可选列表操作,并允许所有元素(包括 null)。 可以实现栈(先进后出)和堆(先进先出)的数据结构; 基础语法:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 java.util public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable LinkedList() LinkedList(Collection<? extends E> c) * public void addFirst(E e)及addLast(E e) * public E getFirst() 及 getLast() * public E removeFirst() 及 public E removeLast() * public E get(int index);
基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package com.weiyigeek.Collection;import java.util.LinkedList;public class Demo8_linkedList { public static void main (String[] args) { LinkedList list = new LinkedList(); list.add("1" ); list.addFirst("0" ); list.addLast("2" ); System.out.println("获取集合中第一个元素:" +list.getFirst()); System.out.println("获取集合中最后一个元素:" +list.getLast()); System.out.println("返回删除的第一个元素:" +list.removeFirst()); System.out.println("返回删除的最后一个元素:" +list.removeLast()); System.out.println("利用索引获取元素 (原理值得学习): " +list.get(0 )); LinkedStack stack = new LinkedStack(); stack.in("a" ); stack.in("b" ); stack.in("c" ); stack.in("d" ); while (!stack.isEmpty()) { System.out.println(stack.out()); } } } class LinkedStack { private LinkedList lt = new LinkedList(); public void in (Object obj) { lt.addLast(obj); } public Object out () { return lt.removeLast(); } public boolean isEmpty () { return lt.isEmpty(); } }
执行结果:1 2 3 4 5 6 7 8 9 10 获取集合中第一个元素:0 获取集合中最后一个元素:2 返回删除的第一个元素:0 返回删除的最后一个元素:2 利用索引获取元素 (原理值得学习): 1 d c b a
List子类特点 描述:在说List子类特点的时候我们先说说数据结构之数组和链表_ 数组与链表的区别? A:数组:查询快修改也快,但是增删慢; B:链表:查询慢修改也慢,但是增删快;
List的三个子类的特点?
ArrayList:
底层数据结构是数组
,查询快,增删慢。
线程不安全,效率高
。
Vector:
底层数据结构是数组
,查询快,增删慢。
线程安全,效率低
。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表
,查询慢,增删快。
线程不安全,效率高
。
Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高 共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢 共同点:都是线程不安全的
List有三个儿子,我们到底使用谁呢? 查询多用ArrayList 增删多用LinkedList 如果都多ArrayList
ArrayList示例 描述:前面我们已经简单的介绍了一些ArrayList集合的框架,下面直接演示集合参数过滤 基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 package com.weiyigeek.Collection;import java.util.ArrayList;import java.util.Iterator;import com.weiyi.Collection.Students; public class Demo7_ArrayList { public static void main (String[] args) { ArrayList newList = new ArrayList(); newList.add("a" ); newList.add("c" ); newList.add("b" ); newList.add("b" ); newList.add("b" ); ArrayList list = getSingle(newList); System.out.println(list); ArrayList objList = new ArrayList(); objList.add(new Students("张三" ,13 )); objList.add(new Students("张三" ,13 )); objList.add(new Students("张四" ,13 )); objList.add(new Students("王三" ,13 )); ArrayList objres = getSingleObj(objList); objList.remove(new Students("张三" ,13 )); System.out.println(objres); } public static ArrayList getSingle (ArrayList list) { ArrayList newList = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { String temp = (String)it.next(); if (!newList.contains(temp)) { newList.add(temp); } } return newList; } private static ArrayList getSingleObj (ArrayList objList) { ArrayList newList = new ArrayList(); Iterator it = objList.iterator(); while (it.hasNext()) { Object obj = it.next(); if (!newList.contains(obj)) { newList.add(obj); } } return newList; } }
集合泛型 泛型概述:比如Collection集合上有一个尖括号<引用数据类型>,一旦设置引用数类型限定您集合存储的数据类型,只能使用引用对象及该对象的子类对象(父类可以指向子类对象);
泛型好处:
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
泛型基本使用:
<>中放的必须是引用数据类型,从而限定集合中使用的数据类型;
泛型使用注意事项:1 2 3 4 5 ArrayList<Students> lt = new ArrayList<Students>() ArrayList<Students> lt = new ArrayList<>()
基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 package com.weiyi.generic;import java.util.ArrayList;import java.util.Iterator;import com.weiyi.Collection.Students;public class Demo1_Generic { public static void main (String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a" ); list.add("b" ); list.add("c" ); Iterator<String> llt = list.iterator(); while (llt.hasNext()) { System.out.println(llt.next()); } ArrayList<Students> lt = new ArrayList<Students>(); lt.add(new Students("渣渣辉" ,25 )); lt.add(new Students("掌门人" ,22 )); lt.add(new Students("柳师傅" ,21 )); Iterator<Students> ltr = lt.iterator(); while (ltr.hasNext()) { Students obj = ltr.next(); System.out.println(obj.getName() +" ---- " + obj.getAge()); } Tool t = new Tool(); t.setObj(new Person("张三" ,24 )); Worker w = (Worker) t.getObj(); System.out.println(w); } } class Tool { private Object obj; public Object getObj () {return obj;} public void setObj (Object obj) { this .obj = obj; } } class Person extends Students { public Person () {super ();} public Person (String name, int age) {super (name, age);} } class Worker extends Students { public Worker () {super ();} public Worker (String name, int age) {super (name, age);} }
泛型类/方法/接口的概述及使用 泛型类概述: 把泛型定义在类上 定义格式: public class 类名<泛型类型1,…>
泛型方法概述: 把泛型定义在方法上,如果是静态方法需要在static后加入自己的泛型; 定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名)
泛型接口概述: 把泛型定义在接口上 定义格式: public interface 接口名<泛型类型>
基础案例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package com.weiyi.generic;public class Demo2_Generic { public static void main (String[] args) { Tools<String> tls = new Tools<>(); tls.show("Hello World!" ); tls.showMethod("Yes" ); tls.showStatic("Generic" ); Demo d1 = new Demo(); d1.show("Interfaces" ); Demo1<String> d2 = new Demo1(); d2.show("Interfaces" ); } } class Tools <Q > { private Q obj; public Q getObj () {return obj;} public void setObj (Q obj) {this .obj = obj;} public void show (Q str) { System.out.println("类泛型:" +str); } public <T> void showMethod (T t) { System.out.println("方法泛型:" +t); } public static <W> void showStatic (W w) { System.out.println("静态方法泛型:" +w); } } interface Inter <T > { public void show (T t) ; } class Demo implements Inter <String > { @Override public void show (String t) { System.out.println("泛型接口-示例1:" +t); } } class Demo1 <T > implements Inter <T > { @Override public void show (T t) { System.out.println("泛型接口-示例2:" +t); } }
执行结果:1 2 3 4 5 类泛型:Hello World! 方法泛型:Yes 静态方法泛型:Generic 泛型接口-示例1 :Interfaces 泛型接口-示例2 :Interfaces
注意事项: 泛型类型必须是引用类型
;
泛型高级之通配符 描述:泛型通配符<?>, 任意类型如果引用类型没有明确,那么就是Object以及任意的Java类了;1 2 ? extends E 向下限定,E及其子类 ? super E 向上限定,E及其父类
基础实例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package com.weiyi.generic;import com.weiyi.Collection.Students;import java.util.ArrayList;import java.util.List;public class Demo3_Generic { public static void main (String[] args) { List<?> list = new ArrayList<Integer>(); ArrayList<Study> list1 = new ArrayList<>(); list1.add(new Study("1.王老五" , 15 )); list1.add(new Study("2.王老吉" , 15 )); list1.add(new Study("3.王老四" , 15 )); ArrayList<Students> list2 = new ArrayList<>(); list2.add(new Students("4.测试" ,25 )); list2.add(new Students("5.学生类" ,25 )); list2.addAll(list1); System.out.println("输出结果:" +list2); } } class Study extends Students { public Study () { super (); } public Study (String name, int age) { super (name, age); } }
执行结果:1 输出结果:[Students [name=4 .测试, age=25 ], Students [name=5 .学生类, age=25 ], Students [name=1 .王老五, age=15 ], Students [name=2 .王老吉, age=15 ], Students [name=3 .王老四, age=15 ]]
集合框架进阶 1.增强for的概述和使用 概述:简化数组和Collection集合的遍历,增强for循环底层由迭代器实现;1 2 3 for (元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 }
基础实例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package com.weiyi.generic;import java.util.ArrayList;import com.weiyi.Collection.Students;public class Demo4_For { public static void main (String[] args) { int [] arr = {11 ,22 ,33 ,44 ,55 }; for (int i : arr) { System.out.print(i+" " ); } System.out.println(); ArrayList<String> list = new ArrayList<String>(); list.add("a" ); list.add("b" ); list.add("c" ); list.add("d" ); for (String param : list) { System.out.print(param+" " ); } System.out.println(); ArrayList<Students> list1 = new ArrayList<Students>(); list1.add(new Students("渣渣哥" , 27 )); list1.add(new Students("刘师傅" , 26 )); list1.add(new Students("帐老师" , 27 )); for (Students param : list1) { System.out.println(param); } } } 11 22 33 44 55 a b c d Students [name=渣渣哥, age=27 ] Students [name=刘师傅, age=26 ] Students [name=帐老师, age=27 ]
2.三种迭代的能否删除
普通for循环,可以删除,但是索引要– (自减)
迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
增强for循环不能删除 基础实例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.weiyi.generic;import java.util.ArrayList;import java.util.Iterator;import com.weiyi.Collection.Students;public class Demo5_RemoveCollection { public static void main (String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("a" ); list.add("a" ); list.add("b" ); list.add("c" ); list.add("WeiyiGeek" ); for (int i = 0 ; i < list.size(); i++) { if ("a" .equals(list.get(i))) list.remove(i--); } Iterator<String> it = list.iterator(); while (it.hasNext()) { if ("b" .equals(it.next())) it.remove(); } for (Iterator<String> it1 = list.iterator(); it.hasNext();) { if ("c" .equals(it1.next())) it1.remove(); } for (String param: list){ if ("c" .equals(param)) System.out.println(param); System.out.println("外层 : " + param); } System.out.println(list); } }
执行结果:1 2 3 4 c 外层 : c 外层 : WeiyiGeek [c, WeiyiGeek]
3.集合嵌套之ArrayList嵌套ArrayList 基础示例:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import java.util.ArrayList; import com.weiyi.Collection.Students; public class Demo3_ArrayLists { public static void main(String[] args) { //示例:集合嵌套ArrayList中的ArrayList ArrayList<ArrayList<Students>> list = new ArrayList<ArrayList<Students>>(); //当做一个年级 ArrayList<Students> first = new ArrayList<Students>(); //第一个班级 first.add(new Students("张伟" ,25)); first.add(new Students("大张伟" ,25)); first.add(new Students("纳音" ,25)); ArrayList<Students> seconde = new ArrayList<Students>(); //第二个班级 seconde.add(new Students("Love" , 99)); seconde.add(new Students("Test" , 199)); //将班级加到年级集合中 list.add(first); list.add(seconde); //遍历学科集合(值得学习) for (ArrayList<Students> x: list) { for (Students y : x) { System.out.println(y); } } } } Students [name=张伟, age=25] Students [name=大张伟, age=25] Students [name=纳音, age=25] Students [name=Love, age=99] Students [name=Test, age=199]
集合异常 问题1:集合框架(并发修改异常产生的原因及解决方案) ListIterator常用方法:1 2 3 4 * boolean hasNext () 是否有下一个 * boolean hasPrevious () 是否有前一个 * Object next () 返回下一个元素 * Object previous () ;返回上一个元素
案例演示需求:我有一个集合,请问,我想判断里面有没有”world”这个元素,如果有,我就添加一个”javaee”元素,请写代码实现。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 package com.weiyigeek.Collection;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.ListIterator;public class Demo5_ListIterator { public static void main (String[] args) { List list = new ArrayList(); list.add("Weiyi" ); list.add("world" ); list.add("Geek" ); Iterator it = list.iterator(); boolean flag = false ; while (it.hasNext()) { String str = (String)it.next(); if (str.equals("world" )) { flag = true ; break ; } } if (flag) { list.add("JavaEE" ); } System.out.println("方法1:" + list); ListIterator lit = list.listIterator(); while (lit.hasNext()) { String str = (String)lit.next(); if (str.equals("world" )) { lit.add("javaee" ); } } System.out.println("方式2:" +list); } } 方法1 :[Weiyi, world, Geek, JavaEE] 方式2 :[Weiyi, world, javaee, Geek, JavaEE]