List Map Set集合之间的区别

时间:2021-04-12 06:44:04

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.HashMapHashtable的操作是相同的,他们的区别如下: 

Hashtable是线程安全的,HashMap是非线程安全的。所有HashMapHashtable的性能更高。

Hashtable不允许使用使用null值作为keyvalue,但是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);
}
}
}