一.集合概述
Collection分为两大类:
List类:元素有序,可以重复,有索引。
Set类:元素无序,不能重复,无索引。
二.ArrayList类的使用
import java.util.*;
public class CollectionTest1 {
public static void main(String[] args)
{
//创建一个集合容器,使用collection接口
ArrayList al = new ArrayList();
//增加元素,add方法的参数类型是object类,集合中添加的都是对象的引用
al.add("content1");
al.add("content2");
al.add("content3");
//判断是否含有某元素
System.out.println(al.contains("content1"));
//获取集合元素个数,.size()方法
System.out.println(al.size());
//直接打印集合
System.out.println(al);
//删除集合元素
al.remove("content1");
//清空集合元素
al.clear();
//判断是否为空
System.out.println(al.isEmpty());
//取两个集合中的交集,存储在前一个集合中
System.out.println(al.retainAll(al));
}
}
结果:
要点:
三.迭代器
因为各种数据结构实现不同,取出功能比较复杂,所以将取出元素这个操作进行了封装,被封装在容器类中,是一个内部类,以便方便访问类中的元素。取出操作。这些内部类取出操作都符合一些规则,所以都实现了一个接口,Iterator。如果我们自己设计了一个数据结构,实现这个接口也就实现了迭代器的功能。
import java.util.*;
public class CollectionTest2 {
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("content1");
al.add("content2");
al.add("content3");
//获取迭代器的引用值,用it保存(迭代器是内部类,在创建外部类时已经创建了接口)
Iterator it = al.iterator();
//it.hasNext方法,判断是否有元素,如果有返回真,否则为假
while(it.hasNext())
{
//it.next返回当前元素
System.out.println(it.next());
}
}
}
要点:
1. 迭代器是一个内部类,实现一个接口。使用迭代器的时候,通过接口调用,用集合类的.iterator()方法返回迭代器在建立集合时建立的内部类对象实例。
2. 迭代器常用的方法.hasNext()判断是否还有元素。
3. 迭代器常用方法.Next(),返回迭代器中的下一个元素。
四.List集合
上面说过,List类中有索引,元素是有序的,可以重复。
所以List类中有一些特有的方法,即可以操作脚标的方法都是List的方法。
import java.util.*;
public class ListTest1 {
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("content1");
al.add("content2");
al.add("content3");
//在指定位置添加元素
al.add(1, "content0");
System.out.println(al);
//删除指定位置元素
al.remove(1);
System.out.println(al);
//修改指定位置元素
al.set(1, "content8");
System.out.println(al);
//通过脚标获取元素
System.out.println(al.get(1));
//通过脚标遍历
for (int i = 0; i < al.size(); i++)
{
System.out.println(al.get(i));
}
//获取对象脚标
System.out.println("index of content1 = " + al.indexOf("content1"));
}
}<strong>
</strong>
要点:
List集合特有的方法一般都是跟脚标有关的。
五.List迭代器
当用迭代器操作时,我们有时也希望操作集合。但是我们在迭代的时候,用集合方式修改时会发生一些奇怪的异常:
import java.util.*;
public class ListTest2 {
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("content1");
al.add("content2");
al.add("content3");
//如果我们用迭代器时,想通过Collection的方法修改List,会出现异常
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
if (obj.equals("content1"))
al.add("content0");
System.out.println(it.next());
}
}
}
结果:
这个异常是说对象被并发修改时引发的异常。就是说要么用集合方式,要么用迭代器方式修改。
用迭代器方式修改时,方法比较少,只有三个方法,hasnext(),next(),remove()。
所以在这里我们如果想要用其他的方法,如添加或修改时,就要用派生于迭代器的List迭代器进行操作。
import java.util.*;
public class ListTest2 {
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("content1");
al.add("content2");
al.add("content3");
//如果我们用迭代器时,想通过Collection的方法修改List,会出现异常
ListIterator it = al.listIterator();
while(it.hasNext())
{
Object obj = it.next();
if (obj.equals("content1"))
//增加
it.add("content0");
}
System.out.println(al);
//List还可以反向遍历
while (it.hasPrevious())
{
System.out.println(it.previous());
}
}
}
结果:
要点:
1.对于集合正在迭代的时候,要么用集合方式,要么用迭代器方式修改,不能同用,否则会引发异常。
2.使用List迭代器,可以比普通迭代器增加一些功能。
六.List子类特点
List分为ArrayList,LinkList,Vector三种
特点:
ArrayList:底层数据结构用数组实现。查询速度很快,增删稍慢,线程不同步(默认长度是10,如果超过了10,那么就会新建一个大数组,将原来的东东拷贝到新的数组中)
LinkList:底层数据结构用链表实现。增删速度很快,查询速度稍慢
Vector:底层数据结构是数组结构,现在很少使用了。线程同步。
其他知识点:三种List类型集合使用。