在JAVA中如何正确的选择集合类型

程序=数据结构+算法

程序=数据结构+算法

这是编程界非常有名的一个公式,大部分程序员在刚开始接触编程的时候就会听说这个公式,我们也在持续不断的编程生涯中加深对这个公式的理解。

现在有一些观点认为这个公式过时了,觉得现在的程序包含了很多的东西,数据结构和算法已经不足以涵盖了。但我觉得这并不是公式过时,而是我们对于公式的理解需要与时俱进了。

这个中文的公式十分的贴切。数据结构就是数据的结构,这不单单指的是堆栈、数组、链表之类的东西,我们定义的实体、对象都是数据结构。算法就是通过设定好的计算步骤,对数据处理的方法,这也不单单指的排序,红黑树,递归等等,只要是对数据进行处理,对于时间的格式化展示这也是一种算法。当我们打开视角来看这些概念的时候,我们的程序还是由数据结构和算法组合而成的,只不过复杂的程序数据结构和算法在不同的层面不同的地方混合交织,有些算法是为了将一个数据结构转换为另一个,有些算法是为了修改数据结构的内容。

通常来说数据结构能分成三类:一类是单体数据结构,比如数字、字符串。第二类是复合数据结构,比如定义的实体、对象。第三类是集合数据集结构,比如列表,字典等等。

单体数据结构大多都是编程语言提供的基础类型或基础类型的扩展,比如JAVA中的String,Integer。这类数据结构在JAVA程序编写的时候就会进行声明,编译的时候进行检查,很难写错。

复合数据结构大多都是针对业务进行设定的,形成一个个的实体类,这些类都含有业务含义,只要业务抽象得当,这类对象也很难用错。

而集合数据结构本身不具有程序的业务属性,在使用上也能在一定程度上进行相互的代替,只是在不同的算法场景上哪种更合适,而如果集合数据结构用在了不合适的地方,也并不是完全用不了,但是会带来编程复杂度提升,容易产生BUG,一旦触发了BUG不好查问题等等负面影响。而JAVA提供的集合数据结构种类也不少,经常能看到有小朋友不太能分清需要用那种集合类型。今天再把以前画的图拿出来,一起来看看JAVA集合类框架提供的这些不同的集合类型,都有哪些特性,适合那些场景下使用,我们如何去选择。今天没有代码,只给工具。

JAVA的常用集合类型

JAVA常用集合类型关系图


JAVA集合-关系.png

上图主要列举的是常用的集合类型和他们之间的关系,并不是严格的类图,所以没有很多详细的复杂的接口、类之间的关系。另外这也并不是全部,只是列举了常用的,Queue这里要说明一下,这里并没有列出所有的队列类型,主要原因是使用率并不如其他的这么高,主要说明异步的作用,忽略同步等待队列。队列以后有机会再展开说。

OK,我们从左到右简单的了解一下,咱们这里不看代码,就看他们的特性,来源就是JDK1.8的源码注释。

List(列表)

允许重复的有序集合。

ArrayList

Resizable-array implementation of the List interface.

关键字:

array:数组结构,查询块,非有效末尾的增删慢。

Resizable:数组本身长度是不可变的,能够resize就说明要新开辟内存来做数据的来回倒换,末尾增也慢。

LinkedList

Doubly-linked list implementation of the List and Deque interfaces.

关键字:

Doubly-linked:双向链表结构,增删快,没有resize的需求,非手尾的其他元素查找慢。

Stack

The Stack class represents a last-in-first-out (LIFO) stack of objects.

关键字:

LIFO:后进先出

Queue(队列)

设计用来临时保存处理对象的集合。

BlockingQueue

BlockingQueue的JavaDoc没有对这种类型做一个概括性的介绍。

关键字

生产消费模式,适合将长的处理流程异步化。

Set(Set)

不允许重复的无序集合。

HashSet

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.

关键字:

hash table:哈希表结构,不保证顺序,增删改查快。

no guarantees as to the iteration order of the set:强调了不保证顺序。

not guarantee that the order will remain constant over time:甚至随着时间的变化顺序还有可能发生变化。

LinkedHashSet

Hash table and linked list implementation of the Set interface, with predictable iteration order. This linked list defines the iteration ordering, which is the order in which elements were inserted into the set

关键字:

linked list:加入了链表结构,hash表还在,两个结构共同作用,性能和内存占用都稍稍逊色一点。

predictable iteration order:保证顺序性。

order in which elements were inserted into the set:元素插入的顺序。

TreeSet

A NavigableSet implementation based on a TreeMap. The elements are ordered using their Comparable natural ordering, or by a Comparator provided at set creation time, depending on which constructor is used.

关键字:

TreeMap:基于TreeMap的实现,使用红黑树结构,增删时数据结构实时变化。

Comparable natural ordering:使用天然排序。

Comparator provided:或者提供一个排序方法。

Map(字典/映射)

提供一个对象和另一个对象的关系管理。

HashMap

Hash table based implementation of the Map interface. This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

关键字:

hash table:哈希表结构,不保证顺序,增删改查快。

no guarantees as to the order of the map:强调了不保证顺序。

not guarantee that the order will remain constant over time:甚至随着时间的变化顺序还有可能发生变化。

LinkedHashMap

Hash table and linked list implementation of the Map interface, with predictable iteration order. This linked list defines the iteration ordering, which is normally the order in which keys were inserted into the map

关键字:

linked list:加入了链表结构,hash表还在,两个结构共同作用,性能和内存占用都稍稍逊色一点。

predictable iteration order:保证顺序性。

order in which keys were inserted into the map:元素插入的顺序。

TreeMap

A Red-Black tree based NavigableMap implementation. The map is sorted according to the Comparable natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used.

关键字:

Red-Black tree based:使用红黑树结构,增删时数据结构实时变化。

Comparable natural ordering:使用天然排序。

Comparator provided:或者提供一个排序方法。

编码选择场景速查表

如果在实际开发过程中遇到了需要使用这些集合结构,可以收藏下面的速查表,根据实际的编码场景选择合适的集合结构。


JAVA集合-速查.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容