Java容器collection中的set、map、list的理解?

 Java中存储容器包括以collection接口为根节点的集合和以map接口为根节点的映射表。

List接口和set接口继承了collection,list集合的特点是元素可重复,有序,set集合的特点是元素不可重复,无序。arraylist和linkedlist实现了list接口,hashset和treeset实现了set接口。HashMap和treemap实现了map接口,hashmap是无序的,treemap是有序的。

Arrylist的底层是一个固定大小的数组,所以查询速度快,增删较慢,linkedlist底层采用双向链表的结构存储数据,所以增删数据快,查询数据慢,每次查询都会从链表的起始位置开始遍历。Hashset是无序的,通过hashcodeequals方法来保证集合数据的唯一性。Treeset是有序的。HashMap由数组+链表组成的,HashMap的主干是一个Entry数组。EntryHashMap的基本组成单元,每一个Entry包含一个key-value键值对。

从容器类图中可以发现,数据容器主要分为了两类:

Collection: 存放独立元素的序列。

Map:存放key-value型的元素对。(这对于一些需要利用key查找value的程序十分的重要!)

从类体系图中可以看出,Collection定义了Collection类型数据的最基本、最共性的功能接口,而List对该接口进行了拓展。

其中各个类的适用场景有很大的差别,在使用时,应该根据需要灵活的进行选择。此处介绍最为常用的四个容器:

LinkedList :其数据结构采用的是链表,此种结构的优势是删除和添加的效率很高,但随机访问元素时效率较ArrayList类低。

ArrayList:其数据结构采用的是线性表,此种结构的优势是访问和查询十分方便,但添加和删除的时候效率很低。

HashSet: Set类不允许其中存在重复的元素(集),无法添加一个重复的元素(Set中已经存在)。HashSet利用Hash函数进行了查询效率上的优化,其contain()方法经常被使用,以用于判断相关元素是否已经被添加过。

HashMap: 提供了key-value的键值对数据存储机制,可以十分方便的通过键值查找相应的元素,而且通过Hash散列机制,查找十分的方便。

 

 

该类图的理解,对于灵活的使用相应的数据容器十分的重要。

根据Oracle公司的官方文档:

1、Collection是对Iterable接口的拓展故所有的Collection对象都可以使用foreach方式,对元素进行方便的遍历。

由于Iterable接口中定义了的唯一方法为:返回一个Iterator对象,故所有的Collection都可以用 对象名.iterator()的方式获取该collection的迭代器iterator对象(结合工厂方法和内部类的思想来理解,其作用十分大)

2、Map中提供了产生Collection的方法,以支持方便的对键值对的值域进行操作。

Collection<V> values()   Returns:a collection view of the values contained in this map.

 

从JAVA提供的数据容器来看,可以清晰的认识到面向对象的思想在类的架构设计中的重要性。

灵活的使用好各类容器类,以最大限度的提升程序的性能。由于类型过多,大多的基础操作都被抽象到了Collection中,熟练并利用好Collection提供的接口,已经可以解决大量的问题(即使是Map,其也提供了产生Collection对象的机制)。

 

Example:

public class TestContainer {
Collection<String> testList= new ArrayList<String>(Arrays.asList("i love you".split(" ")));
Map<Integer, String> testMap=new HashMap<Integer, String>();

TestContainer()
{
testMap.put(1, "I");
testMap.put(2, "love");
testMap.put(3, "you");


print(testMap);
print(testList);

print("Using Iterable Interface");
for(String str:testList)
{
print(str);
}

print("Geting the values collection of a Map");
Collection<String> mapValues= testMap.values();
for(String str:mapValues)
{
print(str);
}

print("Geting the Iterator of a collection");
Iterator i=mapValues.iterator();
while(i.hasNext())
{
print(i.next());
}
}
}

 以上的例子中,TestContainer的实例会有连个数据成员:

1、ArrayList<String>     testList

2、Map<Integer, String>   testMap

为了对ArrayList进行遍历,此例中直接将ArrayList向上转型为了Collection类型(结合类图),并利用foreach遍历方式对其中的成员进行了遍历。

为了对Map中的value域进行访问,此处调用了Collection<String> mapValues= testMap.values(); ,使用Map的values()方法返回了其value成员的Collection对象。

于是可以像操纵其它Collection一样,对该集合进行操作!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值