摘要:

Java基础加强重温_05:
Iterator迭代器(指针跟踪元素)、
增强for循环(格式、底层)、
集合综合案例-斗地主(代码规范抽取代码,集合元素打乱)、
数据结构【栈(先进后出,子弹夹)、队列(先进先出,火车过山洞)、
数组(查找增删原理)、
链表(多结点互相连接、单/双向)、
红黑树(二叉查找树)】、
List的子类【ArrayList集合(底层数组、扩容原理)、
LinkedList集合(底层链表)、
Vector集合(看作ArrayList的兄弟类,线程安全集合,效率低)、Enumeration(Iterator前身)】、
Set接口【HashSet集合(数据结构哈希表、重写hashCode和equals,hashCode设计规定)、LinkedHashSet集合】

一、Iterator迭代器

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口 java.util.Iterator 。想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作

迭代:是Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

1、为什么要用迭代器

统一解决遍历所有Collection集合的问题。
Collection集合里面没有get(int index)方法获取某个元素。因为List是有索引的,Set没有索引的,Collection作为父接口,没有用索引的get方法,所以Collection提供了迭代器供遍历集合的所有元素。

迭代器和集合的关系

Collection是所有集合的接口,Iterator是迭代器的意思,也是一个接口
Collection提供获取迭代器的方法 Iterator iterator()
List是Collection的子接口,ArrayList是List的实现类,重写了Iterator iterator()。集合的所有实现类都重写了Iterator iterator()

2、迭代器常用方法

public Iterator iterator() : 获取集合对应的迭代器,用来遍历集合中的元素的。访问方式:集合对象.iterator()boolean hasNext() 判断集合是没有下一个元素,有就返回true,否则false。访问方式:迭代器对象.hasNext()E next()  1、获取当前迭代器指向的元素   2、把迭代器指向下一元素。访问方式:迭代器对象.next()

迭代器使用步骤

1、创建集合
2、获取该集合的迭代器
3、进行迭代

Iterator迭代集合代码示例

public class IteratorDemo {public static void main(String[] args) {// 使用多态方式 创建对象Collection<String> coll = new ArrayList<String>();// 添加元素到集合coll.add("串串星人");coll.add("吐槽星人");coll.add("汪星人");//遍历//获得该集合的迭代器Iterator<String> it = coll.iterator();// 泛型指的是 迭代出 元素的数据类型while(it.hasNext()){ //判断是否有迭代元素String s = it.next();//获取迭代出的元素System.out.println(s);}}
}

1、在进行集合元素获取时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会抛出java.util.NoSuchElementException没有集合元素异常。
2、在进行集合元素获取时,如果添加或移除集合中的元素 , 将无法继续迭代 , 将会抛出ConcurrentModificationException并发修改异常.

3、迭代器的实现原理

迭代器迭代原理:判断一次,获取一次

遍历集合时,首先调用集合的iterator()方法获得迭代器对象,再使用hashNext()方法判断集合中是否存在下一个元素。如果存在,则调用next()方法将元素取出。不存在则说明已到达了集合末尾,停止遍历元素。

Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。图例如下:

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

4、增强for循环(foreach)

foreach只是一个技术名称,是一种遍历方式,学习foreach遍历的关键是记住foreach的遍历格式。
foreach形式遍历既可以遍历集合也可以遍历数组。
foreach遍历集合底层就是使用了Iterator迭代器。

增强for格式

for(被遍历集合或者数组中元素的类型 变量 : 被遍历集合或者数组){System.out.println(变量);
}//通俗
for(集合中元素的数据类型 变量:集合) {处理每一个元素
}for(数组中元素的数据类型 变量:数组) {处理每一个元素
}

增强for循环特点

好处: 写法简单

缺点: 遍历不带下标

什么时候使用增强for?

  • 不关注下标的时候(如set集合,没有索引。遍历set集合时可以用增强for)

增强for循环的底层

  • 集合的增强for遍历底层是 使用迭代器遍历
  • 数组的增强for遍历底层是 使用带下标的for循环

增强for案例

public static void main(String[] args){// 定义一个数组String[] names = new String[]{"张三","李四","王五"};// namefor(String name : names){System.out.println(name);}System.out.println("-------------------------------------");int[] scores = new int[]{90,100,89,70};for(int ele : scores){System.out.println(ele);}
}

foreach遍历是自动进行的,它会让变量依次等于每一个元素,然后取出数组的每一个元素值。
foreach遍历在写法上显得更加的简洁和方便,但是它无法知道当前遍历到了数组的哪个索引位置处。

二、集合综合案例(斗地主)

案例介绍

按照斗地主的规则,完成洗牌发牌的动作。 具体规则:
使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。

案例分析

1、准备牌:

  • 牌可以设计为一个ArrayList,每个字符串为一张牌。 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。 牌由Collections类的shuffle方法进行随机排序。

2、发牌

  • 将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

3、看牌

  • 直接打印每个集合。
斗地主规则:54张 = 52张通常牌+2张大小王发牌:三个玩家,每个人发17张牌,剩下3张,选地主,地主可以拥有这3张牌1、创建牌a、创建牌的对象,属性(花色,名字)b、创建54张牌,使用集合存储54张牌* 2张大小王* 4花色*13名字的牌2、看牌(写代码看一下是不是54张)3、洗牌: Collections是一个工具类,ObjectsCollections.shuffle(List集合),把List的元素打乱4、发牌5、看每个玩家的牌

代码规范

1、代码模块化

模块化:一个类/一个方法只做一件事情

  • 就是把每个独立的功能包装成方法,公用的变量通过参数的形式传递

2、main方法的规范

作为一个优秀的开发者应该遵循的规范,在main方法中只能出现:

  • 只出现变量定义(局部变量,匿名内部类…)
  • 方法的调用
  • 不应该出现for、if、switch、while,带逻辑的代码都不应该出现

代码实现

非代码规范版

定义Poker类

public class Poker {private String name;private String color;public Poker() {}public Poker(String color, String name) {this.name = name;this.color = color;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "Poker{" +"name='" + name + '\'' +", color='" + color + '\'' +'}'+"\n";}
}

测试类

public class Demo12 {public static void main(String[] args) {// 创建一个ArrayList用于存放一副牌ArrayList<Poker> pokers = new ArrayList<>();pokers.add(new Poker("大王", ""));pokers.add(new Poker("小王", ""));String[] colors = new String[] {"♠", "♥", "♣", "♦"};String[] numbers = new String[] {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6","5", "4", "3"};// 组合牌, 嵌套循环的流程:外循环一次,内循环所有次// 2.使用嵌套循环生成一副牌for (String n : numbers) {// "2", "A",...for (String c : colors) {// "♠", "♥", "♣", "♦"Poker p = new Poker(c, n);// 3.将54张牌放到集合pokers.add(p);}}//打印,未洗牌//System.out.println(pokers);// 洗牌: 使用Collections集合工具类的方法// static void shuffle•(List<?> list) 将集合中元素的顺序打乱Collections.shuffle(pokers);System.out.println("洗牌后:" + pokers);// 发牌// 1.创建3个玩家集合,创建底牌集合ArrayList<Poker> player01 = new ArrayList<>();ArrayList<Poker> player02 = new ArrayList<>();ArrayList<Poker> player03 = new ArrayList<>();ArrayList<Poker> diPai = new ArrayList<>();// 2.遍历牌的集合//0   1   2   3   4   5   6   7   8   9   10 ... 51  52   53// pokers = [♦5], [♣4], [♦8], [♣A], [♣7], [♦2], [♠6], [♣J], [♥A], [♥7], [♥6], [♣5],[♦7], [♥10]// 玩家1:  只拿到索引0,3,6...的牌   索引 % 3 == 0// 玩家2:  索引1,4,7    索引 % 3 == 1// 玩家3:  索引2,5,8    索引 % 3 == 2// 3.根据索引将牌发给不同的玩家for (int i = 0; i < pokers.size(); i++) {// i表示索引,poker就是i索引对应的pokerPoker poker = pokers.get(i);if (i >= 51) { // 最后3张给底牌diPai.add(poker);} else if (i % 3 == 0) { // 玩家1player01.add(poker);} else if (i % 3 == 1) { // 玩家2player02.add(poker);} else if (i % 3 == 2) { // 玩家3player03.add(poker);}}// 看牌System.out.println("玩家1: " + player01);System.out.println("玩家2: " + player02);System.out.println("玩家3: " + player03);System.out.println("底牌: " + diPai);// 还要创建一副牌// 创建一个ArrayList用于存放一副牌}
}

代码规范版

抽取斗地主的代码

定义Poker类

public class Poker {private String name;private String color;public Poker() {}public Poker(String color, String name) {this.name = name;this.color = color;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}@Overridepublic String toString() {return "Poker{" +"name='" + name + '\'' +", color='" + color + '\'' +'}'+"\n";}
}

定义Poker的工具类,抽取功能代码(静态方法封装)

public class PokerTool {//创建牌方法public static ArrayList<Poker> createPokers() {//1、创建牌//a、创建牌的对象,属性(花色,名字)//b、创建54张牌,使用集合存储54张牌//        * 2张大小王//        * 4花色*13名字的牌//joker是小丑Poker bigJoker = new Poker("												

Java基础加强重温_05:Iterator迭代器、增强for循环、集合综合案例-斗地主、数据结构(栈、队列、数组、链表、红黑树)、List接口、Set接口相关推荐

  1. Java集合常见数据结构-栈/队列/数组/链表/红黑树

    数组 链表 红黑树

  2. JavaSE Collections类 , Iterator迭代器 , 增强for循环

    Collections 它是集合的工具类,为集合体系扩展了一些其他的方法.类中都是静态的方法,可以使用类名直接调用. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类 ...

  3. 【小白学Java】D20》》》Iterator迭代器 增强for循环

    [友情链接]---–->Java中的各种集合大汇总,学习整理 [友情链接]----–> Collection集合 [友情链接]----–> ArrayList集合及其常用功能 [友情 ...

  4. 【夯实Java基础】(三)史上最全集合框架归纳总结

    文章目录 集合框架的大体结构 详解主要类及接口 第一章 Collection集合 1.1 集合概述 1.2 集合框架 1.3 Collection 常用功能 第二章 Iterator迭代器 2.1 I ...

  5. 2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型

    2021-06-19复习java Collection集合 Iterator接口_迭代器 增强for循环 泛型 Collection集合 java.util.coLlection接口 所有单列集合的最 ...

  6. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

  7. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型

    文章目录 Collection集合 集合概述 java.util.Collection接口 Iterator迭代器 Iterator接口 Iterator接口的常用方法 说明 迭代器实现原理图: 增强 ...

  8. Java基础加强重温_13:XML(可拓展标记语言)、XML语法、XML约束、XML解析(Dom4j,JAXP)、Dom4j基本使用、Xpath表达式(XML路径语言)、XML解析综合案例

    摘要 Java基础加强重温_13: XML(可拓展标记语言.作用:小型数据库.框架配置文件.不同平台数据交换). XML语法(文档.标签/元素.属性.注释.转义字符.CDTA区) XML约束(DTD约 ...

  9. Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】

    第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...

最新文章

  1. 定时备份_如何将电脑中的文件进行定时备份?
  2. 66.javac 编译与 JIT 编译\编译过程\javac 编译\词法、语法分析\填充符号表\语义分析\字节码生成\JIT 编译
  3. 【言简意赅】四句话搞懂第一范式,第二范式,第三范式,以及BCNF
  4. java客户端api文档_Java 11:新的HTTP客户端API
  5. 【UOJ 48】最大矩形面积(修正版)
  6. 新能源界首陷“漏电门”奥迪将召回1644辆电动车e-tron
  7. php商品分类添加字段,zblogPHP分类模板添加自定义字段(调用UEditor编辑器输入法)...
  8. c++的学习笔记之二
  9. php基础知识之字符串处理
  10. XCode6自定义pch文件
  11. HiC软件安装篇之Lachesis
  12. hge引擎配置登录器教程_HGEM2引擎登录器列表格式TXT
  13. php中文制作,php中文验证码制作教程
  14. 74HC595芯片单颗与级联的万能代码|2021-09-03
  15. 【龙芯1c库】封装硬件SPI接口和使用示例
  16. OnTheHub 免费取得Offfice/Windows 正版序号,学生/教师限定
  17. go语言快速入门:流程控制(7)
  18. 回文数—简单方法(C语言)
  19. AdaBoost算法-课堂笔记
  20. MW150UH驱动程序Linux,Ubuntu驱动Mecury MW150UH无线网卡总结

热门文章

  1. python读取路径中相对路径_python 路径相关
  2. PyAudio库录音代码
  3. Netty基础,Netty实现群聊系统
  4. 如何获取某个坍缩后的值在不同坐标系统中的位置
  5. centos7仅安装mysql/mongodb客户端
  6. 肾缺血再灌注动物模型 大小鼠肾缺血再灌注IR模型
  7. 关于BigDecimal 的计算
  8. 推销给小布什总统一把斧子
  9. 001.西门子440变频器-概述
  10. 机器人操作系统ROS(23)关于导航路径优化