------- android培训、java培训、期待与您交流! ----------
集合
在集合框架中,Collection为与这个框架的顶层,它有两个子接口,List和Set
在List和Set接口下,又有很多特殊的容器。因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构,它们自身具备的特点不同。
Collection
作为一个集合,应该具有的方法:增删改查
在collection中,存在这样一些抽象方法
add(),增加一个元素
addAll(),一次增加一堆元素(实现并集)
remove 删除一个元素
removeAll 删除一堆元素(实现差集)A-B
retainAll 保留两个集合中共有的元素。交集
对象创建在堆内存中,而对象的引用在栈内存中。
在集合中存储的都是对象的引用(地址)。
ArrayList al = newArrayList();
//添加元素
al.add("01");
al.add("02");
al.add("03");
al.add("04");
//获取个数,集合的长度
System.out.println(al.size());
//删除元素
al.remove("01");
//判断元素
System.out.println(al.contains("02"));
ArrayList al2 = new ArrayList();
al2.add("01");
al2.add("02");
//取交集,al中存放的为交集
System.out.println(al.retainAll(al2));
System.out.println(al);
当我们取出元素中的集合时候,就可以使用迭代器,其实就是集合取出元素的方式
每个集合中有各自特定的取出方式,也就有一个特定的迭代器。取出这个类就定义在集合的内部。也就是用来取元素,在集合内部操作,这个迭代器内部类抽取了一些共性的方法,叫做Iterator接口,这个接口定义了抽象的方法,在各自不同的数据结构中,取出和判断的方式不同,故各个数据结构实现了自己特定的迭代器对象。可以使用 数据结构对象.iterator();得到其内部实现的迭代器。
实例:List集合中所定义的迭代器内部类,用于实现特定的取出元素的操作,定义为内部类
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
publicbooleanhasPrevious() {
returncursor != 0;
}
}
对于每一个容器来说,取出动作的细节也不一样,但是有共性内容,判断和取出,提取了一个Iterator接口。
其实迭代器就是取出元素的方式
Iterator it =al.iterator();//得到了相应集合中特定实现的迭代器
while(it.hasNext())//判断是否有下一个元素
{
System.out.println(it.next());
}
Collection中,有两类常见的子接口(各自有各自体系下的特定的方法)
List:元素是有序的(按照存入的前后),元素可以重复。因为该集合体系有索引。可以在指定位置对元素进行操作。凡是带角标的,底层的实现都是数组结构。
对于List集合来说:比较元素是否相等使用的是存入元素的equals方法。
而且在删除元素的时候,也是使用equals去寻找有没有。然后去删除。
Set:元素是无序(内部其实有序,但是对于用户来说,是无序的,不根据用户的存入前后,顺序的存放)的,元素不可以重复。
对于List和Set中的共性方法,都在Collection中已经定义了,现在学习List和Set中的特殊方法。
List(最大的特定就是通过索引对集合中的元素进行操作)
增 add(index,element);
add(index,Collection);
删 remove(index);
改 set(index,element);
查 get(index);
subList(from,to);
ListIterator();
实例:
ArrayList al = new ArrayList();
al.add("00");
//添加元素使用特有方法
al.add(1,"01");
System.out.println(al);
//删除指定位置的元素
al.remove(0);
System.out.println(al);
//修改元素。
al.set(0, "001");
System.out.println(al);
//通过角标获取元素
System.out.println(al.get(0));
//获取所有的元素
for(int x =0;x<al.size();x++)
{
System.out.println(al.get(x));
}
//使用迭代器的方式
Iterator it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
//返回某一个特定元素在集合中的位置
System.out.println(al.indexOf("001"));
al.clear();
al.add("11");
al.add("12");
al.add("13");
List sub = al.subList(0,2);
System.out.println(sub);
List中具体的列表迭代器的作用:
需求:现在要使用迭代器去集合中的元素取出,在取出的过程中进行一些操作。
但是,我们在使用普通迭代器操作集合对象的时候,再使用集合对象对元素进行操作
会出现并发操作的安全隐患。不能同时既使用集合操作集合中元素,又使用迭代器操作集合中元素。
解决方式:要么都使用集合的方式,要么都使用迭代器的方式。
例子:
Iterator it =al.iterator();
while(it.hasNext())
{
if(it.next().equals("02"))
{
it.remove();//也就是删除next得到的那个元素,不能同时使用两次remove。
}
}
System.out.println(al);
对于公共类型的迭代器,只能进行三种类型的操作,判断,取出和删除。不能做添加动作,有局限性。
所以提供了一个ListIterator。
List集合特有的迭代器,ListIterator是Iterator子接口。,它提供了更加强大的功能。
该接口通过List集合对象.ListIterator()方法获取。
特点:在遍历过程中的增删改查。。。(由于不能通过集合对象的方法操作集合中的元素)
实例:
ArrayList al = new ArrayList();
al.add("01");
al.add("02");
al.add("03");
//使用列表迭代器
ListIterator li =al.listIterator();
while(li.hasNext())
{
Object obj = li.next();
if(obj.equals("02"))
{
// li.add("0000");//在next遍历到的元素之后加入该新元素
li.set("006");//修改当前next遍历到的元素。
}
}
System.out.println(al);
while(li.hasPrevious())
{
Object obj = li.previous();//当指针移动到最后的时候,它就有了前一个元素
//从集合的后往前遍历。
System.out.println(obj);
}
List中常见的共性方法介绍结束,现在讲解List常见的三个子类对象。(由于底层的数据结构不一样而出现的,以适应不同的条件)
ArrayList的特点:底层的数据结构是数组数据结构,查询,修改速度很快,但是增加,删除元素很慢。线程不同步。默认的情况下,长度为10,超过长度的时候,按照50%进行延长。变成15。(这也就是可变长度的数组的原理)
LinkedList:底层使用的是列表数据结构,增删的速度很快,查询比较慢
Vector :底层是数组数据结构,线程同步。默认长度为10.超过长度的时候,按照100%进行延长,变成20。
Vetor的特别学习(有一个特别的东西值得去学习)
Vector v = new Vector();
v.add("01");
v.add("02");
v.add("03");
//特有方法。枚举(就像一个迭代器,是为了在io中去使用)
Enumeration e = v.elements();
while(e.hasMoreElements())
{
System.out.println(e.nextElement());
}
LinkedList的学习(介绍它的特有方法)
LinkedList link= new LinkedList();
link.add("01");
link.add("02");
link.add("03");
//LinkedList的特有方法
link.addFirst("first");//在集合的开始添加元素
link.addLast("last");//在集合的结尾添加元素
System.out.println(link);
link.getFirst();//得到集合的一个元素
link.getLast();//得到自己和的最后一个元素
link.removeFirst();//删除第一个元素,并得到
link.removeLast();//删除最后一个元素,并得到
//当集合中没有元素的时候,调用get和remove的方法会抛出异常
//使用pollFirst去替代remove,当没有元素的时候,返回null;
//使用offerFirst()替换getFirst()
link.clear();
System.out.println(link.pollFirst());//null