Java中的集合都有哪些 在啥情况下使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的集合都有哪些 在啥情况下使用相关的知识,希望对你有一定的参考价值。

Collection:List、Set
Map:HashMap、HashTable

如何在它们之间选择

一、Array , Arrays

Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。

1、
效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。

2、Java中有一个Arrays类,专门用来操作array。
arrays中拥有一组static函数,
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
System.arraycopy():array的复制。

二、Collection , Map

若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。

1、Collection 和 Map 的区别

容器内每个为之所存储的元素个数不同。
Collection类型者,每个位置只有一个元素。
Map类型者,持有 key-value pair,像个小型数据库。

2、各自旗下的子类关系

Collection
--List: 将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。
--ArrayList / LinkedList / Vector
--Set : 不能含有重复的元素
--HashSet / TreeSet
Map
--HashMap
--HashTable
--TreeMap

3、其他特征

* List,Set,Map将持有对象一律视为Object型别。
* Collection、List、Set、Map都是接口,不能实例化。
继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。
* vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。

三、Collections

Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。
相当于对Array进行类似操作的类——Arrays。
如,Collections.max(Collection coll); 取coll中最大的元素。
Collections.sort(List list); 对list中元素排序

四、如何选择?

1、容器类和Array的区别、择取
* 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。
* 一旦将对象置入容器内,便损失了该对象的型别信息。

2、
* 在各种Lists中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList();
Vector总是比ArrayList慢,所以要尽量避免使用。
* 在各种Sets中,HashSet通常优于HashTree(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。
HashTree存在的唯一理由:能够维护其内元素的排序状态。
* 在各种Maps中
HashMap用于快速查找。
* 当元素个数固定,用Array,因为Array效率是最高的。

结论:最常用的是ArrayList,HashSet,HashMap,Array。

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
2、Set和Collection拥有一模一样的接口。
3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)
4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。

5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
HashMap会利用对象的hashCode来快速找到key。
* hashing
哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。
我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。

发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。

6、Map中元素,可以将key序列、value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。

为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复

参考资料: http://blog.163.com/xyz_1112/blog/static/386944022007113032941347/
参考技术A List : 存放有序可重复的元素
set : 存放无序不可重复的元素
map : 存放key-value形式的元素,其中所有的key组成一个set集合,所有的value组成一个List集合本回答被提问者采纳
参考技术B List verctor :
set : 数学集合那样的
map : key-value形式的
以上是经常用到了。
参考技术C 自己看书就可以解决

在啥情况下使用八进制?

【中文标题】在啥情况下使用八进制?【英文标题】:In what situations is octal base used?在什么情况下使用八进制? 【发布时间】:2011-02-06 06:08:00 【问题描述】:

我见过经常使用二进制和十六进制,但从未见过八进制。然而,八进制在某些语言中使用有自己的约定(即,前导 0 表示八进制基数)。什么时候使用八进制?使用八进制或八进制更容易推理的典型情况有哪些?还是只是口味问题?

【问题讨论】:

【参考方案1】:

当一个字中的位数是 3 的倍数时,或者如果将位分组以 3 为一组表示有意义,则使用八进制。示例如下:

具有 18 位字长的古代系统(大部分是历史系统) 具有 9 位字节的系统(大部分是历史记录) unix 文件权限为 9 位(3*3 位,“rwxr-x---”0750) 12bits的unix文件权限(与9bit版本相同,只是在前面增加了三位setuid、setgid和sticky,01777但这里字母更复杂)

在我从事 IT 工作的大约 25 年中,除了 unix 文件权限位之外,我没有遇到过任何八进制的使用。

但是,如果您的单词中的位数是 4 的倍数,请务必使用十六进制

【讨论】:

这是一个非答案。根据其定义,数字系统不是“使用”的。该问题询问了应用八进制的示例。【参考方案2】:

八进制用于表示 UNIX 系统上的文件权限的简写。例如,文件模式rwxr-xr-x 将是0755

【讨论】:

但由于值仅从 0 到 7,在技术上不与十进制或十六进制相同吗? 不,因为在十进制中你也会有 8 和 9,等等。 @Neil 不,因为它们会给你不同的数值——0x755 是二进制的011101010101,而0755111101101。那么,前者意味着在 unix 文件权限方面完全不同。 啊,我在想每个数字都是单独应用的。 “755”当然与其对应的十进制有很大不同。【参考方案3】:

当语法在某些平台上可能是有意义的时代的遗物时使用八进制(系统字并不总是8位的倍数)。现在可以使用十六进制。

【讨论】:

【参考方案4】:

没想到这是数字显示器!

其他几种用途: http://en.wikipedia.org/wiki/Octal

【讨论】:

【参考方案5】:

八进制被更频繁使用的主要原因之一是八进制和二进制之间的转换比十六进制到二进制更容易:你只需要记住 8 个八进制数字的二进制表示(0- 7).

在过去,调试意味着从一排 LED 读取寄存器内容,或使用一系列拨动开关输入数据,这是一个大问题。许多这些早期计算机上的面板将 LED 和开关按三组分组以促进这一点。

但是,随着 8 位字节的倍数字长开始占优势,十六进制开始占上风,并且不再需要以二进制形式读取和输入数据(使用控制台文本 UI 和后来的 GUI 调试器)。

【讨论】:

【参考方案6】:

如果鸟类可以数数,我猜它们会使用八进制数。虽然大多数鸟类的羽毛“手”上有 3 个手指,但大多数是Tetradactyly,这意味着每只脚上有 4 个脚趾。

【讨论】:

哦,还有米老鼠 ;-)【参考方案7】:

在航空电子设备中,ARINC 429 字标签几乎总是以八进制表示。

【讨论】:

【参考方案8】:

音乐,只要你远离(大多数)升号和降号。

【讨论】:

.... 什么?一个“传统”(即钢琴)八度有 12 个声音。 12. 不是 7. 而且你无法避免在任何严重的事情中出现锐利和扁平。 半音阶有 12 个音符,但全音阶只有 7 个。音符根据全音阶 A-G 标记,这是一种八进制编号系统。 Solfège 也使用全音阶音阶。诚然,中间的其他 5 个半音需要额外的标记来表示,但 OP 询问了八进制编号的使用,而不是信息论,其中表示音乐当然需要每个音符超过 3 位。 【参考方案9】:

仅供参考,windows 和 javascript 有几个地方会自动决定以零为前缀的数字是八进制并转换数字。

在 windows 中,如果你 ping 和地址像 10.0.2.010 它实际上会 ping 10.0.2.8

如果您将其输入为计算机的 ip/dns 地址,Windows 也会执行此操作

虽然它已被弃用,但如果您不指定基数 http://www.w3schools.com/jsref/jsref_parseint.asp,Javascript 默认会在某些函数(如 parseInt)上执行此操作

【讨论】:

任何使用 Windows Sockets inet_addr() 的东西都会表现出这种记录在案的行为。 显然也是 Perl。 C 在语言本身和标准库中都以这种方式工作(其中“0”前缀导致数字文字以八进制表示法解释)。因此,Windows 等操作系统继承了这种行为也就不足为奇了。

以上是关于Java中的集合都有哪些 在啥情况下使用的主要内容,如果未能解决你的问题,请参考以下文章

JAVA的集合类型都有哪些

请问下List 和 Map 还有 Set 到底在啥情况下用的 区别的话我是知道但太抽象了

在啥情况下我应该使用尝试而不是二叉树/哈希表? [复制]

java中清除list的方法都有哪些

java中map的常用遍历方法都有哪些?

JAVA 全部的数据结构都有哪些?