02-ArrayList

java版本数据结构第二节课----ArrayList

  • 学习目标
    • 学习内容
      • 学习产出

学习目标

学习目标:了解ArrayList

学习内容

学习内容:ArrayList

学习产出

学习产出:

包含在ArrayList.java中:
package com.mj;

import javax.lang.model.element.Element;
import javax.swing.text.StyledEditorKit.ForegroundAction;

public class ArrayList<E> {
     //E是存放元素的类型========>泛型

	
	private int size;//元素的数量
	private E[] elements;//所有元素(本身)
	
	private static final int DEFAULT_CAPACITY =2;
	private static final int ELEMENT_NOT_FOUND =-1;
	
	@SuppressWarnings("unchecked")
	public ArrayList(int capaticy) {
     
		// TODO 自动生成的构造函数存根
		capaticy = (capaticy<DEFAULT_CAPACITY)?DEFAULT_CAPACITY:capaticy;
		elements = (E[]) new Object[capaticy];
	}
	
	public ArrayList() {
     
		this(DEFAULT_CAPACITY);
	}
	
	public void clear() {
     
	//清除所有元素	
		for(int i = 0; i< size; i++) {
     
			elements[i]=null;
		}
		size=0;
	}
	
	public int size() {
     
	//元素的数量
		return size;
	}
	
	public boolean isEmpty() {
     
	//是否为空	
		return size==0;
	}
	
	public boolean contains(E element) {
     
	//是否包含某个元素	
		
		return indexOf(element) != 	ELEMENT_NOT_FOUND;//不等于-1返回真
	}
	
	public void add(E element) {
     
		//添加元素到尾部
		//elements[size++]=element;
		add(size,element);
	}
	
	public E get(int index) {
     
		//获取某个元素的位置

		rangCheck(index);
		
		return elements[index];
	}
	
	public  E set(int index,E element) {
     		//返回的值是index,所以返回值是int类型
		rangCheck(index);
		
		E old=elements[index];//先把原来的index取出来
		elements[index]=element;//再把新的赋给新的index
		return old;
	}
	
	public void add(int index,E element) {
     
		//在index位置插入一个元素
		rangCheckForAdd(index);
		
		ensurCapacity(size+1);//保证有多少容量
		
		for(int i =size -1;i>=size;i++) {
     
			elements[i+1]=elements[i];//把前面一个元素赋给后面一个元素			
		}
		elements[index]=element;
		size++;
	}
	
	public E remove(int index) {
     
		//删除一个index位置的元素
		rangCheck(index);
		
		E old =elements[index];
		
		for (int i = index+1; i < size-1; i++) {
     
			elements[i-1]=elements[i];
		}
		
		size--;
		elements[size]=null;
		return old;
	}
	
	public int indexOf(E element) {
     
		//看一下这个元素的位置,或者说是索引
		//=>其实就是遍历
		if(element == null) {
     
			for(int i = 0; i< size;i++) {
     
				if(elements[i]==null)return i;
				//这个for在找null啊!!!!!!
			}
		}else {
     
			for(int i=0;i<size;i++) {
     
				if(elements[i].equals(element)) 
				//比较的是内存地址,如果地址一样,就相等
					return i;
				}
			}
			return ELEMENT_NOT_FOUND;
		}
	
	
	//封装一下
	private void ensurCapacity(int capacity) {
     
		//保证要有capacity个容量
		int oldCapacity = elements.length;
		if(oldCapacity>=capacity) {
     
			//新容量为就容量的1.5倍
			int newCapacity = oldCapacity + (oldCapacity>>1);
			E[] newElements =(E[]) new Object[newCapacity];
			for(int i = 0;i<size;i++) {
     
				newElements[i]=elements[i];
			}
			elements = newElements;
			
			System.out.println(oldCapacity + "扩容为" + newCapacity +"说明:扩容为1.5倍");
		}
	}
	
	private void outOfBounds(int index) {
     
		throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size);
	}
	private void rangCheck(int index) {
     
		if(index<0||index>=size) {
     
			outOfBounds(index);
		}//抛异常
	}
	private void rangCheckForAdd(int index) {
     
		if(index<0||index>size) {
     //这个允许等于size
			outOfBounds(index);
		}//抛异常
	}
	
	public String toString() {
     
		//size=3,[99,98,97]
		StringBuilder string =new StringBuilder();
		string.append("size = ").append(size).append(", [");
		
		for(int i =0; i<size;i++) {
     
			
			
			if(i != 0) {
     //在每个元素前面判断是否要加,
				string.append(",");
				}
			
			string.append(elements[i]);
			
			/*if(i != size -1) {//在每个元素后面判断是否要加,
			string.append(",");
			}*/
		}
		string.append("]");
		return string.toString();
	}
}



包含在Person.java中:
package com.mj;

public class Person {
     
	private int age;
	private String name;
	public Person(int age, String name) {
     //shift + alt + s =>快速生成构造函数
		super();
		this.age = age;
		this.name = name;
	}
	
	@Override
	public String toString() {
     
		return "Person [age=" + age + ", name=" + name + "]";
	}
	
	@Override
	protected void finalize() throws Throwable {
     
		// TODO 自动生成的方法存根
		super.finalize();
		System.out.println("Person - finalize");
	}
	
	@Override
	public boolean equals(Object obj) {
     
		// TODO 自动生成的方法存根
		Person person = (Person)obj;
		return super.equals(obj);
	}	// ==号只是狭义上(什么是狭义上的? 即比较的时候,看的是两个数据的地址是否相等)的相等
		//=>
		//如果是单纯的数的比较,直接比较地址就可以!(因为,例如:)
		//=>
		//而如果是比较两个对象是否相等,直接比较地址是不可以的,因为对象的地址一般不同
		//=>
	    //而用equals则可以自己定义比较规则!
		//=>
		//这里要传递的是一种思想:我们要设置成更加通用的
		//而不是说一定要用equals.  =>   不同的语言有不同的实现方式
		//=>
		//总之,设计成equals更加通用! 可以让我们更加自定义比较规则
	
}

包含在Main.java中:
package com.mj;

public class Main {
     

	public static void main(String[] args) {
     
		
		//所有类,最终都继承java.lang.Object
		
		ArrayList<Person> persons = new ArrayList<>();
		
		persons.add(new Person(10, "Jack"));
		persons.add(new Person(16, "Jannuy"));
		persons.add(new Person(18, "nannan"));
		persons.clear();
		
		//提醒JVM进行垃圾回收
		System.gc();
		
		/*System.out.println(persons);
		
		System.out.println();
		
		ArrayList ints = new ArrayList<>();
		
		ints.add(11);//第0个
		ints.add(16);//第1个
		ints.add(19);//第2个
		ints.add(3);
		ints.add(4);
		ints.add(5);
		
		ints.add(ints.size(),22);//在index位置插入一个元素
		//list.remove(2);
		
		//list.set(2, 80);
		
		System.out.println(ints);
		//list.get(-10);
		 
		 */
	}
	
	static void test() {
     
		
	}

}

你可能感兴趣的:(数据结构-java版本)