iterator方法

迭代器的作用:就是用于抓取集合中的元素

注:迭代器返回的一个接口类型的实现类,是一种多态的用法,而不是接口在调用方法

public class Demo2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Money m=test();
m.makeMoney();
}
public static Money test(){
return new Worker();
}
}
interface Money{
public void makeMoney();
}
class Worker implements Money{
@Override
public void makeMoney() {
// TODO Auto-generated method stub
System.out.println("工人在赚钱...");
}
} 结果:
工人在赚钱...

这里就用了多态,返回了一个Money的实现类

hasNext()    问是否有元素可以遍历,若可以,则返回true
  如果仍有元素可以迭代,则返回 true。
next()     获取元素
  返回迭代的下一个元素。
remove()
  从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)

import java.util.ArrayList;
public class Demo1 { public static void main(String[] args) {
// TODO Auto-generated method stub
Collection c=new ArrayList();
c.add("狗娃");
c.add("狗剩");
c.add("铁蛋");
c.add("美美");
//遍历集合的元素:--------->方式一:可以使用toArray方法
/*Object[] arr=c.toArray();//把集合的元素存储到一个Object的数组中返回
System.out.println("集合的元素为:"+Arrays.toString(arr));
*/
//要求使用iterator迭代器遍历
Iterator it=c.iterator();//返回一个迭代器
System.out.println("有元素可以遍历吗?"+it.hasNext());
while (it.hasNext()) {
System.out.println("元素:"+it.next());//获取元素
}
it.remove();
System.out.println("集合的元素:"+c);
} } 结果:
有元素可以遍历吗?true
元素:狗娃
元素:狗剩
元素:铁蛋
元素:美美
集合的元素:[狗娃, 狗剩, 铁蛋]

作业2:使用集合实现注册登陆功能,

第一步: 提示用户选择功能, A(注册) B(登陆) 。 要求: 功能选择 的时候要忽略大小写。

注册:
1. 提示用户输入注册的账号(数字)与密码,如果输入的id号已经存在集合中,提示用户重新输入。 注册完毕之后,把集合中的所有用户信息打印出来。(使用:toArrry()方法)

登陆:
提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在集合中,那么登陆成功,否则登陆失败。

import java.util.ArrayList;
public class Demo3 { static Scanner sc=new Scanner(System.in);
static Collection users=new ArrayList();//使用该集合保存所有的用户信息 public static void main(String[] args) {
// TODO Auto-generated method stub while (true) {
System.out.println("请选择功能: A(注册) B(登陆) ");
String option=sc.next();
if ("a".equalsIgnoreCase(option)) {
reg();
}
else if ("b".equalsIgnoreCase(option)) {
login();
}
else {
System.out.println("你的选择有误,请重新输入!");
}
}
} public static void login() {
System.out.println("你选择了登录功能...");
System.out.println("请输入账号:");
int id=sc.nextInt();
System.out.println("请输入密码:");
String password=sc.next();
//判断集合的用户是否存在该用户名与密码
//遍历集合的元素,查看是否存在该用户信息 boolean isLogin=false;//定义一个变量用于记录是否登录成功的信息,默认是没有登录成功的
Iterator it=users.iterator();
while (it.hasNext()) {
User user=(User)it.next();
if (user.getId()==id&&user.getPassword().equals(password)) {
//存在该用户信息,登录成功
isLogin=true;
}
}
if (isLogin) {
System.out.println("欢迎登录...");
}
else {
System.out.println("用户名或者密码错误,登录失败...");
}
} public static void reg() {
User user =null;
while (true) {
System.out.println("请输入账号");
int id=sc.nextInt();
user =new User(id,null);
//System.out.println(id);
if (users.contains(user)) {
//如果存在
System.out.println("该账号已经存在,请重新输入账号");
}
else {
//如果不存在
break;
}
}
//System.out.println(user.getId());
System.out.println("请输入密码:");
String password=sc.next();
user.setPassword(password);
//把user对象保存到集合中
users.add(user);
System.out.println("注册成功!");
System.out.println("当前注册的人员:"+users);
} }
class User{
private int id;
private String password; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {}
public User(int id,String password) {
this.id=id;
this.password=password;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
User user=(User)obj;
return this.id==user.id;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "{账号:"+this.id+" 密码:"+this.password;
}
} 结果:
请选择功能: A(注册) B(登陆)
a
请输入账号
110
请输入密码:
gouwa
注册成功!
当前注册的人员:[{账号:110 密码:gouwa]
请选择功能: A(注册) B(登陆)
b
你选择了登录功能...
请输入账号:
110
请输入密码:
gouwa
欢迎登录...
请选择功能: A(注册) B(登陆)
c
你的选择有误,请重新输入!
请选择功能: A(注册) B(登陆)
b
你选择了登录功能...
请输入账号:
110
请输入密码:
gou
用户名或者密码错误,登录失败...
请选择功能: A(注册) B(登陆)

List接口:有序,可重复

有序:集合的有序不是指自然顺序,而是指添加进去的顺序与元素出来的顺序是一致的。

ctrl+shift+/     添加多行注释

ctrl+shift+\     取消多行注释

添加:

add(int index, E element)     把元素添加到集合的指定索引值位置上
addAll(Collection<? extends E> c)      把参数集合的元素添加到调用者集合指定索引值的位置上

public class Demo2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("狗娃");
list.add("狗剩");
list.add("铁蛋"); /*list.add(1, "本山");*/
List list2=new ArrayList();
list2.add("本山");
list2.add("沈阳");
list.addAll(2, list2);
System.out.println("集合的元素:"+list);
} } 结果:
集合的元素:[狗娃, 狗剩, 本山, 沈阳, 铁蛋]

获取:

get(int index)     根据索引值获取集合中的元素
indexOf(Object o)      找出指定元素第一次出现在集合中的索引值
lastIndexOf(Object o)      找指定的元素最后一次出现在集合中的索引值
subList(int fromIndex, int toIndex)      指定开始与结束的索引值截取集合中的元素

public class Demo2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("狗娃");
list.add("狗剩");
list.add("铁蛋");
list.add("狗娃");
/*list.add(1, "本山");
List list2=new ArrayList();
list2.add("本山");
list2.add("沈阳");
list.addAll(2, list2);*/
System.out.println("找出指定元素在集合中的索引值:"+list.indexOf("狗剩"));
System.out.println("找到本山:"+list.indexOf("本山"));
System.out.println("最后一次:"+list.lastIndexOf("狗娃"));
System.out.println("get方法获取元素:"+list.get(1));
List subList=list.subList(1, 4);
System.out.println("子集合的元素是:"+subList);
System.out.println("集合的元素:"+list);
} } 结果:
找出指定元素在集合中的索引值:1
找到本山:-1
最后一次:3
get方法获取元素:狗剩
子集合的元素是:[狗剩, 铁蛋, 狗娃]
集合的元素:[狗娃, 狗剩, 铁蛋, 狗娃]

修改:

set(int index, E element)     使用指定的元素替换指定索引值位置的元素

public class Demo2 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("狗娃");
list.add("狗剩");
list.add("铁蛋");
list.add("狗娃"); list.set(3, "本山");
System.out.println("集合的元素:"+list);
} } 结果:
集合的元素:[狗娃, 狗剩, 铁蛋, 本山]

List接口中特有的方法具备的特点:操作的方法都存在索引值

只有List接口下面的集合类才具备索引值,其他接口下面的集合类都没有索引值

迭代:

listIterator()     返回List接口中特有的迭代器

hasPrevious()     判断是否存在上一个元素
previous()      获取上一个元素    当前指针先向上移动一个单位,然后再取出当前指针指向的元素

next()        先取出当前指针指向的元素,然后指针向下移动一个单位
————————————————————

add(E e)     把当前元素插入到当前指针指向的位置上
set(E e)      替换迭代器最后一次返回的元素

public class Demo3 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("狗娃");
list.add("狗剩");
list.add("铁蛋");
list.add("美美"); ListIterator it=list.listIterator();
/*System.out.println("有上一个元素吗?"+it.hasPrevious());
it.next();
System.out.println("获取上一个元素:"+it.previous());
it.next();
it.next();
it.add("张三");*/
it.next();
it.next();
it.set("张三");
System.out.println("集合的元素:"+list);
} } 结果:
集合的元素:[狗娃, 张三, 铁蛋, 美美]

使用三种遍历方式遍历集合中的元素:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; public class Demo4 { public static void main(String[] args) {
// TODO Auto-generated method stub
List list=new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五"); System.out.println("---------get方法遍历----------");
for (int i=0;i<list.size();i++) {
System.out.print(list.get(i)+",");
} System.out.println("\r\n---------使用迭代器正序遍历---------");
ListIterator it=list.listIterator();//获取到迭代器
while (it.hasNext()) {
System.out.print(it.next()+",");
} System.out.println("\r\n---------使用迭代器逆序遍历---------");
while (it.hasPrevious()) {
System.out.print(it.previous()+",");
}
} } 结果:
---------get方法遍历----------
张三,李四,王五,
---------使用迭代器正序遍历---------
张三,李四,王五,
---------使用迭代器逆序遍历---------
王五,李四,张三,

迭代器在迭代元素的时候的时候要注意的事项:

在迭代器迭代元素的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作。

如果使用过了集合对象改变集合中的元素个数,那么就会出现ConcurrentModificationException异常。

迭代器迭代元素的过程中:迭代器一旦创建到使用的时间。

List:有序,可重复

常用的:

----------------|  ArrayList      ArrayList底层是维护了一个Object数组实现的,特点:查询速度快,增删慢。

----------------|   LinkedList

----------------|   Vector(了解即可)

ArrayList特有的方法:
ensureCapacity(int minCapacity)  指定容量

trimToSize()    把数组中无用的删除 比如初始容量为10 只用了3个 那么就把剩下的7个删除

笔试题目:使用ArrayList无参的构造函数创建一个对象时,默认的容量是多少?如果长度不够使用时又自动增长多少?

ArrayList底层是维护了一个Object数组实现的,使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍

private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//左移一位就是除以2,所以就是+0.5
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}

查询速度快:因为维护的数组元素与元素之间的内存地址是连续的,所以就像一个线性表,只需要知道首元素地址,就可以很方便的找到后面的元素了

增加:创建一个新的数组 将原数组复制进去

删除:删除待删除元素 然后把后面的全部向前移动一位

什么时候使用ArrayList:如果目前的数据是查询比较多 增删比较少的时候,就用ArrayList存储这批数据                 比如:高校的图书馆

需求:编写一个函数清除集合中的重复元素 如果书号一样就是重复的元素。要求:遍历集合元素时必须使用迭代器

package cn.itcast.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
//需求:编写一个函数清除集合中的重复元素 如果书号一样就是重复的元素。要求:遍历集合元素时必须使用迭代器
public class Demo7 { public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList list=new ArrayList();
list.add(new Book(110,"Java编程思想"));
list.add(new Book(220,"Java核心技术"));
list.add(new Book(330,"深入JavaWeb"));
list.add(new Book(110,"Java神书")); ArrayList list2=clearRepeat(list);
System.out.println("新集合的元素是:"+list2);
} public static ArrayList clearRepeat(ArrayList list) {
ArrayList newList =new ArrayList();//创建一个新的集合
//获取迭代器
Iterator it=list.iterator();
while (it.hasNext()) {
Book book=(Book)it.next();//从旧集合中获取的元素
if (!newList.contains(book)) {
//如果新集合没有包含该书籍,那么就存储到新集合中
newList.add(book);
}
}
return newList;
}
}
class Book{
int id;
String name;
public Book(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "{书号:"+this.id+" 书名:"+this.name+" }";
} @Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Book book=(Book)obj;
return this.id==book.id;
}
} 结果:
新集合的元素是:[{书号:110 书名:Java编程思想 }, {书号:220 书名:Java核心技术 }, {书号:330 书名:深入JavaWeb }]

LinkedList:LinkedList底层是使用了链表数据结构实现的 特点:查询速度慢,增删快

LinkedList特有的方法:

LinkedList特有的方法:
1:方法介绍
addFirst(E e) 把元素加到集合的首位置上
addLast(E e) 把元素添加到集合的末尾处
getFirst() 获取集合中首位置的元素
getLast() 获取集合中末尾处的元素
removeFirst() 删除集合中的首位置元素并返回
removeLast() 删除集合中的末尾元素并返回
如果集合中没有元素,获取或者删除元素抛:NoSuchElementException
2:数据结构
1:栈 (1.6):主要用于实现堆栈数据结构的存储方式
先进后出
push()
pop()
2:队列(双端队列1.5):主要是为了让我们可以使用LinkedList模拟队列数据结构的存储方式
先进先出
offer()
poll()
3:返回逆序的迭代器对象
descendingIterator() 返回逆序的迭代器对象

import java.util.LinkedList;

public class Demo8 {

    public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList list=new LinkedList();
list.add("张三");
list.add("李四");
list.add("王五");
list.addFirst("狗娃");
list.addLast("狗剩");
System.out.println("获取集合中首位置的元素:"+list.getFirst());
System.out.println("获取集合中末尾的元素:"+list.getLast()); System.out.println("删除集合中的首位置元素并返回:"+list.removeFirst());
System.out.println("删除集合中的末尾元素并返回:"+list.removeLast());
System.out.println("集合中的元素:"+list); } } 结果:
获取集合中首位置的元素:狗娃
获取集合中末尾的元素:狗剩
删除集合中的首位置元素并返回:狗娃
删除集合中的末尾元素并返回:狗剩
集合中的元素:[张三, 李四, 王五]

需求:使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式

package cn.itcast.list;

import java.util.LinkedList;

/*
1:栈 (1.6):主要用于实现堆栈数据结构的存储方式
先进后出
push()
pop()
2:队列(双端队列1.5):主要是为了让我们可以使用LinkedList模拟队列数据结构的存储方式
先进先出
offer()
poll()
需求:使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式
*/
public class Demo9 { public static void main(String[] args) {
// TODO Auto-generated method stub
StackList list=new StackList();
list.add("马云");
list.add("校长");
list.add("思聪");
//System.out.println(list.pop());
int size=list.size();
for (int i=0;i<size;i++) {
System.out.println(list.pop());
}
System.out.println("----------------------");
TeamList list2=new TeamList();
list2.add("马云");
list2.add("校长");
list2.add("思聪");
//System.out.println(list.pop());
int size2=list2.size();
for (int i=0;i<size2;i++) {
System.out.println(list2.remove());
}
} }
//使用LinkedList模拟堆栈的数据结构存储方式
class StackList{
LinkedList list;
public StackList() {
list=new LinkedList();
}
//进栈
public void add(Object o) {
list.push(o);
}
//出栈
public Object pop() {
return list.pop();
}
//获取元素个数
public int size() {
return list.size();
}
}
//使用LinkedList模拟队列的存储方式
class TeamList{
LinkedList list;
public TeamList() {
list=new LinkedList();
}
public void add(Object o) {
list.offer(o);
}
public Object remove() {
return list.poll();
}
//获取元素个数
public int size() {
return list.size();
}
} 结果:
思聪
校长
马云
----------------------
马云
校长
思聪

Java学习笔记(15)的更多相关文章

  1. Java学习笔记15

    do-while循环时while循环的变体语法如下:do{  // 循环体 语句(组);}while(循环继续条件); 如果循环中的语句至少需要执行一次,那么建议使用do-while循环. for循环 ...

  2. Thinking In Java 学习笔记 1-5 章

    第1章 对象导论 本章主要讲OOP的思想及一些OOP基本概念 1.抽象过程:万物都是对象,对象具有状态.行为和标识.对象拥有属性和方法,以及在内存中的唯一地址. 2.每个对象都有一个接口:通过接口给对 ...

  3. java学习笔记15(String 类,StringBuffer)

    /* * String类的特点: * 所有的""都是String的对象 * 字符串一旦创建就是常量,不能改变 */ public class StringDemo { public ...

  4. Java 学习笔记(15)——反射

    Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...

  5. Java学习笔记15(面向对象八:匿名对象、内部类)

    匿名对象: 是指创建对象的时候,只有创建对象的语句,却没有把对象地址值赋给某个变量 创建一个普通对象: Person p = new Person(); 创建一个匿名对象: new Person(); ...

  6. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

  9. Java学习笔记--Swing用户界面组件

    很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...

  10. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. js中的true和false

    1.false undefined.NaN.0.null和空字符串''均被视为false 2.true 除上述以外的其它情况一律被视作true

  2. 结合BeautyEye开源UI框架实现的较美观的Java桌面程序

    BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序,主要功能就是图灵机器人和一个2345网站万年历的抓取.... 挺简单而且实用的一个项目,实现 ...

  3. 大原則 研讀 spec 與 code 的 心得

    最近在研究 stm32f429i-disc0 的 device tree source code, 並且 參造 Devicetree Specification Release 0.1, 在 dts ...

  4. Centos_Lvm_Create pv vg lv and mount

    re-scan new disks without restarting CentOS re-scan new disks(/dev/sdc): #ls /sys/class/scsi_host/ h ...

  5. Django 国内最全教程

    https://code.ziqiangxuetang.com/django/django-tutorial.html

  6. 002 Lock和synchronized的区别和使用

    转自 https://www.cnblogs.com/baizhanshi/p/6419268.html 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟 ...

  7. .net连接sql server的几种连接字符串的写法

    .net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...

  8. 单文件组件(single-file components)

    介绍 我们可以使用预处理器来构建简洁和功能更丰富的组件,比如 Pug,Babel (with ES2015 modules),和 Stylus.

  9. C#面向对象(OOP)入门—第一天—多态和继承(方法重载)

    面向对象是什么 面向对象是一种基于对象的编程方法,它取代了仅仅依靠方法和流程的编程方式.面向对象的编程语言中,对象(object)其实就是指特定类型.或某个类的实例.面向对象使得编程人员更容易组织和管 ...

  10. inux权限管理(1)

    1.linux系统文件普通权限 2.文件所属主的设置,组的指定 3.特殊权限 4.acl权限 5.su命令及其注意事项和sudo权限 6.权限管理的注意点 0.首先,在linux下用户账户是分角色的, ...