集合框架

1.认识集合
开发应用程序时,如果想存储多个同类型的数据,可以使用哦个数组来实现;但是使用数组参在如下一些明显缺陷:
数组长度固定不变,不能很好的适应元素数量动态变化的情况。
可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。
数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较。
从以上分析可以看出数组在处理一些问题时存在明显的缺陷,针对数组的缺陷,Java提供了比数组更灵活、更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同应用场合。
Java集合框架提供了一套性能优良、使用方便地接口和类,它们都位于java.util包中,Java的集合类主要有Map接口和Collection接口派生而来,其中Collection接口有两个常用的子接口,即List接口和Set接口,所以通常说Java集合框架由3大类接口构成(Map接口、List接口和Set接口)。
2.List接口
Collection接口时最基本的集合接口,可以存储一组不唯一、无序的对象。List接口继承自Collection接口,是有序集合。用户可适用索引访问List接口中的元素,类似于数组。List接口中允许存放重复元素,也就是说List可以存储一组不唯一、有序的对象。
List接口常用的实现类有ArrayList和LinkedList。
(1)使用ArrayList类动态存储数据
针对数组的一些缺陷,Java集合框架提供了ArrayList集合类,对数组进行了封装,实现了长度可变的数组,而且和数组采用相同的存储方式,在内存中分配连续的空间,所以经常称ArrayList为动态数组。但是它不等同于数组,ArrayList集合中可以添加任何类型的数据,而且添加的数据都将转换成Object类型,而在数组中只能添加同一数据类型的数据。
ArrayList类提供了很多方法用于操作数据:
boolean add(Object o) 在列表末尾添加元素o,起始索引位置从0开始
void add(int index,Object o) 在指定的索引位置添加元素o,索引位置不许介于0和类表中元素个数之间
int size() 返回列表中元素的个数
Object get(int index) 返回指定索引位置的元素,取出的元素时Object类型,使用前需要进行强制类型转换
void set(int index,Object o) 将index索引位置的元素替换为obj元素
boolean contains(Object o) 判断列表中是否存在指定元素o
int indexOf(Object o) 返回元素在集合中出现的索引位置
boolean remove(Object o) 从列表中删除元素o
Object remove(int index) 从列表中删除指定位置的元素,起始索引位置从0开始
ArrayList集合因为可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问元素的效率比较高。但是由于ArrayList集合采用了和数组相同的存储方式,在内存中分配连续的空间,因此在添加和删除非尾部元素时会导致后面所有元素的移动,这就造成在插入、删除等操作频繁的应用场景下使用ArrayList会导致性能低下。所以数据操作频繁时,最好使用LinkedList存储数据。
(2)使用LinkedList类动态存储数据
LinkedList类是List接口的链接列表实现类。它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null。
LinkedList类采用链表式存储方式存储数据,优点在于插入、删除元素时效率比较高,但是LinkedList类的查找效率很低。
它除了包含ArrayList类所包含的方法外,孩提供了一些方法,可以在LinkedList类的首部或尾部进行插入、删除操作。
void addFirst(Object obj) 将指定元素插入到当前集合的首部
void addLast(Object obj) 将指定元素插入到当前集合的尾部
Object getFirst() 获得当前集合的第一个元素
Object getLast() 获得当前集合的最后一个元素
Object removeFirst() 移除并返回当前集合的第一个元素
Object removeLast() 移除并返回当前集合的最后一个元素
Object remove() 等同于removeFirst()
Object element() 等同于getFirst()
Object peek() 等同于getFirst()
Object poll() 弹出首元素,相当于removeFirst()
Object pop() 等同于removeFirst()
void push(Object e) 等同于addFirst()
LinkedList类和ArrayList类所包含的大部分方法时完全一样的,这主要是因为它们都是List接口的实现类。由于ArrayList采用和数组一样的连续的顺序存储方式,当对数据频繁检索时效率较高,而LinkedList类采用链表式存储方式,当对数据添加、删除或修改比较多时,建议选择LinkedList类存储数据
3.Set接口
(1)Set接口概述
Set接口时Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合。集合中的对象并不按特定的方式排序,而且不能保存重复的对象,也就是说Set接口可以存储一组唯一、无序的对象。
Set接口常用的实现类有HashSet。
(2)使用HashSet类动态存储数据
假如现在需要在很多数据中查找某个数据,LinkedList类就无需考虑了,它的数据结构决定了它的查找效率低下。如果使用ArrayList类,在不知道数据的索引且需要全部遍历的情况下,效率一样很低下。为此Java集合框架提供了一个查找效率高的集合类HashSet。HashSet类实现了Set接口,是使用Set集合时最常用的一个实现类。HashSet集合的特点如下。
集合内的元素是无序排列的。
HashSet类是非线程安全的。
允许集合元素值为null。
4.Iterator接口
(1)Iterator接口该数
Iterator接口表示对集合进行迭代的迭代器。Iterator接口为集合而生,专门实现集合的遍历。此接口主要有如下两个方法:
hasNext():判断是否存在下一个可访问的元素,如果仍有元素可以迭代,则返回true。
next():返回要访问的下一个元素。
凡是Collection接口派生而来的接口或者类,都实现了iterator()方法,iterator()方法返回一个Iterator对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值