开发应用程序时,如果想存储多个同类型的数据,可以使用数组来实现;但是使用数组存在如下一些明显缺陷:
-->数组长度固定,不能很好地适应元素数量动态变化的情况。
-->可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。
-->数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较。
(2)从以上分析可以看出数组在处理一些问题时存在明显的缺陷,针对数组的缺陷,Java提供了比数组更灵活、更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同应用场合。
从上图可以看出,Java的集合类主要由Map接口和Collection接口派生而来,其中Collection接口有两个常用的子接口,即List接口和Set接口,所以通常说Java集合框架由3大类接口组成(Map接口、List接口和Set接口)。
List接口
1)Collection接口是最基本的集合接口,可以存储一组不唯一、无序的对象。
(2)List接口继承自Collection接口,是有序集合。用户可以使用索引(下标)访问List接口中的元素,类似于数组。
(3)List接口中允许存放重复元素,也就是说List可以存放一组不唯一、有序的对象。
(4)List接口常用的实现类有ArrayList和LinkedList。
使用ArrayList类动态存储数据
(1)针对数组的一些缺陷,Java集合框架提供了ArrayList集合类,对数组进行了封装,实现了长度可变的数组,而且和数组采用相同的存储方式,在内存中分配连续的空间,如下图所示,所以,经常说ArrayList为动态数组。
但是它不等同于数组,ArrayList集合中可以添加任何类型的数据,并且添加的数据都将转换成Object类型,而在数组中只能添加同一类型的数据。
3)ArrayList集合因为可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问元素的效率比较高。但是由于ArrayList集合采用了和数组相同的存储方式,在内存中分配连续的空间,因此在添加和删除非尾部元素时会导致后面所有元素的移动,这就造成在插入元素、删除元素等操作频繁的应用场景下使用ArrayList会导致性能低下。所以数据操作频繁时,最好使用LinkedList存储数据。
2、 使用LinkedList类动态存储数据
(1)LinkedList类是List接口的链接列表实现类。它支持实现所有List接口可选的的列表的操作,并且允许元素值是任何数据,包括null。
(2)LinkedList类采用链表存储方式存储数据,如下图所示,优点在于插入、删除元素时效率比较高,但是LinkedList类的查找效率很低。
)它除了包含ArrayList类所包含的方法之外,还提供了下表所示的一些方法,可以在LinkedList类的首部或尾部进行插入、删除操作。
Set接口
1、 Set接口概述
(1)Set接口是Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合。
(2)集合中的对象并不按特定的方式排序,并且不能保存重复的对象,也就是说Set接口可以存储一组唯一、无序的对象。
(3)Set接口常用的实现类有HashSet。
2、 使用HashSet类动态存储数据
(1)HashSet集合的特点如下:
-->集合内的元素是无序排列的。
-->HashSet类是非线程安全的。
-->允许集合元素值为null。
(2)HashSet类的常用方法如下所示:
(3)List接口可以使用for循环、增强for循环、迭代器(Iterator接口)三种方式遍历。使用for循环遍历时,通过get()方法取出每个对象,但HashSet类不存在get()方法,所以Set接口无法使用普通for循环遍历。
(4)Set接口可以使用增强for循环、迭代器(Iterator接口)两种方式遍历。
Iterator接口
Iterator接口概述
(1)Iterator接口表示对集合进行迭代的迭代器。Iterator接口为集合而生,专门实现集合的遍历。
(2)凡是由于Collection接口派生而来的接口或者类,都实现了iterator()方法,iterator()方法返回一个Iterator对象。
(3)Iterator接口主要有如下两个方法:
-->hasNext():判断是否存在在一个可访问的元素,如果仍有元素可以迭代,则返回true。
-->next():返回要访问的下一个元素。
2、 使用Iterator遍历集合
Iterator it = list.iterator(); //获取集合迭代器Iterator
while(it.hashNext()){ //通过迭代器依次输出集合中所有元素的信息
Object obj = it.next();
}
Map接口
Map接口概述
(1)Map接口存储一组成对的键(key)——值(value)对象,提供key到value的映射,通过key来检索。
(2)Map接口中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。
(3)Map接口的常用方法如下: