Java 学习之集合类(Collections)
Collection(集合类)
我们是使用数组来保存数据,但是他的长度一旦创建,就已经确定了,当我们要动态传入穿值,数组就有些局限了,集合类就孕育而生;
所谓集合,就是来保存,盛装数据,也可称为容器类;使用的类 在java.util
包里
集合类的分类
一、Collection(一组对立的元素)
List(有顺序)
Set(不能有重复元素)
Queue(保存队列先进先出
的顺序)
二、Map(键值对(key-value)
)
【Collection & Map 区别】
1、Collection
每个位置只能保存一个元素
2、Map
保存的是键值对(key-value),可以通过过key
,来找到value
Java 集合类的层次(点击放大)
层次关系
Interface Iterable
Collection 的父接口,可以使用foreach
进行遍历,还有迭代器iterator()
方法进行遍历
Collection
最基本的集合接口,代表一组Object 集合
Set
实现Collectiion 接口,不能包含重复的元素
判断两个对象是否相同:equals()
方法,新加入的元素和已有元素相比equals
都返回false,否则拒绝添加
需要注意的是,Set 底层实现都是Map,Map 的value 为空;
HashSet
使用Hash 算法来存储元素,具有良好的存取和查找性能;
然后根据元素的Hashcode 值来决定元素在Hashset 的为位置(会重新进行排序)
Hashset 判断两个元素是否相同:
1、equals 为true
2、hashcode 相同
LinkedHashSet
和HashSet 一样,是利用hashCode 来觉得元素的存储位置,但是使用链表维护元素的次序
当遍历的时候,是按照插入的顺序遍历的
LinkedHashSet 需要维护元素的插入顺序,因此性能会略低于HashSet的性能,但是在迭代访问所有元素是性能会很高(链表适合遍历)
SortedSet
排序,compareTo() 方法进行比较,插入的元素类型需要一样,否则出现ClassCastException
TreeSet
SortedSet 的实现类,保证元素处于排序状态
EnumSet
为枚举类设计的集合类
List
有顺序,可重复,因此可以通过索引
来指定位置的集合元素
ArrayList
基于数组的List,封装了动态增长的Object[] 数组
Vector
和ArrayList 几乎一样,比较古老,线程安全
Stack
是Vector 的子类,栈
的结构(后进先出)
LinkedList
实现List,Deque;实现List,可以进行队列操作,可以通过索引来随机访问集合元素;实现Deque,也可当作双端队列,也可当作栈来使用
Queue(队列)
Queue 内部是队列的数据结构(先进先出),新插入的元素会在尾部;插入之后,会慢慢向顶部移动;
类似生活中的排队
PriorityQueue(优先级队列)
除了实现Queue 接口,PriorityQueue 还对插入的元素进行重新排序(Comparator)
Deque
双端队列,Deque 可以从两端来添加啊,删除元素,因此,Deque 可以当作队列使用,也可当作栈来使用
ArrayDeque
基于数组的双端队列,和ArrayList 类似,底层都是采用一个动态可分配的Object[] 的数组
LinkedList
Map
保存映射关系
的数据(key-value)
key:不允许重复,即两个任意的key 通过equals 比较返回总是false
value:存储方式类似List(可以重复,根据索引来查找)
需要注意的是:Java 中先实现Map,然后通过包装所有value 为null 来实现Set 集合
HashMap
和Hashset 一样,利用key 的hashCode 值进行排序;
判断两个key 相等,equals() 方法返回true,两个hashCode 也必须相等
LinkedHashMap
使用双向链表来维护key-value 的次序,该链表负责维护Map 的迭代顺序,与插入时的顺序一样
HashTable
古老的Map 实现类
Properies
将Map 写入文件
SortedMap
TreeMap
是一个红黑树结构,对key 进行排序(compareTo),
自然排序:默认的排序
定制排序:也可在构造方法中传入Comparetor 对象,自定义排序
WeakHashMap
"弱引用",可能会被垃圾回收
IdentityHashMap
key 的比对 "=="
EnumMap
枚举类实现的Map
遍历的几种方式
iterator
foreach
listIterator(List 特有的)
总结Set 的选择
1、HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet
2、对于普通的插入、删除操作,LinkedHashSet比HashSet要略慢一点,这是由维护链表所带来的开销造成的。不过,因为有了链表的存在,遍历LinkedHashSet会更快
3、EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素
4、HashSet、TreeSet、EnumSet都是"线程不安全"的,通常可以通过Collections工具类的synchronizedSortedSet方法来"包装"该Set集合。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
List 选择
1、java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现
2、Queue代表了队列,Deque代表了双端队列(既可以作为队列使用、也可以作为栈使用)
3、因为数组以一块连续内存来保存所有的数组元素,所以数组在随机访问时性能最好。所以的内部以数组作为底层实现的集合在随机访问时性能最好。
4、内部以链表作为底层实现的集合在执行插入、删除操作时有很好的性能
5、进行迭代操作时,以链表作为底层实现的集合比以数组作为底层实现的集合性能好
6、当要大量的插入,删除,应当选用LinkedList;当需要快速随机访问则选用ArrayList;
Map 的选择
1、HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样。但HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制
2、TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对
3、使用TreeMap的一个好处就是: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
4、HahMap 是利用hashCode 进行查找,而TreeMap 是保持者某种有序状态
5、所以,插入,删除,定位操作时,HashMap 是最好的选择;如果要按照自然排序或者自定义排序,那么就选择TreeMap
Java 学习之集合类(Collections)的更多相关文章
- Java学习笔记(八):集合类
Java中对数据的存储会使用到集合类,下面我们来看看Java中常用的集合类. Collection接口 集合的接口,可以简单的理解为可以动态扩充的数组. Collection接口定义了很多相关的方法, ...
- 关于JAVA学习计划和感想
学习计划第一阶段: JAVA语言基础知识.包括异常.IO流.多线程.集合类. 要求:异常------掌握try-catch-finally的使用 IO流------掌握字 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- Java学习路线图分析
Java学习路线分析图 第一阶段 技术名称 技术内容 J2SE(java基础部分) java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置, ...
- java学习(四)
学号 20189214 <Java程序设计>第四周学习总结 教材学习内容总结 枚举 枚举是JDK1.5版本新增的特性(泛型.For-each等如今被广泛应用的特性也是由JDK1.5时所新增 ...
- Java 学习(16):集合框架
Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, Properties 这些类用来存储和操作对象组. 虽然这些类都非常有 ...
- Java 学习(21):Java 实例
Java 实例 本章节我们将为大家介绍 Java 常用的实例,通过实例学习我们可以更快的掌握 Java 的应用. Java 环境设置实例 //HelloWorld.java 文件 public cla ...
- Java学习:JDK8的新特性
Java学习:JDK8的新特性 一.十大特性 Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式联合使用 引入重复注解 类型注解 最新的 ...
- Java学习路线【转】
Java学习路线[转] 第一阶段:JavaSE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相 ...
随机推荐
- TZOJ 2722 Matrix(树状数组区间取反单点查询)
描述 Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row ...
- TZOJ 3295 括号序列(区间DP)
描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...
- FortiGate防火墙内存使用率高问题
1.现象:zabbix监控到防火墙内存使用率频繁超过80%,而FortiGate防火墙内存超过80%将开启自身保护模式而不能新加策略等. 2.分析:这种情况一般是某些进程再释放内存的时候卡住.可以先查 ...
- js五种继承优缺点
//1.原型继承 //缺点: 当父级的属性有引用类型的时候,任意一个实例修改了这个属性,其他实例都会受影响 // 1)基本类型:Number Boolean String undefined null ...
- 微信网页JS分享,微信二次分享无缩略图问题
很多时候我们要在微信中分享h5网页,这个时候就得用微信的分享接口来自定义分享的地址.标题.描述.缩略图了. 分享到微信的时候遇到一个问题,就是第一次分享到微信里,是正确的,但是在微信打开分享的链接,再 ...
- CSS背景background图片
一.CSS背景background图片 - TOP 1.背景图片语法background-image:url() 引入背景图片background-repeat:no-repeat 设置背景图 ...
- spring + ibatis 多数据源事务(分布式事务)管理配置方法(转)
spring + ibatis 多数据源事务(分布式事务)管理配置方法(转) .我先要给大家讲一个概念:spring 的多数据源事务,这是民间的说法.官方的说法是:spring 的分布式事务.明白了这 ...
- VS2013一次替换变量名
插件下载地址:https://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194 该插件目前只支持: ...
- PAT 1085 PAT单位排行(25)(映射、集合训练)
1085 PAT单位排行(25 分) 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤105),即考生人数.随 ...
- refused to Connection
两种情况: .数据库账号密码错误 .mysql挂了