day15:
集合是可以发生改变的
集合是存储对象最最常用的方式
集合:由于我们使用的是面向对象语言,所以我们哟啊经常使用对象,而很多时候,我们可以需要使用很多的对象
这个时候,我们就只能使用以前的数组进行存储了,而数组的特点是长度是固定的
这样的话就不适合变化的数据,所以,Java重新提供了一种容器,用于存储对象,这种容器叫集合
数组的特点:
1,长度固定
2,数据类型一致
3,可以存储基本数据类型和引用类型
集合的特点:
A:长度是可以改变的
B:可以存储不同的数据类型
C:只能存储对象
由于数据结构不同,Java就对应提供了很多中集合类,又由于多种集合类的功能很相似,所以,就要不断的 向上抽取功能
最终形成了集合的体现结构。
学习一个体系:
学什么?
一般学习最顶层的内容,因为顶层定义的是这个体系的共性内容。
用什么?
用底层的内容,因为底层是真正的具体实现,
我们的集合这种容器,由于数据结构不同,所以,java就对应的提供了很多种集合类,供我们使用。
数据结构:就是数据的组织(存储)方式。
Collection中应该有什么功能
A:添加功能
boolean add(Object obj):向集合中添加一个元素
boolean addAll(Collection c):向集合中添加一个集合的元素。
B:删除功能
void clear():删除集合中的所有元素。
boolean remove(Object obj):从集合中删除指定的元素
boolean removeAll(Collection c):从集合中删除一个指定的集合元素。
C:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object obj):判断集合中是否存在指定的元素。
boolean containsAll(Collection c):判断集合中是否存在指定的一个集合中的元素。
D:遍历功能
Iterator iterator():就是用来获取集合中每一个元素。
E:长度功能
int size():获取集合中的元素个数
F:交集功能
boolean retainAll(Collection c):判断两个集合中是否有相同的元素。???
G:把集合转换成数组
Object[] toArray():把集合变成数组。
Collection
|--List\
|--ArrayList |
|--Vector | --元素有序(指的是存储顺序和取出顺序是否一致),可重复。
|--LinkedList |
|--Set\
|--HashSet |
|--TreeSet | --元素无序唯一
NoSuchElementException 没有这样的元素异常
it.hasNext 判断it是否还有元素
一次判断一次获取 next();
什么是迭代器?
其实是集合的一种遍历(一个一个的获取元素)方式。
集合的使用四步走:
*A: 创建元素对象。
*B:创建元素对象
*C:把元素对象添加到集合对象中
*D:遍历集合对象
/\
||
*a:通过集合对象获取迭代器对象
*b: 通过集合对象的hasNext()方法进行判断
*c:通过迭代器对象的next()进行获取
while(it.hasNext())
{
String s= (String)it.next();
System.out.println(s);
}
/\
||
标准的迭代器代码
为什么迭代器定义成接口类型?
不同集合的数据结构是不一样的 如果定义成一个统一的实现类。
那么变量不同集合的时候,会不会出问题?会
但是迭代器一接口的形式定义。规则:hasNext();next();
又是以具体的某一个集合中以内部类的形式实现。
迭代器源码分析,设计原理。
Apublic interface Iterator
{
public abstract boolean hasNext();
public abstract Object next();
}
public interface Collection
{
public abstract Iterator iterator();
}
public interface List extends Collection
{
...
}
public class ArrayList implements List
{
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {
return xxx;;
}
public E next() {
return xxx;
}
}
}
用法:
//多态
Collection c = new ArrayList();
//添加元素
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); //把Itr返回来了,而Itr实现了Iterator接口。所以,这是多态的体现。
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
List特有的功能
A:添加功能
|-->void add(int index, Object obj):在指定位置添加元素
B:删除功能
|-->Object remove(int index):根据指定索引删除元素,并把删除的元素返回。
C:修改功能
|-->Object set(int index, Object obj):把指定索引位置的元素修改为指定的值,返回修改前的值。
D:获取功能
|-->int indexOf(Object o):返回指定元素在集合中第一次出现的索引
|-->Object get(int index)|:获取指定位置的元素
| |-->有了get(int index)又有了size(),想到了可以有for循环遍历
|-->ListIterator listIterator():列表迭代器
E:截取功能
|-->List subList(int fromIndex, int toIndex):截取集合。
并发修改异常:
* 面试题:
* \ConcurrentModificationException:并发修改异常。
* \这是个什么异常,怎么产生的,怎么解决的?
*
* 怎么产生:
* \当我们通过迭代器迭代元素的过程中,又通过集合去添加了元素。这种情况是不允许的。
* \因为迭代器是依赖于集合存在的,如果集合发生改变,迭代器也应该相应的发生改变。
* \而我们目前看到的确实,迭代器没变,集合变了。所以,报出了一个并发修改异常。
*
* 注意问题:通过迭代器遍历集合的时候,是不能通过集合去操作(添加,删除)。
* 那么,我们可不可以这样理解呢?
* ? A:全部通过迭代器操作ListIterator:元素是添加到刚遍历的那个元素后面。
* ? 通过迭代器迭代的时候,可以通过迭代器对集合进行操作。
* ? B:全部通过集合操作:元素是添加到最后的。
* 通过集合普通for遍历的时候,可以通过集合去操作。 |
|