集合总结(I):
本文基于毕老师Java基础视频,总结了与集合体系, List集合子类有关的一些知识点, 集合部分的总结分成两部分, 后半部分见集合总结(II)
1. 集合是一种容器, 而且集合的体系中有好多不同的容器, 那么集合的体系是什么样的, 他们的共性特点是什么?
a. Collection是一个父类接口, 这个接口定义了集合的一些共性方法: 增删改查+判断,上图只列出了本文要讨论的常用的简化体系结构
b. Collection下面有定义了一些子类接口, 有代表性的List,Set两大派系
c. List下面3大子类: ArrayList, LinkedList, Vector;
d. Set下面2大子类: HashSet, TreeSet
e. Collection内的共性方法: 增删改查+判断
e.1 增: void add(element);void addAll(collection) //添加元素,添加一个集合中所有元素
e.2 删: boolean remove(element); removeAll(collection); void clear(); // 删除某个元素, 删除所有包含在一个集合中的元素,清空集合
boolean retainAll(collection); //仅保留一个给定集合中包含的元素
e.3 改: 在子类中具体实现
e.4 查: iterator(); // 获取一个Iterator对象实现更丰富的对集合中元素的操作 size(); //获取集合大小
e.5 判断: isEmpty(); contains(element); containsAll(collection); //是否为空,是否有某个元素,是否包含某个集合中的所有元素
注: remove;removeAll;retainAll;contains;containsAll这些需要和某个Object比较后操作的方法底层调用的是equals()方法
2. 1.e.4中提到,Iterator对象可以实现更丰富的对集合中元素的操作,Iterator是怎么来的,它有什么方便的方法呢?
a. 对于元素的取出,不足以用一个方法来实现,所以将不同数据结构的集合的取出动作抽象成一个类,以对象的形式调用多种方法来实现取出集合元素这个动作
b. 操作集合内元素的方式是根据数据类型不同而不同的,同时取出方式直接访问集合内部的元素会比较方便, 所以集合子类在内部定义内部类实现这些操作会更方便
c. 所以集合包里面定义了Iterator接口,集合的子类以内部类的形式实现Iterator接口中定义的公共方法
d. 集合对外提供了iterator方法来获取Iterator内部类对象
e. Iterator接口中提供了三个方法:
e.1 hasNext(); // 判断是否有下一个元素
e.2 next(); // 得到下一个元素
e.3 remove(); //删除iterator最后返回的元素
// 常见的Iterator的使用代码
iterator=myCollection.iterator();
while(iterator.hasNext()){
// 包含iterator.next();...
}
// 常见错误及注意
//1. 循环中出现不止一次 .next()
while(iterator.hasNext()){ //此段循环有两次光标的移动,但是第二此没有判断hasNext()
iterator.next(); //第一次取出
iterator.next(); //第二次取出后一个元素
// 如果不巧Collection内奇数个元素,最后一次NoSuchElement异常
}
// 2. while中出现用集合的方式对元素进行增删改查
while(iterator.hasNext()){
myCollection.add(newObj); // 出现ConcurrentModificationException
iterator.next();
// 只能同事用一个方法体系对集合元素操作,不要在iterator循环体内嵌套集合对元素的操作方法
}
// 3. 一种节约内存资源的遍历方式
for(Iterator it=myCollection.iterator;it.hasNext();){
// it.next(); 的操作
} // 此方法出了for循环体,迭代器it在内存中即释放
3. Collection类Iterator操作元素和Collection中方法操作元素共同使用时,会产生并发访问异常,是什么?
a. iterator一旦初始完成,就只知道初始化前一刻List里面的迭代情况, 如果Collection对元素的操作操作方法改变了集合中的内容,iterator就不知道这种改变
b. 所以基于a的情况, 不要同时使用两种方式对元素进行操作
4. 数组也是容器, 数组和集合的区别是什么?
a. 数组是固定长度的,集合是可变长度的
b. 数组存储的只能是一个类型的对象, 而集合可以存储不同类型的对象(没有定义泛型时是的,但是如果定义了泛型就不可以了)
c. 数组可以存储基本数据类型, 集合不可以
5. List体系的特征是什么, List的增删改查是哪些有哪些特有方法?
a. List的特点是元素以序列的形式存在,每个元素都有自己的index,集合内可以存储重复元素
b. List的特点是带index,所以这些特有方法都是基于对index的操作
b.1 增: add(index,element); addAll(index,collection);
b.2 删: remove(index); //根据index删除某个元素
b.3 改: set(index,newElement); // 更改index的元素为新值
b.4 查:
- indexOf(element); lastIndexOf(element); // 获得首次/末次出现某element的index
- get(index); // 通过index获取
- subList(indexFrom,indexTo); //包括indexFrom,不包括indexTo
- listIterator(); // 获取一个listIterator()对象实现更丰富的对List中元素的操作
b.5. listIterator()里面的特有方法: ---> 特点只用listIterator就可以完成对List的增删改查
- nextIndex();
- 倒序操作: hasPrevious(); previous(); previousIndex()
- 更改操作:void set(toNewElement); // 更改指针当前位置后面的那个元素;List容许重复元素,所以更改这个方法在ListIterator比较好实现
- 添加操作: void add(newElement); // 更改指针当前位置后面的那个元素;List容许重复元素,所以添加这个方法在ListIterator比较好实现
6. List体系下面不同子类的区别是什么样的, 他们使用起来有什么特点?
a. ArrayList: 底层的数据结构是数组结构,线程不同步。特点在于查询速度很快,但是增删较慢
b. LinkedList:底层是链表数据结构(一个元素只知道前后的两个元素),特点增删速度快,查询速度慢
c. Vector:底层是数组数据结构;1.0版本就出现了,集合是1.2版本才出现;Vector特点是线程同步;这个方法已经被ArrayList取代
d. ArrayList和Vector可变长度上的区别: ArrayList默认是10个元素,超过10,50%延长。Vector默认10,100%延长
e. Enumeration是Vector的特有取出方式; Enumeration和Iterator是一样的,因为Enumeration的名称以及方法的名称都过长,所以被Iterator取代了
7. List的子类ArrayList和LinkedList的特有方法有哪些?
a. ArrayList没有什么常用的特有方法,此处暂不赘述
b. 由于LinkedList添加删除快速的特性, LinkedList单独提供了对链表头、尾的操作xxxFirst/xxxLast方法
b.1 addFirst();addLast();
b.2 Object removeFirst();Object removeLast(); //获取并删除
b.3 getFirst();getLast(); // 获取不删除
c. b.2-b.3 如果LinkedList为空,会有NoSuchElement异常, JDK1.6 给出升级解决方法, c.2-c.3如果遇到空LinkedList返回null;
c.1 offerFirst();offerlast();
c.2 pollFirst();pollLast(); //获取并删除
c.3 peekFirst();peekLast(); //获取不删除
参考资料: 传智播客毕老师Java基础视频-集合部分