java容器类_走进Java中的持有对象(容器类)之一 容器分类

Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类。

容器的用途

如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构。

我们可以通过创建引用来持有对象,如

Class clazz;

也可以通过数组来持有多个对象,如

Class[] clazs = new Class[10];

然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象。数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善的方法来解决上述问题。

2.  容器的类别

d175317d743cbafc017707436303bc54.png

观察上图,我们可以得出容器主要分为两种类型,两个接口Collection与Map定义了两类不同的对象存储方式。

Collection用以保存单一的元素,Map保存关联键值对。通过泛型来指定容器存放的数据类型。Iterator设计的目的是在未知容器具体的类型的情况下,用来遍历容器元素。剩下的容器类型都是继承了这两个接口。

在实际编码中,通过向上转型为接口,在其与代码中都使用这个接口是非常普遍的使用方式。如下:

import java.util.*;public classTestCollection {public static voidmain(String[] args){

Collection c = new ArrayList();for(int i = 0; i < 10; i++){

c.add(i);

}for(Integer i : c){

System.out.print(i+ ", ");

}

}

}

注:由于List接口的方法比Collection更为丰富,所以 实际应用中,ArrayList向上转型为List更为合适。

刚刚接触容器的朋友们可能会只把Collection与Map当做接口,实际上并非如此,容器中的接口其实有六个。

3.  容器中的七大接口

Collection接口

Map接口

Set接口

List接口

Queue接口

Iterator接口

Comparable接口

其中List, Queue和Set接口继承了Collection接口,剩下的接口之间都是相互独立的,无继承关系。List和Set接口主要是为了区分是否要包含重复元素,Iterater迭代器则是为了更灵活的迭代集合,与foreach一起使用。Comparable接口则用于比较。

4.  各类容器的功能(主要实现类分析)

Collection接口

List接口(相比Collection, 添加了新的方法)

ArrayList

实现List接口,类似于动态数组,适用于大量随机访问的情况。但插入和删除的代价非常高昂

LinkedList

实现List接口,类似于链表,也提供了优化的顺序访问。在插入和删除方面代价低廉,随机访问代价较高

Set接口(方法与Collection完全相同)

HashSet

HashSet使用了散列函数实现,极大的提高了访问速度。存入HashSet的对象必须定义hashCode()

import java.util.*;public classIntegerSet{private staticRandom rand;public static voidmain(String[] args){

rand= new Random(47);

Set intset = new HashSet();for(int i = 0; i < 10000; i++){

intset.add(rand.nextInt(30));

}

System.out.println(intset);

}

}

本例中,intset中插入了10000次,由于不保留重复元素最后输出结果数目<=30。

TreeSet

TreeSet使用红黑树来实现存储元素, 红黑树的好处是可以插入之后维持集合的有序性。

import java.util.*;public classSortIntegerSet {private staticRandom rand;public static voidmain(String[] args) {

rand= new Random(47);

Set sintset = new TreeSet();for(int i = 0; i < 10000; i++){

sintset.add(rand.nextInt(20));

}

System.out.println(sintset);

}

}

LinkedHashSet

顾名思义,LinkedHashSet使用了链表来保持插入顺序,不过为了提高查询效率,也使用了散列。

Queue接口

LinkedList

LinkedList实现了Queue接口,提供了方法支持队列的行为,在以后的系列我们会深入讲解如何用

LinkedList实现队列。

PriorityQueue

与普通队列不同,优先队列每次弹出的是优先级最高的元素。可以通过提供自己的Comparator来修改

默认的优先级顺序。

Map接口

HashMap

HashMap通过散列机制,用来快速访问。

TreeMap

TreeMap保持"key"处于排序状态,访问速度不如HashMap

LinkedHashMap

LinkedHashMap保持元素插入时顺序,同时提供散列实现快速访问

关于Map的散列实现是非常重要的,实现Map的原理(关联数组等),hashCode()方法的理解,本系列后面会一一分析。

5.  总结

通过本文的学习,相信读者对容器的用途,分类,以及容器的层次结构与一些常用容器的基本功能和用法有了较为清晰地了解。然而,想要更好的使用容器类,还必须了解每种容器具体的方法,源码,以及线程安全的实现。在本系列的后续部分,将带大家继续深入讨论这些内容。

fa1eecbf1a17ee7634d4b0af6d1ae322.png

如果觉得本文对您有所帮助的话,就给俺推荐一个吧~

作者:I'm coding

链接:http://www.cnblogs.com/ACFLOOD/

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

6cdf0cf9346faadff6d874649a467406.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值