Java中的集合类实在是太丰富了,有常用的ArrayList、HashMap,也有不常用的Stack、 Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap,有阻塞 式的ArrayBIockingQueue,也有非阻塞式的PriorityQueue等,整个集合家族非常庞大,而 且也是错综复杂,可以划分为以下几类:

(1)  List

实现 List 接口的集合主要有:ArrayList、LinkedList、Vector、Stack,其中 ArrayList 是 一个动态数组,LinkedList是一个双向链表,Vector是一个线程安全的动态数组,Stack是一 个对象栈,遵循先进后出的原则。

(2)  Set

Set是不包含重复元素的集合,其主要的实现类有:EmimSet、HashSet、TreeSet,

其中EnumSet是枚举类型的专用Set,所有元素都是枚举类型;HashSet是以哈希码决定其元素位 置的Set,其原理与HashMap相似,它提供快速的插入和査找方法;TreeSet是一个自动排序 的 Set,它实现了 SortedSet 接口。

(3)  Map

Map是一个大家族,它可以分为排序Map和非排序Map,排序Map主要是TreeMap 类,它根据Key值进行自动排序;非排序Map主要包括:HashMap、HashTable、Properties、 EnumMap等,其中Properties是HashTable的子类,它的主要用途是从Property文件中加载数据,并提供方便的读写操作;EnumMap则是要求其Key必须是某一个枚举类型。

Map中还有一个WeakHashMap类需要说明,它是一个采用弱键方式实现的Map类,它 的特点是:WeakHashMap对象的存在并不会阻止垃圾回收器对键值对的回收,也就是说使 用WeakHashMap装载数据不用担心内存溢出的问题,GC会自动删除不用的键值对,这是好事。但也存在一个严重问题:GC是静悄悄回收的(何时回收?Godknows!),我们的程序无 法知晓该动作,存在着重大的隐患。

(4)  Queue

队列,它分为两类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包H : AirayBlockingQueue, PriorityBlockingQueue, LinkedBlockingQueue,其中 ArrayBlockingQueue 是一个以数组方式实现的有界阻塞队列,PriorityBlockingQueue是依照优先级组建的队列, LinkedBlockingQueue是通过链表实现的阻塞队列;另一类是非阻塞队列,无边界的,只要内 存允许,都可以持续追加元素,我们最经常使用的是PriorityQueue类。

还有一种队列,是双端队列,支持在头、尾两端插入和移除元素,它的主要实现类是:ArrayDeque、LinkedBlockingDeque、LinkedList.

(5)  数组

数组与集合的最大区别就是数组能够容纳基本类型,而集合就不行,更重要的一点就是所有的集合底层存储的都是数組。

(6)  工具类

数组的工具类是 java_util.Arrays 和 java.lang.reflect.Array,集合的工具类是 java.util .Collections, 有了这两个工具类,操作数组和集合会易如反掌,得心应手。

(7)  扩展类

集合类当然可以自行扩展了,想写一个自己的List?没问题,但最好的办法还是“拿 来主义”,可以使用Apache的commons-collections扩展包,也可以使用Google的google- collections扩展包,这些足以应对我们的开发需要。

注意commons-collections、google-collections是JDK之外的优秀数据集合工具包,使用拿 来主义即可。

[改善Java代码]由点及面,一叶知秋----集合大家族的更多相关文章

  1. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  2. java提高篇(二十)-----集合大家族

          在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的Arra ...

  3. [改善Java代码]对字符串排序 持一种宽容的心态

    在Java中一涉及到中文处理就会冒出很多的问题来,其中的排序也是一个让人头疼的问题,看代码: import java.util.Arrays; public class Client { public ...

  4. [改善Java代码]推荐在复杂字符串操作中使用正则表达式

    一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...

  5. [改善Java代码]非稳定排序推荐使用List

    我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...

  6. [改善Java代码]多线程使用Vector或HashTable

    Vector是ArrayList的多线程版本,HashTable是HashMap的多线程版本,这些概念我 们都很清楚,也被前辈嘱咐过很多次,但我们经常会逃避使用Vector和HashTable,因为用 ...

  7. [改善Java代码]减少HashMap中元素的数量

    在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...

  8. [改善Java代码]集合运算时使用更优雅的方式

    在初中代数中,我们经常会求两个集合的并集.交集.差集等,在Java中也存在着此 类运算,那如何实现呢? 一提到此类集合操作,大部分的实现者都会说:对两个集合进行遍历,即可求出结果.是的,遍历可以实现并 ...

  9. [改善Java代码]不推荐使用binarySearch对列表进行检索

    对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...

随机推荐

  1. Visual Studio 2013智能提示失效解决办法

    各种解决VS2013智能提示失效办法: 1.重置所有设置    工具->导入导出设置->重置所有设置 2.智能提示开关: 工具->选项->文本编辑器->C#->常规 ...

  2. homework_06 围棋程序改进

    1) 把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能比较容易地了解这些程序在干什么. 把正确的 playPrev(GoMove) 的方法给实现了. 注释见Git ...

  3. UVALive 7274 Canvas Painting (优先队列)

    Canvas Painting 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/C Description http://7xjo ...

  4. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  5. thymeleaf中的th:assert用法

    th:assert 断言标签 th:assert属性可以指定一个以逗号分隔的表达式对其进行评估并生产适用于每一个评价,如果不抛出异常 <div th:assert="${onevar} ...

  6. HDU 1068 Girls and Boys (二分图最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合 ...

  7. time_t转换为DateTime

    最近解析文华财经的日线数据. 取得的第一个字段是日期,为time_t格式(long)的. 因为是用C#来写解析程序,所以要转换为DateTime的. time_t是世界时间,要转换为本地时间,所以要加 ...

  8. HR(人事管理)

    HRMS(Human Resource Management System) --人员 per_people_f --人员分配 per_all_assignments_f --要素 DECLARE l ...

  9. 【转】单例模式(python/c++)

    1. 什么是单例模式(Singleton pattern)? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易 ...

  10. 为joomla加入下拉菜单的方法

    用 Joomla! 建站的大多数站长都须要在站点前台使用下拉菜单(dropdown menu),或者叫弹出菜单(slide menu),由于这样能够在有限的页面空间上公布很多其它的导航菜单,而且能够进 ...