集合(Collection)
概述
- 存储对象--存储多个对象--需要一个容器
- 数组和StringBuffer,前者长度固定且只能存储同一种数据元素;后者只针对字符串
- so~~提出集合的概念
集合和数组的区别
- 长度
- 数组的长度固定
- 集合长度可变
- 内容
- 数组只能存储同一种类型的元素
- 集合可存储不同类型的元素
- 元素的数据类型
- 数据基本数据类型和引用数据类型均可
- 集合只存储引用数据类型
集合的继承体系结构
Collection的功能
添加
boolean add(Object obj);//添加一个元素boolean addAll(Collection c);//添加一个集合的元素,允许有重复
删除
void clear();//移除所有元素boolean remove(Object o);//移除一个元素boolean removeAll(Collection c);//移除与c集合的交集,只要有一个元素被移除,就是true
判断
boolean contains(Object o);//判断集合中是否包含指定的元素boolean containAll(Collection c);//判断集合中是否包含指定的集合元素,只有包含c中所有元素才叫包含boolean isEmpty();//判断集合是否为空
获取
Iterator<E> iterator();//迭代器,集合的专有遍历方式Object next();获取元素,并移动到下一个位置boolean hasNext();//判断是否还有下一个
Iterator it = c.iterator();
while(it.hasNext()){
String s = (String) it.next();
}
长度
int size();//元素个数- 面试题:数组、字符串、集合是否有length()方法??
交集
boolean retainAll(Collection c);//交集,保存在调用集合中,返回值取决于被调集合中的元素是否改变
把集合转换为数组
Object[] toArray();
Collection的遍历
- 把集合转数组
- 迭代器(集合专有方式)
迭代器
- 是集合获取元素的方式
- 是依赖于集合而存在的
- 迭代器的原理和源码
- 为什么定义?---为了一个接口而不是实现类
- 迭代器的内部类实现
Collection集合的案例(遍历方式 推荐迭代器)
- 集合的使用步骤
- A: 创建集合对象
- B: 创建元素对象
- C: 把元素添加到集合
- D: 遍历集合
- 通过集合对象获取迭代器对象
- 通过迭代器对象的hasNext()方法判断是否有元素
- 通过迭代器的next()方法获取元素并移动到下一个位置
案例1:存储字符串并遍历
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();
while(it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
案例2:存储自定义对象并遍历
Collection c = new ArrayList();
Student s1 = new Student("贾宝玉",22);
Student s2 = new Student("林黛玉",18);
Student s3 = new Student("薛宝钗",23);
c.add(s1);
c.add(s2);
c.add(s3);
Iterator it = c.iterator();
while(it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.getName()+"----"+s.getAge());
}
集合(List)
概述
- List是Collection的子接口
- 特点:有序,存储顺序和取出顺序一致,可重复
List的特有功能
添加
void add(int index,Object element);//在指定位置添加元素
获取
Object get(int index);//获取指定位置的元素
迭代器
ListIterator listIterator();//List特有
删除功能
Object remove(int index);//根据索引删除元素,返回被删除的元素
修改
Object set(int index,Obejct element);//根据索引修改元素,返回被修改的元素
List集合的特有遍历功能
- 由size()和get()方法配合使用
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
for(int x=0; x<list.size(); x++) {
String s = (String) list.get(x);
System.out.println(s);
}
列表迭代器
ListItetator listItetator();//List集合特有的迭代器- 该迭代器继承了Itetator 迭代器,可使用hasNext()和next()方法
- 特有功能:
object previous();//获取上一个元素boolean hasPrevious();//判断- 注意:可以逆向遍历,但是要先正向遍历,所以无意义,基本不使用。
并发修改异常
- 出现的现象:
- 迭代器遍历集合,集合修改集合元素
- 原因:
- 迭代器是依赖于集合的,而集合的改变迭代器并不知道
- 解决方案:
- 迭代器遍历,迭代器修改(ListIterator)
- 元素添加在刚才迭代的位置
- 集合遍历,集合修改
- size()和get(),元素添加在集合的末尾
- 迭代器遍历,迭代器修改(ListIterator)
数据结构
- 栈:先进后出
- 队列:先进先出
- 数组:查询快,增删慢
- 链表:查询慢,增删快
List的子类特点
- ArrayList
- 底层数据结构是数组,查询快,增删慢。
- 线程不安全,效率高
- Vector
- 底层数据结构是数组,查询快,增删慢。
- 线程安全,效率低
- LinkedList
- 底层数据结构是列表,查询慢,增删快。
- 线程不安全,效率高。