JavaSE——Java集合(I)

来源:互联网 发布:二维数组的赋值 编辑:程序博客网 时间:2024/04/27 13:48


集合总结(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基础视频-集合部分

原创粉丝点击