集合框架
集合框架
类似数组
查api来学习
方便对多个对象的操作,
集合的由来
面向对象语言,对事物的描述通过对象来操作
,存储多个对象,应该用容器类型的变量
适应变化的需求,所以使用集合.
数组长度是固定的
集合长度可变
数组存储的是同一类型的元素
集合可以存储不同类型的元素
元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存引用类型
Java提供了很对个集合类
这些集合类的数据结构不同,
存储东西,并且能够使用这些东西,比如判断,获取
数据结构:
数据的存储方式。
面试题:常见的数据结构的优缺点?(数据结构加算法)
栈
先进后出
入口压栈,出口弹栈。 比如:子弹夹
队列
先进先出
(排队买票)
数组
存储同一个类型的多个元素的容器,有索引,方便获取 ,缺点是但是增加和删除很慢
链表
由一个链子把多个结点连起来组成的数据
结点: 有数据和地址组成(数据域和指针域组成)
没有地址值为null
从头开始来,任意元素都是从头开始找
特点:查询慢,增删快
Collection:
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
集合的顶层接口
功能概述:
添加:
boolean add(Object obj)添加一个元素,
删除
void clear()移除所以元素,
boolean remove(Object o)移除一个元素
boolean removeAll(Collection c)
判断
boolean contains(Object o)判断集合中是否包含指定的元素,
boolean containsAll(Collction c)判断集合中是否有指定的集合元素,
boolean isEmpty()判断集合是否为空
获取
Iterator<E> iterator()重点
长度功能
int size();元素的个数
面试题:数组有没有length方法?字符串有没有length()方法呢?集合有没有length()方法呢?答:集合有Size()方法。
交集功能
boolean retainAll(Collection c)
把集合转换成数组
Object[] toArray()
Iterator: 迭代器,集合的专用遍历方式
遍历
while循环
// Iterator it = c.iterator();
// while(it.hasNext()){
// Students s = (Students)it.next();
// System.out.println(s.getName()+"----"+s.getAge());
// }
**使用for循环遍历效率更高,for循环完成后,it就自动被视为垃圾了
//for循环遍历**
for(Iterator it = c.iterator();it.hasNext();){
Students s = (Students)it.next();
System.out.println(s.getName()+"----"+s.getAge());
}
为什么迭代器是接口而不是一个类:因为集合中的数据结构都是不同的
Set:
List:
有序的集合,允许重复
特有迭代器ListIterator
ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
* 产生的原因:
* 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
* 其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
* 如何解决呢?
* A:迭代器迭代元素,迭代器修改元素
* 元素是跟在刚才迭代的元素后面的。
* B:集合遍历元素,集合修改元素(普通for)
* 元素在最后添加的。
并发修改异常(ConcurrentModificationException)
A:出现的现象
迭代器遍历集合,集合修改集合元素
B:原因
迭代器是依赖于集合的,而集合的改变迭代器并不知道。
C:解决方案
a:迭代器遍历,迭代器修改(ListIterator)
元素添加在刚才迭代的位置
b:集合遍历,集合修改(size()和get())
元素添加在集合的末尾
List:(面试题List的子类特点)
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
List有三个儿子,我们到底使用谁呢?
看需求(情况)。
要安全吗?
要:Vector(即使要安全,也不用这个了,后面有替代的)
不要:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果你什么都不懂,就用ArrayList。

浙公网安备 33010602011771号