Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList
一、有如下几个类
1.接口Collection.java
2.接口Iterator.java
3.ArrayList.java
4.LinkedList.java
5.Node.java
关系如下:

代码如下:
1.接口Collection.java
public interface Collection<E> {
public void add(E e);
public int size();
public Iterator iterator();
}
2.ArrayList.java
public class ArrayList<E> implements Collection<E>{
//先给定一个长度为10的数组
Object [] objects = new Object[10];
//冗余一个int指数,方便判定是组是否为满和返回集合大小
int index = 0;
@Override
//1.动态添加元素
public void add(E e) {
//1.1先判断数组是否已满
if(index == objects.length){
Object [] newObjects = new Object[objects.length*2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects; //数组是引用数据类型
}
//1.2为新添加的元素指定下标
objects[index] = e;
//1.3index自加1,以方便返回集合在大小
index++;
}
//2.根据下标访问元素
@Override
//3.返回集合大小
public int size() {
return index;
}
@Override
public Iterator iterator() {
return new ArrayListIterator();
}
private class ArrayListIterator implements Iterator {
private int currentIndex = 0;
@Override
public Object next() {
// 返回最下一个元素
Object o = objects[currentIndex];
currentIndex++;
return o;
}
@Override
public boolean hasNext() {
// 判断是否为最后一个元素
if(currentIndex >= index){
return false;
}
return true;
}
}
}
3.LinkedList.java
public class LinkedList<E> implements Collection<E> {
private Node head;
private Node tail;
private int size;
public void add(E e){
Node n = new Node(e, null);
if(head == null){
head = n;
tail = n;
size++;
} else {
tail.setNext(n);
tail = n;
size++;
}
}
public int size(){
return size;
}
@Override
public Iterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
private Node currentNode = head;
@Override
public Object next() {
Object o = currentNode.getData();
currentNode = currentNode.getNext();
return o;
}
@Override
public boolean hasNext() {
if(currentNode.getNext() == null){
return false;
}
return true;
}
}
}
4.Node.java
public class Node {
private Object data;
private Node next;
public Node(Object data, Node next) {
super();
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
5.Iterator.java
public interface Iterator {
public Object next();
public boolean hasNext();
}
6.Dog.java
public class Dog {
private int id;
public Dog(int id) {
super();
this.id = id;
}
@Override
public String toString() {
return "Dog"+id;
}
}
7.测试类CollectionTest.java
public class CollectionTest {
@Test
public void test() {
Collection co = new LinkedList();
for(int i = 0 ;i < 15 ;i++){
co.add(new Dog(i));
}
System.out.println(co.size());
Iterator it = co.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
运行结果

Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList的更多相关文章
- Java-马士兵设计模式学习笔记-命令模式
一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...
- Java-马士兵设计模式学习笔记-桥接模式
一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...
- Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口
续上一篇 <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...
- Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较
一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...
- Java-马士兵设计模式学习笔记-建造者模式
一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...
- Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑
一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...
随机推荐
- ViewPager渲染背景颜色渐变(引导页)--第三方开源--ColorAnimationView
下载地址:https://github.com/TaurusXi/GuideBackgroundColorAnimation 使用方法如下: <FrameLayout xmlns:android ...
- hdoj-1046-Gridland(规律题)
题目链接 #include <algorithm> #include <iostream> using namespace std; int main() { int t; c ...
- ios 加密解密(包括base64,DES)非原创
.h文件 #import <Foundation/Foundation.h> /******字符串转base64(包括DES加密)******/ #define __BASE64( tex ...
- nginx中关于并发数的问题worker_connections,worker_processes
我认为,要搞清楚这个公式是否正确,以及如何计算的,那首先要对nginx的各个配置说明有清晰的认识: 从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法: nginx作为 ...
- [TopCoder12727]FoxAndCity
vjudge 题意 你有一张\(n\)点的无向图,每个点有一个点权\(w_i\).图中原来存在一些边,你可以任意给这张图加上一些边. 记点\(i\)到点\(1\)的距离为\(d_i\),你需要最小化\ ...
- Vue 内联样式的数据绑定
Vue 内联样式的数据绑定 之前学的是数据绑定 class,现在可以将数据绑定到 style 中. <div id="app"> <div v-bind:styl ...
- 关于C语言字符串函数使用的一点心得
就字符串的拼接函数为例strcat. 原型:extern char *strcat(char *dest,char *src);用法:#include <string.h> 功能:把src ...
- VirtualBox为虚拟OS硬盘扩容
1.关闭虚拟OS. 2.进入到在VirtualBox的安装路径,执行命令例子如: VBoxManage.exe modifyhd F:\VM\Debian7.2.vdi --resize 40000 ...
- 二:HTML文本编译器 kindeditor-4.1.10 的使用 SpringMVC+jsp的实现
这和一篇与上一篇的区别在与,上一篇是直接请求到action我们剩下的都是我们全部手动处理, 而这一片篇是由kindeditor内部处理,图片上传到本地,基本上没什么区别,但是有一点一定要注意的就是,这 ...
- 2011年浙大:Graduate Admission
题目描述: It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 app ...