Java集合之List集合的三个子实现类

  • Post author:
  • Post category:java


一.List集合的子实现类特点

List集合有三个子实现类:
		
			ArrayList
					底层数据结构式数组结构,查询块,增删慢
					从内存角度考虑:线程不安全的,不同步的,执行效率高
					
					多线程:synchronized :同步的意思		解决线程安全问题
							sychronized(锁对象){	同步代码 
									共享数据;	
							}
							
					解决线程安全问题,通过同步可以解决,但是效率低了...
			
			LinkedList
					底层数据结构式链表结构,查询慢,增删块
					从内存角度考虑:线程不安全,不同步,执行效率高
			
			Vector
					这是一个线程安全的类,
					底层数据结构是数组:查询快,增删慢
					线程安全的,同步,执行效率低!
					
					

二.ArrayList集合

(1)ArrayList是List接口中常用的一个子实现类

(2)遍历功能:

1)一个是Collection的iterator()

2)size()和get(int index)普通for循环

//需求:ArrayList集合存储自定义对象并遍历

public static void main(String[] args) {
		
		//创建集合对象
		ArrayList  array = new ArrayList();
		
		//创建学生对象
		Student s1 = new Student("鲁智深", 30) ;
		Student s2 = new Student("武松", 40) ;
		Student s3 = new Student("宋江", 50) ;
		Student s4 = new Student("杨志", 25) ;
		
		//添加
		array.add(s1) ;
		array.add(s2) ;
		array.add(s3) ;
		array.add(s4) ;
		
		//迭代器方式
		Iterator it = array.iterator() ;
		while(it.hasNext()) {
			Student s = (Student)it.next() ;
			System.out.println(s.getName()+"---"+s.getAge());
		}
		
		System.out.println("--------------------");
		
		//普通for循环
		for(int x = 0 ; x <array.size() ; x ++) {
			Student s = (Student)array.get(x) ;
			System.out.println(s.getName()+"----"+s.getAge());
		}
	}

二.Vector集合

(1)底层是一种可增长对象数组,查询快,增删慢

线程安全,同步,执行效率高

(2)特有功能:

public void addElement(Object obj)——->add(Object obj)

public Enumeration elements():返回此向量的枚举—>相当于:public Iterator iterator()

boolean hasMoreElements()  —>boolean hasNext() ;

Object nextElement()    —>Object next() ;

public static void main(String[] args) {
		
		//创建集合对象
		Vector v = new Vector() ;
		
		//添加元素
		v.addElement("hello"); 
		v.addElement("world");
		v.addElement("java");
		
		//遍历
		//获取Enumeration :向量的枚举
		Enumeration en = v.elements() ;
		while(en.hasMoreElements()) {
			String s = (String)en.nextElement() ;
			System.out.println(s);
		}
	}

三.LinkedList集合

(1)底层是一种链表实现,查询慢,增删快

线程不安全的,不同步,执行效率高

(2)特有功能:

添加功能

addFirst(Object e):将指定的元素插入到列表的开头

addLast(object e):将指定的元素添加到列表末尾

获取功能:

getFirst():获取列表第一个元素

getLast():获取列表第二个元素

删除功能

public Object removeFirst()移除并返回此列表的第一个元素。

public Object removeLast()

public static void main(String[] args) {
		
		//创建LinkedList集合对象
		LinkedList link = new LinkedList() ;
		
		//添加元素
		link.add("hello"); 
		link.add("world"); 
		link.add("java"); 
		System.out.println("link:"+link);
		
		//addFirst(Object e):将指定的元素插入到列表的开头
//		link.addFirst("android");
//		System.out.println("link:"+link);
//		link.addLast("mysql");
//		System.out.println(link);
		
		//getFirst():获取列表第一个元素
//		System.out.println(link.getFirst());
//		System.out.println(link.getLast());
		
		//public Object removeFirst()移除并返回此列表的第一个元素。 
		System.out.println("removeFirst():"+link.removeFirst());
		System.out.println(link);
		//public Object removeLast()
		System.out.println(link.removeLast());
	}

(3)

[需求]   模拟栈结构的特点,先进后出

理解:需要自定义一个类,在这个类中使用LinkedList集合的特有功能进行操作

/**
 * 这是自定义的栈集合类
 * 	在这个MyStack中使用LinkedList的特有功能
 * @author Administrator
 * 
 *
 */
public class MyStack {
	
	private LinkedList link ;
		
	/**
	 * 
	 * 执行MyStack的无参构造实际是构造了个LinkedList对象
	 */
	public MyStack() {
		link = new LinkedList() ;
	}
	
	//添加元素
	public void add(Object obj) {
		link.addFirst(obj);
	}
	
	//获取元素
	public Object get() {
		return link.removeFirst() ;
	}
	
	
	//判断功能
	public boolean isEmpty() {
		return link.isEmpty();
	}
	
	
}
/**
 * 栈集合的测试类
 * @author Administrator
 *
 */
public class MyStackDemo {
	
	public static void main(String[] args) {
		
		//创建自定义的MyStack的栈集合的对象
		MyStack my = new MyStack() ;	//LinkedList list = new LinkedList();
		
		//添加元素
		my.add("hello");		//LinkedList ["java","world","hello"]
		my.add("world");
		my.add("java");
		
		//获取元素
		//想办法给MyStack这个类中提供一个判断功能
		
		while(!my.isEmpty()) {
			System.out.println(my.get());
		}
	}
}


四.集合去重


[需求1]给集合中添加重复的元素(字符串类型),将重复的元素从集合去除掉!


思路:

*  1)创建一个旧集合,添加重复元素

*  2)创建一个新集合

*  3)遍历旧集合中的元素获取到每一个元素

*     在旧集合中判断新集合中是否包含旧集合中的元素

*           包含,不搭理

*           不包含,添加到新集合中

*  4)遍历新集合

public static void main(String[] args) {
		
		//创建一个集合
		ArrayList list = new ArrayList() ;
		
		//添加元素
		list.add("hello") ;
		list.add("world") ;
		list.add("java") ;
		list.add("javaee") ;
		list.add("hello") ;
		list.add("world") ;
		list.add("hello") ;
		list.add("javaee") ;
		list.add("android") ;
		list.add("python") ;
		list.add("php") ;
		list.add("php") ;
		
		//创建一个新的集合
		ArrayList newList = new ArrayList() ;
		
		//遍历旧集合
		Iterator it = list.iterator() ;
		while(it.hasNext()) {
			String s = (String) it.next() ;
			
			//判断新集合中是否包含旧集合中的元素
			if(!newList.contains(s)) {
				newList.add(s) ;
			}
		}
		
		//遍历新集合
		Iterator it2 = newList.iterator() ;
		while(it2.hasNext()) {
			String s = (String) it2.next() ;
			System.out.println(s);
		}
	}

假设:现在的需求:不允许新建一个集合去完成,怎么办?

/**

* 引入选择排序,

* 用0索引对应的元素依次和后面索引对应的元素进行比较

*  如果前面的元素和后面的元素重复了,把后面的元素干掉

* 依次1索引….

*/

public static void main(String[] args) {
		
		//创建ArrayList集合对象
		ArrayList  array = new ArrayList() ;
		
		//添加元素
		array.add("hello") ;
		array.add("world") ;
		array.add("java") ;
		array.add("javaee") ;
		array.add("hello") ;
		array.add("world") ;
		array.add("hello") ;
		array.add("javaee") ;
		
		for(int x = 0 ; x < array.size()-1 ; x ++) {
			for(int y = x +1 ; y < array.size() ; y ++) {
				//判断,前面的索引对应的元素和后面索引对应的元素进行比较,如果相等就干掉后面重复的
				if(array.get(x).equals(array.get(y))) {
					array.remove(y) ;
					y-- ;
				}
			}
		}
		
		//遍历集合
		Iterator it = array.iterator() ;
		while(it.hasNext()) {
			String s = (String) it.next() ;
			System.out.println(s);
		}
	}


[需求2]使用集合ArrayList存储自定义对象(Student),去除重复的对象(成员变量的值一样,看成一个人)

发现问题:按照存储字符串(新建集合的思想)的形式来去存储自定义对象,发现自定义对象并没有去重,为什么?

*  contains方法底层依赖于equals方法

* equals方法默认比较的是地址值,如果想让equals()方法比较他们的内容是否相同,需要重写equals(),也就意味着

存储自定义类,必须重写equals()方法,这样才能比较的是这些对象的内容是否相同

public static void main(String[] args) {
		
		//创建一个ArrayList集合
		ArrayList array = new ArrayList() ;
		
		//创建4个学锁对象
		Student s1 = new Student("高圆圆", 27);
		Student s2 = new Student("文章", 29);
		Student s3 = new Student("王力宏", 30);
		Student s4 = new Student("高圆圆", 27);
		Student s5 = new Student("高圆圆", 29);
		
		array.add(s1) ;
		array.add(s2) ;
		array.add(s3) ;
		array.add(s4) ;
		array.add(s5) ;
		
		//创建一个新集合
		ArrayList newArray = new ArrayList() ;
		
		//遍历旧集合
		Iterator it = array.iterator() ;
		while(it.hasNext()) {
			Student s = (Student)it.next() ;
			
			//判断,新集合中是否包含
			if(!newArray.contains(s)) {
				newArray.add(s) ;
			}
		}
		
		//遍历新集合
		Iterator it2 = newArray.iterator() ;
		while(it2.hasNext()) {
			Student s= (Student)it2.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
	}



版权声明:本文为xing_ran_ran原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。