------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
集合
(一). 集合相关
1.1 为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象进行操作,就对对象进行存储。集合就是存储对象常用的一种方式。
1.2 定义
所有抽象出来的数据结构和操作(算法)统称为Java集合框架,简称JCF。Java的集合框架主要由一组用来操作对象的接口组成,不同接口描述一组不同数据类型。核心接口主要有:Collection、List、Set、Map.
1.3 数组与集合同是容器,有什么不同?
数组虽然也可存储对象,但是数组长度是固定的,而集合的长度是可变的。
数组中可以存储基本数据类型,但是集合只能存储对象。
1.4 集合类的特点
集合长度可变;只能存储对象,不能存储基本数据类型值;集合可以存储不同类型的对象。
1.5 简化框架图
(二).集合中的接口及实现类
2.1 Collection接口
boolean add(E obj)————将obj加入到调用类集中,成功返回true
boolean addAll(Collection<? extends E> c)————将c中的所有元素都加入到类集中,操作成功返回true
void clear()————从类集中删除所有元素
boolean contains(Object obj)————确定类集中包含指定的对象obj,成功返回true
boolean containsAll(Collection<?> c)———— 确定类集中是否包含指定集合的所有对象,存在返回true
int hasCode()————返回调用类集的散列码
boolean isEmpty()————判断类集是否为空,若为空则返回true
Iterator<E> iterator()————返回类集的迭代接口
boolean remove(Object obj)————从类集中删除obj实例
boolean removeAll(Collection<?> c)————从类集删除包含在c中的所有元素
boolean retainAll(Collection<?> c)————删除类集中除了包含在c中的元素之外的全部yuans
int size()————返回类集中元素的个数
Object[] toArray()————以数组形式返回类集中的所有对象
3.在使用Collection时需注意:
当企图将一个不兼容的对象加入一个Collection中时, 将产生ClassCastException异常;
Collection中没有提供取得某个元素的方法,只能通过iterator()遍历元素
2.2 List接口
2.2.1 List的实现类——ArrayList
从其命名中可以看出,ArrayList是以一种类似数组的形式进行存储,其内部封装有动态数组,因此它的随机访问速度极快。
2.2.2 List的实现类——LinkedList
LinkedList的内部实现基于链表,适合于频繁的数据增删操作,经常用于构造堆栈Stack、队列Queue
2.3 Set接口
Set接口继承Collection接口,Set中的对象元素不能重复,其元素添加后不保证与添加的顺序一致,无序。Set接口没有引入新方法,所以Set就是一个Collection,只是其行为不同。常用实现类有HashSet类和TreeSet类。
2.3.1 Set实现类——HashSet
HashSet能够快速定位一个元素,放到HashSet中的对象一般需要重写hashCode()方法。该结构使用散列表进行存储。再散列中,一个关键字的信息内容被用来确定唯一的一个值,成为散列码(hash code)。而散列码被用来当做与关键字相连的数据的存储下标。关键字到其散列码的转换是自动执行的。散列法的优点在于即使对于大的集合,一些基本操作如add、contains、remove和size方法的平均运行时间保持不变。
2.3.2 Set实现类——TreeSet
TreeSet是用树结构来进行存储,对象按升序存储,访问和检索速度快。在存储了大量多的需要进行快速检索排序信息的情况下,TreeSet是一个很好的选择。
要注意:TreeSet元素按照字符串顺序也就是字典顺序排列,TreeSet将放入其中的元素按序存放,这就要求放入其中的对象是可排序的。集合框架中提供了用于排序的两个实用接口:Comparable和Comparator。一个可排序的类应该实现Comparable接口。如果多个类具有相同的排序算法时,或需为某个类指定多个排序依据,可将排序算法抽取出来,通过扩展Comparable接口的类实现即可。
在不指明排序依据的情况下,添加到TreeSet中的对象需要实现Comparable接口。
2.4 Map接口
Map接口没有继承Collection接口。Map接口用于维护键/值对的集合。Map容器中的键对象不允许重复,而一个值对象又可以是一个Map,依次类推,这样就可以形成一个多级映射。
Map是一种把键对象和值对象进行关联的容器,Map容器中的键对象不允许重复。Map中提供了Map.Entry接口,通过Mapde entrySet方法返回一个实现Map.Entry接口的对象集合,使得可以单独操作Map的项(键/值对),在Map中的每一个项,就是一个Map.Entry对象,通过遍历每一个Entry,可以获得每一个条目的键或值,并对值进行修改。常用的实现类有HashMap、TreeMap。
2.4.1 Map实现类——HashMap
HashMap类使用散列表实现Map接口。散列映射并不保证它的元素顺序,元素加入散列映射的顺序并不一定是他们被迭代方法读出的顺序。HashMap允许使用null键和null值。
2.4.2 Map实现类——TreeMap
TreeMap类使用树实现Map接口。TreeMap按顺序存储“键/值”对,同时允许快速检索。值得注意的是,不像是散列映射,TreeMap保证他的元素按照键升序排序
2.5 迭代器接口
它的功能与遗留的Enumeration类似,但更容易掌握,功能也更强大。Iterator接口中的方法能以迭代方式逐个访问集合中各个元素,并安全的从Collection中删除元素。
2.5.1 ListIterator接口
ListIterator接口继承Iterator接口,是列表迭代器,用以支持添加或更改底层集合中的元素,允许程序员双向访问、修改列表。ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间,是一个长度为n的列表,有n+1个有效索引值
(三)集合技巧
3.1 记忆技巧
判断元素需要唯一么?
——需要:Set
——需要制定顺序么?
——需要:TreeSet(按照字典顺序,即指定方式排序)
——不需要:HashSet(无序)
——如果需要一个和存储一致的顺序:LinkedHashSet
——不需要:List
——需要频繁增删么?
——需要:LinkedList
——不需要:ArrayList
TreeSet、HashSet、LinkedList、ArrayList,其后缀名就是该集合所属体系,前缀名就是该集合的数据结构
看到Array,就要想到数组,查询快、有角标;
看到Link,就要想到链表,增删快,就要想到增、删方法,add、remove、get
看到Hash,就要想到哈希表,想到唯一性,想到元素需要覆盖hashcode方法及equals方法
看到Tree,就要想到二叉树,想到排序,想到两个接口Comparable、Comparator
通常这些容器都是不同步的,同步的就是Vector,但是相应的效率是非常慢的。
3.2 要注意的问题
简述Collection和Collections的区别?
Collection接口是集合框架的基础,用于表示对象的集合。该接口中声明了所有集合都将拥有的核心算法
Collections是集合框架中的辅助类,提供了一个Collection类型的容器,诸如排序、查找、复制、填充等非常有用的方法
Collections和Arrays的区别?
Collections是集合框架中的辅助类,提供了一个Collection类型的容器,诸如排序、查找、复制、填充等非常有用的方法。
Array也是一个很实用的辅助类,提供了针对数组的类似操作的方法。
原文:http://www.cnblogs.com/pingfan21/p/4941325.html