1.集合框架介绍
计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,之前学习的数组可以用来存储并处理大量类型相同的数据,但是通过上面的课后练习,会发现数组在应用中的限制:数组长度一旦确定,就无法更改;除非采用建立新数组,再将原数组内容拷贝过来;数组中只能存放指定类型的数据,操作不方便。在实际开发中,为了操作方便,JDK中提供了List集合。
List集合与数组的用途非常相似,都是用来存储大量数据的,不同处有两点:
1. 数组长度在使用前必须确定,一旦确定不能改变。而List集合长度可变,无需定义。
2. 数组中必须存放同一类型的数据,List集合中可以存放不同类型的数据。
List集合是Java集合框架中的一种,另外两种集合Set和Map会在下面介绍。List集合在JDK中被封装称为接口,针对List接口,有若干种实现,常用的有三个子类,即ArrayList、Vector和LinkedList。这三个类的功能与用法相同,但内部实现方式不同。下面以ArrayList为例介绍集合的常用操作,Vector和LinkedList的使用方法与ArrayList类似。
2. 集合的常用方法
(1)list集合常用方法:
返回类型 |
方法名称 |
说明 |
boolean |
add(Object obj) |
加入元素,返回是否添加成功 |
boolean |
clear() |
清除集合中的元素 |
boolean |
contains(Object obj) |
查找集合中是否存在传入的元素 |
Object |
get(int index) |
获取指定位置的元素 |
boolean |
isEmpty() |
判断集合是否为空 |
Object |
remove(int index) |
删除制定位置的元素,并返回该元素 |
int |
size() |
获取集合大小 |
Object[] |
toArray() |
将集合转换成一个数组 |
(2)HashMap集合常用方法:
返回类型 |
方法名称 |
作用 |
Object |
put(Object key,Object value) |
加入元素,返回与此key关联的原有的value,不存在则返回null |
void |
clear() |
从集合中移除所有的元素 |
boolean |
containsKey(Object key) |
根据key从集合中判断key是否存在 |
boolean |
containsValue(Object value) |
根据value从集合中判断value是否存在 |
Object |
get(Object key) |
根据key返回key对应的值 |
Set |
keySet() |
返回Map集合中包含的键集合 |
Object |
remove(Object key) |
从集合中删除key对应的元素,返回与key对应的原有value,不存在则返回null |
int |
size() |
返回集合中的元素的数量 |
(3)HashMap集合常用方法:
Set集合和List集合的很多的用法是相同的。但是Set集合中的元素是无序的,元素也是不能重复的。Set集合中常用类为HashSet。
HashSet类中常用的方法如下:
返回类型 |
方法名称 |
作用 |
boolean |
add(Object obj) |
加入元素 |
void |
clear() |
移除Set集合中所有元素 |
boolean |
contains(Object obj) |
判断Set集合中是否包含指定元素 |
boolean |
isEmpty() |
判断Set集合是否为空 |
Iterator |
iterator() |
返回Set集合中对元素迭代的迭代器 |
boolean |
remove(Object obj) |
从集合中删除元素 |
Int |
size() |
返回集合中的元素数量 |
3. 三种List集合的比较
我们说过,ArrayList、Vector与LinkedList的使用方法相同,内部实现方式不同。而内部实现方式的不同又决定了三种集合的适用范围,了解三种集合的内部实现,才能正确的选择使用类型。
ArrayList与Vector比较
ArrayList与Vector的内部实现类似,Vector设计为线程安全,ArrayList设计为非线程安全。为了保证线程安全,Vector在性能方面稍逊于ArrayList,目前我们编写的都是单线程应用程序,应选择使用ArrayList。
ArrayList与LinkedList
ArrayList与LinkedList均设计为非线程安全,ArrayList内部采用数组实现(与Vector相同),LinkedList内部采用链表结构实现。
ArrayList采用数组保存元素,意味着当大量添加元素,数组空间不足时,依然需要通过新建数组、内存复制的方式来增加容量,效率较低;而当进行对数组进行插入、删除操作时,又会进行循环移位操作,效率也较低;只有进行按下标查询时(get方法),使用数组效率很高。
LinkedList采用链表保存元素,在添加元素时只需要进行一次简单的内存分配即可,效率较高;进行插入、删除操作时,只需对链表中相邻的元素进行修改即可,效率也很高;但进行按下标查询时,需要对链表进行遍历,效率较低。
可以总结出ArrayList在进行数据的新增、插入、删除时效率较低,按下标对数据进行查找时效率较高;LinkedList正好相反。一般来说ArrayList保存经常进行查询操作的集合,LinkedList适用于保存经常进行修改操作的集合。
注:
1.通过List集合提供的各种方法来对其中的元素进行操作,从而可以方便用户操作,但是如果要从List集合中获取一个特定的对象,操作是比较繁琐的,此中情况下用Map比较适合。Map集合用于保存具有映射关系的数据,即以键值对(key->value)的方式来存储数据。因此在Map集合内部有两个集合,一个集合用于保存Map中的key(键),一个集合用于保存Map中的value(值),其中key和value可以是任意数据类型数据。
2.HashMap和Hashtable的操作是相同的,他们的区别如下:
Hashtable是线程安全的,HashMap是非线程安全的。所有HashMap比Hashtable的性能更高。
Hashtable不允许使用使用null值作为key或value,但是HashMap是可以的。
3.set集合的迭代
import java.util.HashSet;
import java.util.Iterator;
public class SetIterator {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
Iterator iter = set.iterator(); ①
while (iter.hasNext()) { ②
String str = (String) iter.next(); ③
System.out.println(str);
}
}
}