第一讲 集合入门
1. 集合的由来
① 集合出现以前的数组长度是固定的,当长度超过了数组的长度,就需要对数组进行重新定义,而集合能存储任意长度,且长度可以改变
② 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,需要对对象进行存储,集合就是存储对象最常用的一种方式。
而在此之前的数组只支持存储基本数据类型
2. 集合与数组的区别
区别1:数组的长度是固定的,而集合长度能随着元素的增加而增长
区别2:数组中可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
集合只能存储对象。这意外着集合在存储基本数据类型时,但是在存储的时候会自动装箱变成对象
3. 数组和集合什么时候用
1 如果元素个数是固定的推荐用数组
2如果元素个数不是固定的推荐用集合
4. 集合继承体系图
可以看到集合框架由四个接口组成,下面分别讲解
2. collection接口
Collection是集合框架中的常用接口。其下有两个子接口:List(列表),Set(集)。
所属关系:
Collection
|--List//元素是有序的,元素可以重复。因为该集合体系有索引。
|--Set//元素是无序的,元素不可以重复。无索引
注意:集合中实际上存储的对象的地址引用,所以基本数据类型在集合中会先被封装成对象,这叫做自动装箱
1. Collection接口中的常见操作
1. 添加元素
① boolean add(Object obj) 添加元素
添加一个元素,返回值为添加是否成功,因为List中允许存储重复值,所以永远返回true,在set中如果要添加的数在set中已经存在,则返回false
2. 删除元素
① boolean remove(Object obj) 删除指定的元素,如果为List接口,且有重复值,则移除第一个满足的值
② boolean clear(); 清空集合
3. 判断元素
boolean contains(Object obj); 判断是否存在obj这个元素
isEmpty() 判断集合是否为空
4. 获取个数,长度
size()
5. 带All的方法
① boolean addAll(Collection c) 把集合c中的所有元素添加到调用者集合中
注意:与add(Collection c)不同,add方法将c当作一个元素加到调用者集合中
② boolean removeAll(Collection c) 调用者集合中删除交集集合
③ boolean containsAll(Collection c) 判断调用集合是否包含传入的集合
④ boolean retainAll(Collection c) 调用者集合只保留两集合的共性元素,如果调用集合未改变返回false,调用集合改变就返回true
注:集合中存储的都是对象的引用(地址)
2. Collection集合的遍历
① 转数组遍历,利用Collection.toArray()方法,返回值为object[]
Collection coll = new ArrayList();
coll.add(new Student("张三",23)); //Object obj = new Student("张三",23);
coll.add(new Student("李四",24));
coll.add(new Student("王五",25));
coll.add(new Student("赵六",26));
Object[] arr = coll.toArray(); //将集合转换成数组
for (int i = 0; i < arr.length; i++) {
Student s = (Student)arr[i]; //强转成Student
System.out.println(s.getName() + "," + s.getAge());
}
解析:上例中coll中存储的是虽然是student对象,但是在调用toArray()方法时返回的是object数组,所以对单个来说相当于
ayy[1] a = new Student("张三",23)也就是虽然存储的是student对象,但是已经被提升为object对象,父类对象不能使用子类特有的方法
因此要向下转型Student s = (Student)arr[i]; //强转成Student
② 迭代遍历(重要!!)
1. 概述
迭代是取出集合中元素的另一种方式。
我们知道Collection接口下Set和List的数据结构不同,所以取出的动作细节也不一样。但是都具有共性内容: 判断和取出。那么就可以将这些共性抽取。
这些规则的共性可以封装成Iterator。
每个Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。Collection.iterator得到迭代器
2. iterator迭代器的常用方法
① boolean hasNext() 判断是否有下一个元素,如果有返回真
② Object next() 取出下一个元素
③ remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素,执行完一次next()调用,且只能调用一次
3. 使用实例
Iteratoriter = a.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
4. 注意事项
① 迭代器的next方法返回值类型是Object,所以要记得类型转换。
② 迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException,所以要进行hasNext()判断
③ 迭代器在Collcection接口中是通用的,具体在各collection接口中由具体实现的iterator()
5. 原理分析
A:迭代器原理
* 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
* B:迭代器源码解析
* 1,在eclipse中ctrl + shift + t找到ArrayList类
* 2,ctrl+o查找iterator()方法
* 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
* 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法
第三讲 List接口
1. 组成
List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。
2. List特有的方法
①增
void add(index,element); //指定位置添加元素
boolean addAll(index,Collection); //在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素,集合变化则返回true
②删
E remove(int index); //删除指定位置的元素,返回被删除的元素
boolean remove(Object obj) // 删除集合中第一个出现的出现的指定元素(如果存在),如果列表包含指定的元素,则返回 true
③改
set(int index,element) //修改指定位置的元素
④查
E get(int index); //通过角标获取元素
List<E> subList(int from,int to); //获取部分对象元素
⑤其他
listIterator(); //List特有的迭代器
indexOf(obj); //获取元素第一次出现的位置,如果没有则返回-1
注意①: List的角标从0开始计算!!!!
注意②:List集合判断元素是否相同,移除等操作,依据的是元素的equals方法
原文:http://www.cnblogs.com/chenjinsen/p/5289914.html