一、什么是集合
集合是用于存储引用数据类型的一种容器,我们已经学过的容器有:数组、stringBuffer、stringBuilder。
二、集合与数组的区别
数组的长度是固定的,一个数组只能存储同一种引用数据类型或者基本数据类型。
集合的长度是可变的,一个集合可以存储多种引用数据类型。
需要注意:集合只能存储引用数据类型,而数组既可以存储引用数据类型也可以存储基本数据类型。
三、集合框架
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;
}
}