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 ...
随机推荐
- LeetCode OJ:Binary Tree Paths(二叉树路径)
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- LeetCode OJ:Balanced Binary Tree(平衡二叉树)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- 魔法效果——dijkstra+堆(邻接表存储)
dijkstra本身每次要for一遍,才能找出最小的节点,但用了堆之后,直接取出堆首就可以了. 但要注意的一点是,c++自带的stl里的priority_queue本身是先入大出的,而我们要求的是最小 ...
- 基于zepto移动4*3九宫格转奖
最近根据公司需求,要把移动端的圆形转盘抽奖,改为九宫格的形式,查找资料搞定了,纪录下demo代码. 页面的展现样式,如下 比较简单,就是红色的背景图,在这10个格子里转动 具体代码如下 html &l ...
- set/multiset和map/multimap用法小结
二叉搜索树是ACM中经常需要用到的数据结构,熟练掌握map和set的用法很关键,现对其做一个简单的总结. 主要的功能有:插入元素,查找元素,删除,遍历/反向遍历. 插入,删除和查找操作的时间都和树的高 ...
- 关于/usr/bin/ld: cannot find -lcrypto 的错误
Linux下 build code 时,要做 -lssl, -lcrypto 的链接,出现类似下面的错误: /usr/bin/ld: cannot find -lcrypto /usr/bin/ld: ...
- markdown的学习
开始 语法 编辑器 sublime配置 图床 体验 开始 昨天晚上加上今天上午,折腾了算是一天的markdown编辑器. 原因是,为了写博客.在博客园写的东西,想法不到简书里,结果发现有部分乱码,以及 ...
- PCIe相关的操作命令
1.lspci --显示列举系统目前的pcie设备 43:00.0 Class 0004: Device 104c:b800 (rev 01) //netra设备 设备编号 ...
- (转)list_orderby
本文转载自:http://blog.csdn.net/liyifei21/article/details/6558098 一个条件排序情况 list.OrderBy(item => tem.St ...
- 机器学习:逻辑回归(scikit-learn 中的逻辑回归)
一.基础理解 使用逻辑回归算法训练模型时,为模型引入多项式项,使模型生成不规则的决策边界,对非线性的数据进行分类: 问题:引入多项式项后,模型变的复杂,可能产生过拟合现象: 方案:对模型正则化处理,损 ...