zoukankan      html  css  js  c++  java
  • 设计模式之Interator模式(1)

    interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的。


    先来看看JDK容器是怎么实现的吧,首先看看ArrayList,它有海纳百川的肚量,似乎找不到他的边,它可以bigger than bigger,有想过为什么么?

    为什么叫ArrayList,不叫DogList,因为ArrayList封装了一个数组,当向这个List中添加东西的时候,其实就是往数组里面加东西,先去判断这个数组是不是已经满了,如果是,就再生成一个更大的数组,把原数组的东西移动到新生成的数组上面,再去添加新的东西。所以,ArrayList肯定性能上比不上Array,因为你每次都要新生成一个新的数组,还需要move,但是人家不需要指定大小,所以还是比较受欢迎一点!

    这里我忽略泛型的用法,用code来描述一个简单的ArrayList:

    package cn.asto.Interator;
    
    public class ArrayList implements List{
        private int index = 0;
        private Object[] object = new Object[10];
        public void add(Object o ){
            if(index==object.length){
                Object[] newObject = new Object[object.length+10];
                System.arraycopy(object, 0, newObject, 0, object.length);
                newObject[index] = o;
                object = newObject;
            }
            object[index]=o;
            index++;
        }
        public int size(){
            return index;
        }
        @Override
        public Iterator iterator() {
            
            return new arrayIterator();
        }
        
        
        private class arrayIterator implements Iterator{
            private int currentIndex;
            @Override
            public boolean hasNext() {
                if(currentIndex==index)return false;
                return true;
            }
    
            @Override
            public Object next() {
                Object o = object[currentIndex];
                currentIndex++;
                return o;
            }
            
        }
    }

    不难吧?知道原理的话,看看觉得也就这样子。


    来个难点的?LinkedList:

    Thinking....

    给答案:

    Node.java:

    package cn.asto.Interator;
    
    public class Node {
    
        private Node next;//下一个节点的引用
        private Object data;//存数据
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
        
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
        public Node(Object data,Node next) {
            super();
            this.next = next;
            this.data = data;
        }
        
        
    }

    LinkedList.java:

    package cn.asto.Interator;
    
    public class LinkedList {
    
        private Node head = null; //头节点
        private Node tail = null;//尾节点
        private int size = 0;
        public void add(Object o){
            Node n = new Node(o,null);
            if(head==null){
                 head = n;
                 tail = n;
            }else{
                tail.setNext(n);
                tail = n;
            }
            size ++;
        }
        
        public int size(){
            return size;
        }
    }

    当然这个集合当然没有JDK所有的方法,我只是简单模拟了一下,为了方便Interator的模式学习。

    上面的实现最好可以面向接口去编程,去约束方法名字,变得规范,父类引用子类对象。面向接口编程还有一个好处,可替换性。

    比如你可以新建一个List接口:

    package cn.asto.Interator;
    
    public interface List {
    
         public void add(Object o);
         public int size();
         public Iterator iterator();
    
    
    }

    让ArrayList和LinkedList去实现它就可以了。

  • 相关阅读:
    NGINX_深度优化实践
    NFS服务端___NFS客户端
    NFS 批量管理 分发
    MYSQL---数据备份与还原
    MYSQL---建立字符集数据库
    MYSQL---基于mysql多实例数据库创建主从复制
    MYSQL---关于MYSQL优化
    bug记录-left jion连接后不是一对一情况时,记得去重
    bug记录-不等于某个值,查询后注意不包括为空的情况(由于NULL不能直接用算术运算符进行比较值。要想把为NULL 的那行也查询出来的话,只能使用IS NULL)
    bug记录-sqljion连接 like
  • 原文地址:https://www.cnblogs.com/think-in-java/p/4752964.html
Copyright © 2011-2022 走看看