1.ArrayList类概述

  底层数据结构是数组,查询块,增删慢。

  线程不安全,效率高。


2.ArrayList案例

2.1存储字符串并遍历

package com;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

public class ArrayListDemo {
	public static void main(String[] args) {
		//创建ArrayList对象
		ArrayList<String> list = new ArrayList<String>();
		
		//添加元素
		list.add("哈哈");
		list.add("呵呵");
		list.add("嘻嘻");
		list.add("笨笨");
		
		//遍历方式一 将ArrayList集合装换为Object[]
		Object[] obj = list.toArray();
		for (int i = 0; i < obj.length; i++) {
			String str = (String) obj[i];
			System.out.println(str);
		}
		
		System.out.println("----------------------");
		
		//遍历方式二 使用Iterator迭代器
		for(Iterator<String> iterator = list.iterator();iterator.hasNext();){
			String str = iterator.next();
			System.out.println(str);
		}
		
		System.out.println("-----------------------");
		
		//遍历方式三 使用ListIterator迭代器
		//顺向遍历
		ListIterator<String> listIterator = list.listIterator();
		while(listIterator.hasNext()){
			String str = listIterator.next();
			System.out.println(str);
		}
		
		System.out.println("------------------------");
		
		//逆向遍历
		while(listIterator.hasPrevious()){
			String str = listIterator.previous();
			System.out.println(str);
		}
		
		System.out.println("------------------------");
		
		//遍历方式四 使用size()和get(int index)方法来实现遍历集合元素
		for (int i = 0; i < list.size(); i++) {
			String str = list.get(i);
			System.out.println(str);
		}
		
	}

}

2.2存储自定义对象并遍历

省略


3.Vector类

package com;

import java.util.Enumeration;
import java.util.Vector;

/**
 * Vector类特有功能
 * 		1.添加功能
 * 			public void addElement(E e)
 *      2.获取功能
 *          public E elementAt(int index)
 *      	public Enumeration elements() 
 *
 */
public class VectorDemo {
	public static void main(String[] args) {
		//创建集合对象
		Vector<String> v = new Vector<String>();
		
		//添加元素
		v.addElement("hello");
		v.addElement("world");
		v.addElement("java");
		
		//遍历
		for (int i = 0; i < v.size(); i++) {
			String str = v.elementAt(i);
			System.out.println(str);
		}
		
		System.out.println("------------------");
		
		for (Enumeration<String> enumeration = v.elements(); enumeration.hasMoreElements(); ) {
			String str = enumeration.nextElement();
			System.out.println(str);
		}
	}
}

hello

world

java

------------------

hello

world

java


4.LinkedList类概述

  底层数据结构是链表,查询慢,增删快。

  线程不安全,效率高。


5.LinkedList的特有功能

package com;

import java.util.LinkedList;

/**
 * linkedList的特有功能
 * 		添加功能
 *      	public void addFirst(E e )
 *      	public void addLast(E e)
 *      获取功能
 *      	public E getFirst()
 *      	public E getLast()
 *      删除功能
 *      	public E removeFirst()
 *      	public E removeLast() 
 */
public class LinkedListDemo {
	public static void main(String[] args) {
		//创建集合对象
		LinkedList<String> list = new LinkedList<String>();
		
		//添加元素
		list.add("hello");
		list.add("world");
		list.add("java");
		
		System.out.println(list);//[hello, world, java]
		list.addFirst("javaee");
		System.out.println(list);//[javaee, hello, world, java]
		list.addLast("android");
		System.out.println(list);//[javaee, hello, world, java, android]
		
		System.out.println(list.getFirst());//javaee
		System.out.println(list.getLast());//android
		
		System.out.println(list.removeFirst());//javaee
		System.out.println(list);//[hello, world, java, android]
		
		System.out.println(list.removeLast());//android
		System.out.println(list);//[hello, world, java]
	}

}


6.练习

6.1去除集合中字符串的重复值

package com;

import java.util.ArrayList;
import java.util.Iterator;

/*
 * ArrayList
 * 		去除ArrayList集合中字符串重复值(字符串内容相同)
 * 
 * 分析:
 * 		1.创建集合对象
 * 		2.添加多个字符串元素(包含内容相同的)
 * 		3.创建新集合
 * 		4.遍历旧的集合,获取得到每一个元素
 * 		5.拿这个元素到新集合中去找,看有没有
 * 			有:不搭理它
 * 			没有:就添加到新集合中
 * 		6.遍历新集合
 * 
 * 
 */
public class ArrayTest {
	public static void main(String[] args) {
		//创建ArrayList集合对象
		ArrayList<String> listOld = new ArrayList<String>();
		
		//添加元素
		listOld.add("hello");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		
		//创建新集合对象
		ArrayList<String> listNew = new ArrayList<String>();
		
		//遍历旧集合,获得每一个元素
		for (int i = 0; i < listOld.size(); i++) {
			String strOld = listOld.get(i);
			//拿这个元素到新集合中去找
			if(!listNew.contains(strOld)){
				listNew.add(strOld);
			}
		}
		
		//遍历新集合
		for(Iterator<String> iterator = listNew.iterator();iterator.hasNext();){
			String strNew = iterator.next();
			System.out.println(strNew);
		}
	}

}

hello

world

java

package com;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 需求:ArrayList去除集合中字符串的重复值(字符串内容相同)
 * 要求:不能创建新的集合,只能作用于以前的集合
 */
public class ArrayListTest {
	public static void main(String[] args) {
		//创建ArrayList集合对象
		ArrayList<String> listOld = new ArrayList<String>();
		
		//添加元素
		listOld.add("hello");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		
		/**
		 * 由选择排序思想引入,我们就可以用选择排序思想来做这个题目
		 * 拿0索引的依次和后面的比较,如果后面有和0索引位置上的元素相同就移除
		 * 同理拿1索引的一次和后面的比较,如果后面有和1索引位置上的元素相同就移除
		 */
		for (int i = 0; i < listOld.size()-1; i++) {
			for (int j = i+1; j < listOld.size(); j++) {
				if(listOld.get(i).equals(listOld.get(j))){
					listOld.remove(j);
				}
			}
		}
		
		//遍历集合
		for(Iterator<String> iterator = listOld.iterator();iterator.hasNext();){
			String str = iterator.next();
			System.out.println(str);
		}
		
	}

}

hello

world

java

world

java

为什么会出现这种结果呢?我的思路应该是正确的呀,原因就在于比如你0索引上的元素是world,3索引和4索引上的元素也是world,当遍历的时候会判断3索引上的元素值和0索引上的是不是相等,是相等。ok,那就将3索引上的元素干掉,同时4索引以及5等等索引上的元素向前移动,但是之后我是0索引上的元素和4索引上的比较的,因为我3已近比较过了,但是很遗憾的是,这个时候的3索引上的恰恰也是world,哎,漏网之鱼啊,那怎么修改程序呢?看下面

package com;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 需求:ArrayList去除集合中字符串的重复值(字符串内容相同)
 * 要求:不能创建新的集合,只能作用于以前的集合
 */
public class ArrayListTest {
	public static void main(String[] args) {
		//创建ArrayList集合对象
		ArrayList<String> listOld = new ArrayList<String>();
		
		//添加元素
		listOld.add("hello");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		listOld.add("world");
		listOld.add("java");
		
		/**
		 * 由选择排序思想引入,我们就可以用选择排序思想来做这个题目
		 * 拿0索引的依次和后面的比较,如果后面有和0索引位置上的元素相同就移除
		 * 同理拿1索引的一次和后面的比较,如果后面有和1索引位置上的元素相同就移除
		 */
		for (int i = 0; i < listOld.size()-1; i++) {
			for (int j = i+1; j < listOld.size(); j++) {
				if(listOld.get(i).equals(listOld.get(j))){
					listOld.remove(j);
					j--;//添加j--,目的是让i上的元素和上一次被删除元素索引上的新元素比较
				}
			}
		}
		
		//遍历集合
		for(Iterator<String> iterator = listOld.iterator();iterator.hasNext();){
			String str = iterator.next();
			System.out.println(str);
		}
		
	}

}


6.2去除集合中自定义对象的重复值(对象的成员变量相同)

其实很简单,和上面的类似,只要在Student类中重写equals()方法即可。

package com;

public class Student {
	private String name;
	private int age;
	
	public Student(){}
	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	

}
package com;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 去除集合中自定义对象重复值(对象的成员变量值相同)
 */
public class ArrayListTest2 {
	public static void main(String[] args) {
		//创建集合对象
		ArrayList<Student> list = new ArrayList<Student>();
		
		//创建学生对象
		Student s1 = new Student("林志玲",28);
		Student s2 = new Student("凤姐",19);
		Student s3 = new Student("苍老师",18);
		Student s4 = new Student("芙蓉姐姐",80);
		Student s5 = new Student("林志玲",28);
		Student s6 = new Student("凤姐",28);
		Student s7 = new Student("林志玲",28);
		Student s8 = new Student("凤姐",19);
		Student s9 = new Student("林志玲",28);
		Student s10 = new Student("芙蓉姐姐",80);
		
		//添加元素值
		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		list.add(s5);
		list.add(s6);
		list.add(s7);
		list.add(s8);
		list.add(s9);
		list.add(s10);
		
		//通过选择排序思想
		for (int i = 0; i < list.size()-1; i++) {
			for(int j = i+1;j<list.size();j++){
				if(list.get(i).equals(list.get(j))){
					list.remove(j);
					j--;
				}
			}
		}
		
		//遍历集合
		for(Iterator<Student> iterator = list.iterator();iterator.hasNext();){
			Student stu = iterator.next();
			System.out.println(stu);
		}	
	}
}


7.使用LinkedList模拟数据结构--栈

package com;

import java.util.LinkedList;

/**
 * 使用LinkedList模拟数据结构--栈
 */
public class MyStack {
	private LinkedList<Object> list;
	
	public MyStack(){
		list = new LinkedList<Object>();
	}
	/**
	 * 增加元素
	 * @param obj
	 */
	public void add(Object obj){
		list.add(obj);
	}
	/**
	 * 获取元素
	 * @return
	 */
	public Object get(){
		return list.removeLast();//移除当前元素 并返回被删除的元素
	}
	/**
	 * 判断内部集合元素是否为空
	 * @return
	 */
	public boolean isEmpty(){
		return list.isEmpty();
	}

}
package com;
/**
 * 自定义数据结构--栈测试
 */
public class MyStackTest {
	public static void main(String[] args) {
		MyStack stack = new MyStack();
		
		stack.add("hello");
		stack.add("world");
		stack.add("java");
		
		while(!stack.isEmpty()){
			System.out.println(stack.get());
		}
	}

}

java

world

hello