码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList与LinkedList

时间:2015-04-23 23:23:01      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

下面是ArrayList

package charpter3;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyArrayList <AnyType> implements Iterable<AnyType> {
	
	private static final int DEFAULT_CAP = 10;
	
	private int theSize ;
	private AnyType [] theItems ;
	
	public MyArrayList(){
		clear() ;
	}
	public void clear (){
		theSize =0;
		ensureCap(DEFAULT_CAP);
	}
	
	public boolean isEmpty (){
		return size()==0;
	}
	
	public void trimToSize(){
		ensureCap(size()) ;
	}
	public AnyType get(int idx){
		if (idx<0|| idx>= size())
			throw new ArrayIndexOutOfBoundsException();
		return theItems[idx] ;
	}
	/**
	 * 返回了原来的值
	 */
	public AnyType set(int idx, AnyType newVal ){
		if (idx<0|| idx>=size()) 
			throw new ArrayIndexOutOfBoundsException() ;
		AnyType old = theItems[idx] ;
		theItems[idx] = newVal ;
		return old ;
	}
	
	public int  size(){
		return theSize ;
	}
	public void ensureCap(int newCap){
		if (newCap<theSize)
			return ;
		AnyType [] old = theItems ;
		theItems = (AnyType[]) new Object[newCap] ;
		for (int i=0;i<size() ; i++){
			theItems[i] = old[i];
		}
	}
	
	public boolean add (AnyType x ){
		add(size(), x);
		return true ;
	}
	
	public void add(int idx ,AnyType x ){
		if (theItems.length== size()) 
			ensureCap(size()*2+1);
		for (int i = theSize;i>idx;i--){
			theItems[i]= theItems[i-1]; //向后移动 
		}
		theItems[idx] = x;
		theSize++;
	}
	public AnyType remove (int idx){
		AnyType removedItem = theItems[idx] ;
		for (int i=idx ;i<size()-1 ; i++){ //后面的前移
			theItems [i] =theItems[i+1] ;
		}
		theSize --;
		return removedItem ;
	}
	public Iterator<AnyType> iterator() {
		// TODO Auto-generated method stub
		return new ArrayListIterator();
	}

	private class ArrayListIterator implements Iterator<AnyType>{
		
		private int current =0;
		
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return current<size(); 
		}

		public AnyType next() {
			if (!hasNext()){
				throw new NoSuchElementException() ;
			}
			return theItems[current++];
		}

		@Override
		public void remove() {
			MyArrayList.this.remove(--current) ;
		}

	}

}

  这个实现里面的ArrayListIterator是一个内部类,这里分析下内部类与嵌套类。

一.什么是嵌套类和内部类

可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:
  其一、在一个类(外部类)中直接定义的内部类;
  其二、在一个方法(外部类的方法)中定义的内部类;
  其三、匿名内部类。

  下面,我将说明这几种嵌套类的使用及注意事项。

 

class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}

  为什么使用嵌套类(什么时候使用嵌套类): 

  • It is a way of logically grouping classes that are only used in one place. - If a class is useful to only one other class, then it is logical to embed it in that class and keep the two together. Nesting such "helper classes" makes their package more streamlined.
  • 如果一个类只在一个地方被使用,同时这个类和另外一个类在逻辑上紧密相关,那么这个类可以被设计成内部类。
  • It increases encapsulation. - Consider two top-level classes, A and B, where B needs access to members of A that would otherwise be declared private. By hiding class B within class A, A‘s members can be declared private and B can access them. In addition, B itself can be hidden from the outside world.
  • 增强了封装性
  • Nested classes can lead to more readable and maintainable code. - Nesting small classes within top-level classes places the code closer to where it is used.
  • 嵌套类增加代码的可读性和可维护性(因为嵌套类从逻辑上来说都是相关的)。


静态嵌套类的(static nested class): 

  • 可以独立于外部类被实例化
  • 无法访问外部类中的非静态变量和方法(因此静态嵌套类用的不多)
  • 静态嵌套类要和其外部类的实例变量(或者其他类)交互的话,其行为和一般顶级类一样
  • 实际上,静态嵌套类就是一个为了打包方便而被嵌套进外部类的顶级类。


非静态嵌套类(内部类inner class): 

    • 想要实例化必须先实例化外部类。
    • 可以访问外部类中的需要实例化的变量和方法,

 

ArrayList与LinkedList

标签:

原文地址:http://www.cnblogs.com/chuiyuan/p/4452024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!