java中集合的分类以及集合的选择
一.java中的集合
一般同学都是从c语言起步的,刚开始使用java时,会对集合这个概念比较陌生,在c语言中我们表示数据的集合往往使用数组,在编写c程序时觉得数组完全可以满足我们的基本需要。而到了java出现了集合的概念,我们应该考虑一下为什么java不也用数组去存储数据集呢,而是引出了集合的概念。
1.java集合的出现
1)java作为面向对象的编程语言,普通的数组由于单一的数据结构无法处理对象或者数据十分庞大的数据集,而且面向api,java的集合向比于普通的数组,可以集成更多的关于数据集的方法,而我们在外部只需要直到集合的概念并且会使用方法即可,既解决了数据庞大的问题,也解决了数据处理的问题。
2)在java语言的特性里面,我们会使用到对多个集合的操作。
2.java常用集合的分类
下面这张图可以给出常用的集合类与接口的继承实现关系。
其中Collection是集合类的根接口,具体的集合分类都要以Collection为根,其中以Collection接口为根集合的根本特点是单列的,也就是一次存一个对象进入。而与之相对的是Map接口,双列(K-V),一次存入一个键值对。Map的一个继承实现关系如下:
3.Collection下常用的集合
3.1List集合
List集合的主要特点是取出与存入是有序的,并且元素可以重复,这些从底层实现的数据结构就能看出。
3.1.1 ArrayList
1)底层维护Object数组,可自动扩容,查找快,但是插入较慢
2)线程不安全,效率较高
3.1.2 LinkedList
1)底层维护双向链表,查找慢,但是插入快
2)线程不安全,效率较高
3.1.3 Vector
1)底层维护Object数组,可自动扩容,查找速度快,但是插入较慢
2)线程安全,效率较低
3.2 Set集合
Set与List最大不同就是Set取出与存入是无序的,并且元素不可重复,这都是由于HashMap的缘故,学过数据结构的同学应该清楚,以hash实现的存储结构无法做到取出与存入的顺序记录,同时Hash的特点也要求其不可重复。
3.2.1HashSet
1)底层使用HashMap,查看源码可以得知,这里只使用HashMap的Key进行类似单列的存储,而把Value设为null。
3.2.2 TreeSet
1)与HashSet一样TreeSet也使用了TreeMap
2)这里与HashSet的不同就是TreeSet提供排序的方法可以进行排序操作。
4.Map下常用的集合
4.1HashMap
1)底层维护哈希表+链表+红黑树,可以说HashMap是整个集合中最为复杂的集合,简单来说就是当HashMap元素较少是就是哈希表+链表,当元素比较多时,转换成哈希表+红黑树的存储结构。这里同学们可以结合源码慢慢分析。
2)HashMap线程不安全,效率较高
3)有一个子类LindedHashMap在链表中加入特殊指向保存存入元素的顺序
4.2HashTable
1)HashTable底层与HashMap类似
2)HashTable是线程安全的
3)有一个子类Properties用于读取配置文件
4.3TreeMap
1)底层维护的是黑红树,由于特殊的数据结构使得TreeMap再传入特定的比较器的条件下,可以实现按所需的顺序存储数据
2)线程不安全
5.集合的遍历
5.1Collection
对于Collection集合的遍历可以使用迭代器或者增强for循环,这里相对简答,不做过说说明
5.2Map
Map的遍历主要有两种方法,一种是取出Key集合然后遍历找出对应的Value,或者可以直接取出Value的集合。
二.java中集合的选择
首先判断存储的数据的类型是什么?(单列还是双列)
单列:Collection接口
判断允许重复么?
允许重复:List接口
增删多:LinkedList
改查多:ArrayList
不允许重复:Set接口
无序:HashSet
需要排序:TreeSet
双列:Map接口
键无序:HashMap
键需要排序:TreeMap
键值插入与取出顺序一致:LinkedHashMap
读取配置文件:Properties
java中集合的分类以及集合的选择相关推荐
- java中给对象的List集合去重的几种方法(Lambda)
java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...
- java io类型_Java NIO之Java中的IO分类
前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...
- Java中的异常分类[乐乐独记]
Java中的异常分类[乐乐独记] 1.什么是异常 2.异常的大体分类 3.异常分类解释 3.1.Error异常 3.1.1.OutOfMemoryError异常 3.1.2.NoClassDefFou ...
- java下面哪些定义正确,请问,以下哪些是java中定义的合法关键字?请选择所有正确答案:...
请问,以下哪些是java中定义的合法关键字?请选择所有正确答案: 答:interface sizeof volatile "凡是亲眼所见的都是对客观事实的真实反映",这个命题 答: ...
- java 中list类型未知_Java集合-List
Java Collection 在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便.这些接口和类有很多对抽象数据类型操作的A ...
- java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组
Java极客 | 作者 / 铿然一叶 这是Java极客的第 48 篇原创文章 一.数组的特点 1.数组大小固定 2.一个数组只能存储相同数据类型 3.随机访问性能高 4.存储空间连续,这样可以 ...
- Java中如何循环删除一个集合(如List)中的多个元素
今天我需要从一个java的集合中,根据另一个集合的内容,删除第一个集合中不特定的元素.这看上去非常简单,但却遇到了问题.这就是"Java中如何删除一个集合中的多个元素"的问题. 这 ...
- Java 中的锁分类以及锁的原理
锁分类与原理 锁的分类 锁的分类及基本概念 Java对象在内存中的布局: 锁的升级过程: 锁的本质: synchronized 与Lock 的区别: 互斥锁的原理: 1.读写锁 2.读写锁的原理 3. ...
- Java中的变量分类_开发简单的Java应用
第一章 开发简单的Java应用 1.Java语言的技术分类 (1)JavaSE:标准版,开发桌面应用 (2)JavaEE:企业版,Web应用 (3)JavaME:小型版,嵌入式 2.如何开发和运行Ja ...
最新文章
- USCAO Job Processing 4.2(贪心,不知道叫啥方法)
- 注解配置声明式事务控制解析
- cocos2d-x游戏实例(24)-简易动作游戏(2)
- SpringCloud主要组件
- 用VC写Assembly代码(6)--附录3[X86指令使用详解]
- easyui下拉选项多怎么解决_微信社群多难以管理怎么办?社群管家工具帮你解决烦恼...
- CCF NOI1036 进制转换
- u-boot的补丁文件patch
- python 三维图片 任意切片_python实现对任意大小图片均匀切割的示例
- 嵌入式软件高频面试题
- 软件测试基础 (三): 系统测试
- 《HelloGitHub》第 69 期
- 测试之smart原则
- Altium Designer原理图与PCB设计学习笔记6——AD如何在多个原理图中查找相同的网络标号
- 记录FinalShell退格键
- 运维工程师是桥的护栏_运维工程师职务说明书
- “蓝色巨人”转向,极氪会是吉利的一剂“良药”吗?
- CES2017盘点: 各大公司都推出了哪些机器人
- 阿里开源java诊端工具arthas官网介绍
- Ajax 技术汇总(转载)