黑马程序员技术交流社区
标题:
Java基础-集合总结(因为东西太多,分两个贴发出。。。)
[打印本页]
作者:
周博文
时间:
2015-8-13 21:08
标题:
Java基础-集合总结(因为东西太多,分两个贴发出。。。)
一、集合概述
1.概述
[color=rgba(128, 128, 128, 0.6)]:
集合是Java中用于存储对象的容器,由于Java是面向对象的语言,为了方便对多个对象进行操作,同时解决数组长度固定,不能满足变化需求的问题,因此提供了集合类。
集合的两个关键特点:<1>长度可变<2>可以存储任意类型的对象(不可以存储基本数据类型,但可以存储基本数据类型包装类)2.集合和数组的对比由于数组也是可以存储对象的容器,但相对于集合来说在存储数据方面就有了一些局限性。<1>数组的存储元素的个数是固定的,而集合可以存储任意多个元素,即长度可变<2>数组中可以存储基本类型变量和引用类型变量,集合中只能存储引用类型变量<3>数组中的元素必须是相同类型,集合中的元素可以是不同类型二、集合的继承体系由于集合是用来存储和操作多个元素的容器,因此不同类型的元素存储在集合中的数据结构可能会有差异,操作元素的方式也可能会不同,因此Java提供了底层数据结构不同的类,并将集合中操作元素的共性方法抽取称为接口,因此出现了集合的继承体系。集合继承体系图![集合继承体系图](http://img.blog.csdn.net/20150813052636560)上图中虚线框代表接口,实线框代表具体实现类三、单列集合要学习集合,需要从继承体系的顶层接口开始,先学习共性方法,然后学习不同集合的特有方法,从而掌握集合的使用。1.单列集合的顶层接口-CollectionCollection接口中描述了所有单列集合都应该具备的操作元素的方法,按照方法的功能分为以下几类分别介绍:<1>添加功能:> boolean add(Object obj) : 添加一个元素,操作成功返回true,否则false> boolean addAll(Collection c) : 添加一个集合的所有元素,操作成功返回true,否则false<2>删除功能:> boolean remove(Object o):移除一个元素,操作成功返回true,否则false> boolean removeAll(Collection c):移除一个集合的元素> 例如A.removeAll(B),则移除A集合中包含的B集合中的所有元素,操作成功返回true,否则false> void clear():移除集合中所有元素<3>判断功能:> boolean contains(Object o):判断集合中是否包含指定的元素> boolean containsAll(Collection c):判断集合中是否包含指定的集合元素,即判断参数集合是否是调用集合的子集。> boolean isEmpty():判断集合是否为空<4>获取长度:> int size():返回集合中元素的个数<5>取交集:> boolean retainAll(Collection c):> 假设有两个集合A,B,进行如下调用> A.retainAll(B):A对B做交集,最终的结果保存在A中,B不变。返回值表示的是A是否发生过改变。<6>转换为数组:> Object[] toArray():把集合转成数组<7>获取元素-迭代器:> Iterator<E> iterator() :用于迭代集合中的所有元素,后面详细讲解该方法的使用。2.集合的遍历方式<1>转换为数组的形式遍历(不常用):代码示例:
```//1.通过toArray()方法将集合转换为Object类型的数组Object[] elements = collection.toArray();//2.通过循环遍历数组中的元素,即遍历集合中的元素for(int i=0; i<elements.length ; i++) { Object element = elements
; ..... // do something with element .....}```<2>集合特有的遍历方式-迭代器迭代器是集合提供的专门用于遍历集合中元素的一个接口,这个接口提供了下面两种主要用于遍历元素的方法:> Object next():获取当前元素,并将指向元素的指针移动到下一个元素。> boolean hasNext():判断是否仍有元素可以迭代,是则返回 true。通过上面两个方法,可以通过一个简单的循环实现集合中元素的遍历代码如下:
```//1.通过集合对象获取迭代器对象Iterator it = collection.iterator();//2.通过迭代器方法遍历集合中的元素while(it.hasNext()) { Object element = it.next(); ..... // do something with element .....}```> 注意:任意单列集合都可以通过以上两种方式进行元素的遍历,但通常使用迭代器的方式进行遍历。<3>使用迭代器遍历集合的注意事项**[1].为保证正常迭代集合中的所有元素,请不要在循环中多次调用next()方法,因为每次调用都会使迭代器指向元素的指针向指向下一个元素。[2].如果要在迭代过程中使用元素实际类型的特有方法,需要对元素进行强制类型转换,或在定义集合时声明泛型(泛型将在后面说明)。[3].如果在迭代过程中通过集合变量调用添加或删除元素的方法对集合中元素个数进行修改,则会引发并发修改异常。在迭代器迭代过程中只能使用迭代器的特有方法对元素进行修改。2.List集合List是Collection的子接口,存储在List集合中的每一个元素都有对应的索引值,而且元素的存入顺序与取出顺序一致,即**元素有序**,因此该集合也称为序列。实现此接口的集合可以通过索引对集合中的元素进行访问和操作。List集合**允许元素重复**。<1>特有方法List集合在继承Collection接口的基础上,增加了用于操作索引的特有方法,具体方法如下:[1].添加方法> void add(int index,E element) : 在指定的索引位置添加元素[2].删除方法> E remove(int index) 删除指定索引处的元素[3].获取方法> E get(int index) : 获取指定索引处的元素[4].修改方法> E set(int index,E element):修改指定索引处的元素,返回修改被修改的元素。[5].特有迭代方法> ListIterator listIterator() : List集合的特有迭代方法,返回List集合的特有迭代器对象。<2>.List集合特有的遍历方式**[1].size()和get()方法结合使用代码:
```for(int i=0; i<list.size(); i++) { Object element = list.get(i); ..... // do something with element .....}```**[2].** List特有的迭代器遍历List集合提供了获取ListIterator迭代器的方法,ListIterator迭代器接口中定义了一些用于List集合迭代过程中操作元素的方法,具体如下:**添加方法**> void add(E e) 在迭代过程中在当前索引处添加新元素**删除方法**> void remove() 在迭代过程中删除当前元素**修改方法**> void set(E e)在迭代过程中修改当前迭代的元素**获取索引**> int previousIndex() 获取前一个元素的索引> E nextIdex() 获取后一个元素的索引**反向迭代(不常用)**boolean hasPrevious()E previous()通过上面的方法可以知道,通过ListIterator迭代List集合中的元素时可以在迭代过程中增加,删除,修改元素。代码示例:
```ListIterator li = list.listIterator();while(li.hasNext()) { Object element = li.next(); ..... //do something with element .....}```其实在使用上与普通迭代器没有多大差别,仅仅是在迭代过程中可以对集合元素进行的操作增多了。**3.List集合的几个具体子类****<1>ArrayList 集合**ArrayList集合是List集合的具体实现类,它存储元素的底层数据结构为数组结构,而数组结构操作元素的重要特点就是:**增删慢,查询快**因此如果在程序中经常要对元素进行查询操作,建议使用ArrayList集合来存储。**优点:查询快,效率高****缺点:增删慢,线程不安全****<2>LinkedList集合**LinkedList集合也是List集合具体实现类,它存储元素的底层数据结构为链表结构。**优点:增删快,效率高****缺点:查询慢,线程不安全**LinkedList的特有功能:添加功能:> public void addFirst(Object e) 添加元素到集合的首部> public void addLast(Object e) 添加元素到集合尾部获取功能:> public Object getFirst() 获取第一个元素> public Obejct getLast() 获取最后一个元素删除功能:> public Object removeFirst() 删除第一个元素> public Object removeLast() 删除最后一个元素**<3>Vector集合**Vector集合的底层数据结构也是数组结构,但是相对于ArrayList它增加了线程同步机制,因此使得操作元素的效率大大降低,在实际开发中不常用。**优点:线程安全****缺点:效率低**Vector的特有功能:添加功能:> public void addElement(Object obj) -- 等价于add()获取功能:> public Object elementAt(int index) -- 等价于get()> public Enumeration elements() -- 等价于Iterator iterator()特有迭代方式:
```Enumeration en = vector.elements(); // 返回的是实现类的对象while (en.hasMoreElements()) { Object element = en.nextElement(); ..... //do something with element .....}```
作者:
shuguang
时间:
2015-8-13 21:35
好多啊!这个格式实在是不方便看啊!
作者:
周博文
时间:
2015-8-13 21:52
我是从自己的博客里粘贴过来的,所以格式都乱了,我会在下面开几个链接的,不好意思
作者:
周博文
时间:
2015-8-13 21:53
http://blog.csdn.net/blackhorsekevin/article/details/47574625 集合总结-单列集合
http://blog.csdn.net/blackhorsekevin/article/details/47610633 集合总结-双列集合
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2