关键词:
java.util.Collection接口
是集合的最顶层的接口,定义了集合共性的方法
接口无法直接创建对象,使用多态的方式创建对象
Collection<集合中的数据类型(泛型)> coll = new ArrayList<集合中的数据类型(泛型)>();
迭代器
集合中存储数据的方式(数据类型)不一样,取出集合中元素的方式也不同,java给我们提供了一种公共的取出元素的方式,叫迭代器
描述迭代器的接口:java.util.Iterator
接口中的抽象方法:
boolean hasNext() 如果仍有元素可以迭代,则返回 true。 判断集合中还有没有元素,有返回true,没有返回false
E next() 返回迭代的下一个元素。 取出集合中的下一个元素
迭代器是一个接口,需要找到迭代器的实现类,迭代器的实现类是每个集合的内部类
在Collection接口中有一个方法: iterator方法返回的就是迭代器
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
ArrayList集合实现了Collection接口,重写iterator方法,方法的返回值就是迭代器的实现类对象
注意:我们只需要知道iterator方法返回的而是迭代器的实现类就行了,不需要关注返回的是哪个实现类对象,这种变成方式叫做面向接口编程
迭代器的使用步骤:
1.创建集合对象,往集合中添加元素
2.使用集合中的方法iterator获取迭代器的实现类对象,使用Iterator接口接收(多态)
3.使用iterator中的方法hasNext和next方法进行迭代,取出集合中的元素
1 public static void main(String[] args) { 2 //1.创建集合对象,往集合中添加元素 3 //Collection<String> coll = new ArrayList<String>(); 4 Collection<String> coll = new HashSet<String>(); 5 coll.add("姚明"); 6 coll.add("乔丹"); 7 coll.add("詹姆斯"); 8 coll.add("科比"); 9 coll.add("艾弗森"); 10 //2.使用集合中的方法iterator获取迭代器的实现类对象,使用Iterator接口接收(多态) 11 //集合中的数据类型是什么,迭代器的数据类型就是什么,跟着集合走 12 Iterator<String> it = coll.iterator(); 13 //3.使用iterator中的方法hasNext和next方法进行迭代,取出集合中的元素 14 //boolean hasNext() 如果仍有元素可以迭代,则返回 true。 15 /*boolean b = it.hasNext(); 16 System.out.println(b); 17 //E(String) next() 返回迭代的下一个元素。 18 String s = it.next(); 19 System.out.println(s); 20 21 b = it.hasNext(); 22 System.out.println(b); 23 s = it.next(); 24 System.out.println(s); 25 26 b = it.hasNext(); 27 System.out.println(b); 28 s = it.next(); 29 System.out.println(s); 30 31 b = it.hasNext(); 32 System.out.println(b); 33 s = it.next(); 34 System.out.println(s); 35 36 b = it.hasNext(); 37 System.out.println(b); 38 s = it.next(); 39 System.out.println(s); 40 41 b = it.hasNext(); 42 System.out.println(b);//false,没有元素了 43 s = it.next();//没有元素了,在取就报NoSuchElementException没有元素异常 44 System.out.println(s);*/ 45 46 /* 47 * 发现以上迭代的过程是一个重复的过程,可以使用循环优化 48 * 我们不知道集合中有多少元素,所以可以使用while循环 49 * while循环的结束条件:hasNext();返回false 50 */ 51 while(it.hasNext()){ 52 String s = it.next(); 53 System.out.println(s); 54 } 55 System.out.println("-------------------"); 56 /* 57 * for循环方式迭代器,使用不多 58 */ 59 /*for(Iterator<String> it2 = coll.iterator();it2.hasNext();){ 60 String s = it2.next();//取出元素,移动指针到下一位 61 System.out.println(s); 62 }*/ 63 }
并发修改异常
在迭代的过程中,对集合的长度进行了修改,就会发生并发修改异常
遍历的过程中,集合的长度进行了修改,但是迭代器并不知道,就会产生ConcurrentModificationException
解决方法:
1.迭代就是迭代,不要对集合进行修改
2.使用迭代器Iterator的子接口ListIterator中的方法add/remove,让迭代器自己增加往集合中增加元素/移除元素
这样迭代器本身知道了集合的变化,就不会产生并发修改异常了
void add(E e) 将指定的元素插入列表(可选操作)。
void remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
1 public static void main(String[] args) { 2 ArrayList<String> list = new ArrayList<String>(); 3 4 list.add(null); 5 list.add("abc1"); 6 list.add("abc2"); 7 list.add("abc3"); 8 list.add("abc4"); 9 10 /* 11 * 使用迭代器遍历集合 12 */ 13 //获取迭代器 14 Iterator<String> it = list.iterator(); 15 //使用while遍历集合 16 while(it.hasNext()){ 17 String s = it.next(); 18 19 /* 20 * 判断集合中有没有"abc3"这个元素 21 * 如果有,增加一个元素"itcast" 22 * 编程技巧:使用equals判断的时候,要把已知的变量写在前边,未知的写在后边,防止空指针异常 23 */ 24 //if(s.equals("abc3")){ 25 if("abc3".equals(s)){ 26 //1.迭代就是迭代,不要对集合进行修改 27 //list.add("itcast"); 28 } 29 30 System.out.println(s); 31 } 32 33 System.out.println("------------------"); 34 35 /* 36 * 2.使用迭代器Iterator的子接口ListIterator中的方法add/remove,让迭代器自己增加往集合中增加元素/移除元素 37 */ 38 ListIterator<String> listIt = list.listIterator(); 39 while(listIt.hasNext()){ 40 String s = listIt.next(); 41 if("abc3".equals(s)){ 42 listIt.add("itcast"); 43 } 44 System.out.println(s); 45 } 46 System.out.println(list); 47 }
增强for
内部是一个迭代器,简化了迭代的代码,使遍历更加简单
Collection接口继承Iterable,所以Collection接口的所有实现类都可以是用增强for
注意:增强for是JDK1.5之后出现的
格式:
for(数据类型(集合/数组的数据类型) 变量名 : 集合名/数组名){
syso(变量名);
}
Java中的泛型
就是数据类型,在创建对象的时候确定
Java中的泛型是一个伪泛型:在编译的时候有(写代码.java中),运行的时候(.class)没有
随机数:伪随机数
泛型的好处:
1.避免强转,可以直接使用元素特有的方法
2.把运行期的异常,转换编译期异常(编译失败)
定义含有泛型的类
模仿ArrayList集合
public class ArrayList<E>{}
E:是一个未知的数据类型,可能是Integer,可能是String,可能Person
创建类对象的时候确定数据类型
定义格式:
修饰符 class 类名<E>{
}
1 public class GenericClass<E> { 2 private E name; 3 4 public E getName() { 5 return name; 6 } 7 8 public void setName(E name) { 9 this.name = name; 10 } 11 12 public void method(E e){ 13 System.out.println(e); 14 }
定义含有泛型的接口
格式:
修饰符 interface 接口名<泛型>{
抽象方法(参数<泛型>);
}
1 public interface GenericInterface<E> { 2 public abstract void method(E e); 3 }
1 /* 2 * 1.定义接口的实现类,不管泛型,接口泛型是怎么写的,实现类也怎么写 3 * public class ArrayList<E> implements List<E>{} 4 * 创建实现类对象的时候确定泛型的数据类型 5 */ 6 class GenericInterfaceImpl1<E> implements GenericInterface<E>{ 7 8 @Override 9 public void method(E e) { 10 System.out.println(e); 11 } 12 }
含有泛型的方法
不是类上定义的泛型,是方法自己定义的泛型
定义格式:在修饰符和返回值类型之间要定义泛型,才能使用
修饰符 <泛型> 返回值类型 方法名(参数<泛型>){
}
方法上的泛型,在调用方法的时候确定数据类型,传递的是什么类型的数据,泛型就是什么类型(和类上的泛型没有关系)
1 public class GenericMethod<E> { 2 3 /* 4 * 定义方法,使用类上的泛型 5 */ 6 public void method(E e){ 7 System.out.println(e); 8 } 9 10 /* 11 * 定义一个含有泛型的方法 12 */ 13 public <T> void function(T t){ 14 System.out.println(t); 15 }
泛型的通配符:?,代表任意的数据类型
上限限定:? extends E代表只要是E类型的子类即可
下限限定:? super E代表只要是E类型的父类即可
ArrayList集合的构造方法
ArrayList(Collection<? extends E> c)
参数是一个集合,集合的数据类型有要求,只能是ArrayList泛型的子类或者是本身
ArrayList(Collection<? extends E> c)
参数是一个集合,集合的数据类型有要求,只能是ArrayList泛型的子类或者是本身
1 /* 2 * 斗地主案例: 3 * 1.准备牌 4 * 2.洗牌 5 * 3.发牌 6 * 4.看牌 7 */ 8 public class DouDiZhu { 9 public static void main(String[] args) { 10 //1.准备牌 11 //创建存储54张牌的集合 12 ArrayList<String> poker = new ArrayList<String>(); 13 //存储大王小王 14 poker.add("大王"); 15 poker.add("小王"); 16 //存储52张牌 17 //创建序号的数组 18 String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; 19 //创建花色数组 20 String[] colors = {"?","?","?","?"}; 21 //嵌套遍历两个数组 22 for (String number : numbers) { 23 for (String color : colors) { 24 //System.out.println(color+number); 25 //把组合的牌放入到集合中 26 poker.add(color+number); 27 } 28 } 29 //System.out.println(poker); 30 31 /* 32 * 2.洗牌 33 * 使用Collections中的方法 34 * static void shuffle(List<?> list) 35 */ 36 Collections.shuffle(poker); 37 //System.out.println(poker); 38 39 /* 40 * 3.发牌 41 * 创建4个集合 42 * 遍历poker集合 43 * 使用poker集合的索引%3发牌 44 */ 45 ArrayList<String> player01 = new ArrayList<String>(); 46 ArrayList<String> player02 = new ArrayList<String>(); 47 ArrayList<String> player03 = new ArrayList<String>(); 48 ArrayList<String> diPai = new ArrayList<String>(); 49 //遍历poker集合 50 for (int i = 0; i < poker.size(); i++) { 51 //获取牌 52 String s = poker.get(i); 53 //先判断索引是否为底牌的索引 51 52 53 54 if(i >=51){ 55 //给底牌发牌 56 diPai.add(s); 57 }else if(i%3==0){ 58 //给玩家1发牌 59 player01.add(s); 60 }else if(i%3==1){ 61 //给玩家1发牌 62 player02.add(s); 63 }else if(i%3==2){ 64 //给玩家1发牌 65 player03.add(s); 66 } 67 } 68 //4.看牌 69 System.out.println("刘德华:"+player01); 70 System.out.println("周润发:"+player02); 71 System.out.println("周星驰:"+player03); 72 System.out.println("底牌:"+diPai); 73 } 74 }
day191集合2iterator迭代器3增强for循环4泛型
今日内容介绍1、集合2、Iterator迭代器3、增强for循环4、泛型 =======================第一节课开始=============================================###01集合使用的回顾 *A:集合使用的回顾 &n 查看详情
集合泛型迭代器增强for集合唯一性判定
1集合1.1集合概述集合是一个存储容器,只能存储引用类型对象,不存储基本数据类型,8种基本类型对应有8种引用类型,转化后可存入集合集合长度可变,数组长度固定1.2集合继承体系ArrayList类继承了抽象类AbstractList同时实现Lis... 查看详情
java基础第十二篇之集合增强for循环迭代器和泛型
...ection接口中的常用方法:* 所有的子类子接口都是具有的*集合的方法:增删改查** publicbooleanadd(Ee);//添加元素返回值表示是否添加成功* publicbooleanremove(Objecto);//删除元素,返回值表示是否删除成功* 没有修改方法* 查询元素的方法... 查看详情
java的iterator迭代器补充,增强for循环,泛型,list接口,set接口
1、Iterator迭代器:(1)类型转换异常:ClassCastException;集合中存放的是多个对象时,在强转时会出现;packagecom.oracle.demo01;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;publicclassdemo01{publicstaticvoi 查看详情
集合迭代器增强for(代码片段)
collection和listset和ArrayListLinkedListHashSetLinkedHashSet的关系collection接口的方法add() clear() contains() remove() size() toArray()公用方法publicstaticvoidmethod()//注意:集合中只能存放引用数据类型// 查看详情
集合遍历
set集合遍历:1.迭代器2.增强for循环:只能遍历 List集合的遍历:1.迭代器2.增强for循环3.普通for循环get(index)和size() 注:增强for循环:只能遍历,不能删除,迭代器遍历可以删除,但必须使用迭代器,普通for循环可以删除,但必须记... 查看详情
迭代器和增强for(代码片段)
...理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。格式:for(元素的数据类型 变量:Collection集合or数组)它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行... 查看详情
for循环增强for循环和迭代器的区别(代码片段)
1、迭代器是用于方便集合遍历的,实现了Iterable接口的集合都可以使用迭代器来遍历。使用迭代器遍历元素时,除了查看之外,只能做remove操作。2、增强for循环,内部使用的是迭代器,所以它的操作对象是数组和可以使用迭代... 查看详情
迭代器和增强for循环(代码片段)
Iterator迭代器的使用:迭代:Iterator,即collection集合元素的通用获取方式java.util.Iterator接口。迭代器(对集合进行遍历)有两个常用的方法BooleanhasNext()如果仍有元素可以迭代,则返回true判断集合中还有没有下一个元素,有就... 查看详情
2020/7/14java增强for泛型list接口list接口set接口
...是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。 格式:for(元素的数据类型 变量 :Collection集合or数组){... 查看详情
iterator迭代器与增强for循环(代码片段)
java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就... 查看详情
lua迭代器iterator
...址在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。泛型for迭代器泛型for在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。泛型for迭代器提供了集合的key/value对,语法格... 查看详情
集合并发修改异常-增强for循环,或者迭代器遍历的时候不可修改值
直接上代码:无意间发现的://这个方法本身是为后面的集合去掉前面集合的重复数据一直报错,并发修改异常,仔细看mainList正在迭代循环,然后我进行了remove操作,这个时候就会报这个错.故:总结出了标题的结论publicstaticList<GcallModel... 查看详情
集合常用的3种遍历方式
...for(foreach)实现遍历运行结果`注意·增强for有个缺点,如果集合或者数组为null,会报空指针异常(NullPointerException),在调用增强for时最好先做判断。通过反编译可以看到增强for是用iterator的for循环实现的,是iterator的替代,iterator也... 查看详情
认识collection与泛型
主要内容 Collection集合 迭代器 增强for 泛型 Collection集合 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的... 查看详情
[java]集合和泛型(代码片段)
一、集合1.集合体系图Set集合体系图List集合体系图Map集合体系图2.Collection接口方法Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的//只要是Collection接口的实现类都可以做实参booleanaddAll(Collection<?extendsE&... 查看详情
java之增强for和迭代器精选
...都必须有一个努力的现在!!!我们上一篇聊到了java之集合,这一篇我们聊一下增强for和迭代器,针对于以下的概念,都会有实体例子配合着,给大家演示,希望给历险中的你带来一些帮助!!! 一.增强for介绍 &n... 查看详情
jdk1.5新特性
...入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!因此JDK5中定义了一种新的语法——增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterabl... 查看详情