从头开始学java-会合(一)
一.集合概述
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类型集合使用。