一、什么是集合

集合是用于存储引用数据类型的一种容器,我们已经学过的容器有:数组、stringBuffer、stringBuilder。


二、集合与数组的区别

数组的长度是固定的,一个数组只能存储同一种引用数据类型或者基本数据类型。

集合的长度是可变的,一个集合可以存储多种引用数据类型。

需要注意:集合只能存储引用数据类型,而数组既可以存储引用数据类型也可以存储基本数据类型。


三、集合框架

LIST java 长度 java中list长度_数据结构

1.Collection代表着单列集合的根接口,Map代表着双列集合(存储的数据全都成对儿)的根接口。

2.Collection有着两个子接口List和Set,List代表有序、可以重复的数据结构,Set代表无序、不可以重复的数据结构。

3.List有着三个实现子类ArrayList、LinkedList和Vector。ArrayList代表着数组数据结构,LinkedList代表着链表数据结构,Vector在JDK1.2.0之后被ArrayListt取代。


简答题:

1.List和Set的区别:

List中的元素是有序、可以重复的,因为List集合有索引。Set中的元素是无序、不可以重复的,因为Set集合没有索引。

2.ArrayList和LinkedList的区别:

ArrayList中元素的存储方式是数组数据结构,查询速度比较快,增删速度比较慢。LinkedList中元素的存储方式是链表数据结构,增删速度比较快,查询速度比较慢

3.ArrayList和Vector的区别:

ArrayList线程不同步,高效。Vector线程同步,低效。ArrayList长度的延长是50%延长,vector长度的延长是100%延长。JDK1.2.0后,Vector逐渐被ArrayList取代。


四、ArrayList的常见操作方法

//增:
	boolean add(E e)   //添加元素
	void    add(int index,E element) //在指定位置添加元素
	boolean addAll(Collection c)    //把另一个集合中的所有元素添加进来
	boolean addAll(int index,Collection c) //从指定位置把另一个集合中的所有元素添加进来
	
	//删:
	void clear() //清空集合
	boolean remove(Object obj) //移除某个元素
	        remove(int index)  //移除指定位置的元素
	boolean removeAll(Collection c) //从列表中移除指定集合Collection中的所有元素
	
	//改:
	    set(int index,E element) //用指定元素替换列表中指定位置的元素
	    retainAll(Collection c)  //与指定集合取交集并只保留交集
	    
	//查:
	    get(int index) //获取列表中指定位置的元素
	    subList(int fromIndex,int toIndex) //获取一段子集合
	    Iterator() //生成一个迭代器,用于取出集合的元素,取出的过程中只有remove方法
	    ListIterator() //跟Iterator类似,只不过在取出的过程中多了增删改查的方法
	    int size() //返回集合的长度
		boolean isEmpty() //判断集合是否为空
		boolean contains(Object obj) //判断集合是否包含某个元素

Vector的操作方法与ArrayList类似,但Vector有着自己特有的取出元素方法———枚举,枚举跟迭代器是一样的但是接口名和方法名太长,JDK1.2.0以后枚举被Iterator取代。

五、LinkedList的常见操作方法

上述ArrayList的常见操作方法LinkedList基本都有,另外LinkedList有着自己特有的操作方法如下。

addFirst()  //增加元素到链表的第一位                JDK1.6.0后改为:offerFirst()
	addLast()   //增加元素到链表的末位		  JDK1.6.0后改为:offerLast()
	removeFirst() //移除并返回链表的第一位元素     JDK1.6.0后改为:pollFirst()
	removeLast() //移除并返回链表的最后一位元素    JDK1.6.0后改为:pollLast()
	getFirst()   //获取链表的第一位元素                    JDK1.6.0后改为:peekFirst()
	getLast()     //获取链表的最后一位元素               JDK1.6.0后改为:peekLast()



六、练习题

1.根据LinkedList模拟一个队列数据结构,FIFO。

/*
 * 需求:用LinkedList模拟一个队列数据结构
 * 思路:
 * 1、模拟队列数据结构,即需要自己定义一个新的集合类
 * 2、将LinkedList类传给该集合类
 * 3、自己定义该集合类的存入和取出方法,通过对LinkedList存入和取出方法的调用
 */
package com.itheima;

import java.util.LinkedList;

 class DuiLie{            //定义一个新的集合类
	private LinkedList li;//将LinkedList传给该集合类
	DuiLie(){
		 li = new LinkedList();  //该集合类实例化时,会附带LinkedList对象的属性
	}
	
	//利用addFirst和removeLast组合实现先进先出
	public void my_add(Object obj){
	li.addFirst(obj);            
	}
	public Object my_get(){
		return li.removeLast();
	}	
}
 class Demo{
	 public static void main(String[] args){
		 DuiLie dl = new DuiLie();
		 
		 //按java01、java02、java03、java04的顺序存入数据
		 dl.my_add("java01");
		 dl.my_add("java02");
		 dl.my_add("java03");
		 dl.my_add("java04"); 
		
		 //验证是否为先进先出
		 System.out.println("取出的第一个元素是" +dl.my_get()); //java01
		 System.out.println("取出的第二个元素是" +dl.my_get()); //java02
		 System.out.println("取出的第三个元素是" +dl.my_get()); //java03
		 System.out.println("取出的第四个元素是" +dl.my_get()); //java04
		
	 }
 }




2.去除ArrayList中的重复元素。

/*
 * 需求:去除ArrayList集合中的重复字符串对象
 * 思路:
 * 1.定义一个新的ArrayList集合newal
 * 2.遍历原ArrayList,并将元素逐一放入newal
 * 3.放入之前先判断newal是否包含即将放入的元素,不包含的情况才准许放入
 * 4.最终的newal集合将是去除了重复字符串对象的集合
 */
package com.itheima;

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

class Demo{
	public static void main(String[] args){
		ArrayList al = new ArrayList();
		
		//往集合al里添加重复元素
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java01");
		al.add("java02");
		al.add("java04");
		System.out.println("原集合ArrayList中的元素是:"+al);
		
		//对al进行去除重复元素操作
		method(al);
		
		System.out.println("去除重复元素后的集合是:"+al);
		
	}
	
	//封装一个用于去除重复元素的方法method
	public static ArrayList method(ArrayList al){
		
		//定义一个用于存放不重复元素的集合newal
		ArrayList newal =new ArrayList();
		
		//对原集合al进行迭代获取
		Iterator it = al.iterator();
		while(it.hasNext()){
			Object obj = it.next();
			if(!newal.contains(obj)) //如果获取到的元素在newal中不存在,则放入newal
				newal.add(obj);
		}
		return newal;
	}
}




3.自定义对象,存入ArrayList中并去除重复对象。

/*
 *需求:自定义人对象,将其存入ArrayList并去除重复对象  
 *思路:
 *1.构造一个用于描述人的类
 *2.将人对象存入集合
 *3.对集合进行去除重复人对象操作
 */
package com.itheima;

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

public class Demo2 {
	public static void main(String[] args){
		
		//定义一个ArrayList集合并存入人对象
		ArrayList al = new ArrayList();
		al.add(new Person("zhangsan",10));
		al.add(new Person("lisi",10));
		al.add(new Person("zhangsan",10));
		al.add(new Person("wangwu",10));
		System.out.println("原集合是:"+al);
		
		//去除重复的人对象
		al= method(al);
		System.out.println("去除重复对象后,集合是:"+al);
	}
	
	//定义一个去除重复人对象的方法method
	public static ArrayList method(ArrayList al){
		ArrayList newal = new ArrayList();//定义一个新集合用于存放不重复元素
		Iterator it = al.iterator();//用迭代器遍历集合al
		while(it.hasNext()){
			Object obj = it.next();
			if(!newal.contains(obj))//遍历到的元素未在newal中出现过就将其放进去
				newal.add(obj);
		}
		return newal;
	}
}

//定义一个用于描述人对象的类
class Person{
	private String name;
	private int age;
    Person(String name,int age){
		this.name = name;
		this.age = age;
	}
    public String getName(){
    	return name;
    }
    public int getAge(){
    	return age;
    }
    
    //复写了Object类中的equals方法,不再比较地址值,按照自己的方式去比较
    public boolean equals(Object obj){
    	if(!(obj instanceof Person))
    		return false;
    	Person p = (Person)obj;
    	return this.name.equals(p.name)&&this.age==p.age;
    }
}