- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 集合概览(小结)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
java collection api提供了一些列的类和接口来帮助我们存储和管理对象集合。其实java中的集合工作起来像是一个数组,不过集合的大小是可以动态改变的,而且集合也提供了更多高级功能。有了javacollectionapi,我们就不需要自己编写集合类了,大部分java集合类都位于java.util包里面,还有一些和并发相关的集合类位于java.util.concurrent包中。下面就介绍一下java api 为我们提供的这些集合类.
1、java 集合概览 。
java中的集合有两大类,分别是:
1. collection 2. map 。
collection类的集合可以理解为主要存放的是单个对象,而map类的集合主要存储的是key-value类型的对象。这两大类即可理所当然的对应着两个接口,分别是collection接口和map接口,下面这幅图列出了这两个接口的继承树:
从上面这幅图可以看到,collection接口又衍生了出三个分支,分别是:
1. list 2. set 3. queue 。
而map则相对简单,只有一个分支。下面我们就详细介绍java collection的每一个实现类.
注意:要把collection、collections区分开,collection是集合的一个接口,而collections是一个工具类,它提供了一些静态方法来方便我们操作集合的实例,这两个都位于java.util包中.
2、先从collection接口介绍 。
下图是collection接口的源码截图,从接口中的抽象方法我们可以看出,它定义了一个通用集合常用的方法:
- 增加删除一个元素 - 判断元素是否存在 - 获得集合的大小 - 迭代一个集合 。
2.1 collection的list接口 。
list接口继承自collection接口,它的特点是其中的对象是有序的,并且每个对象都有一个唯一的index,我们可以通过这个index来搜索某个元素,并且list中的对象允许重复,这类似于一个数组。对于list接口,java api提供了如下实现:
- java.util.arraylist - java.util.linkedlist - java.util.vector - java.util.stack 。
当然,在 java.util.concurrent包中也有一些实现,这些内容会在另一篇文章中详细介绍.
arraylist是最常用的集合,其内部实现是一个数组,arraylist的大小是可以动态扩充的。对于元素的随机访问效率高,其访问的时间复杂度为o(1),对于数据的插入与删除,从尾部操作效率高,时间复杂度和随机访问一样是o(1),若是从头部操作则效率会比较低,因为从头部插入或删除时需要移动后面所有元素,其时间复杂度为o(n-i)(n表示元素个数,i表示元素位置).
linklist:从上图可以看出,不但继承了list接口,还继承了deque接口(后面会介绍)。linklist是一个基于链表的数据结构,每个节点都保存了上一个和下一个节点的指针。linklist对于随机访问效率是比较低的,因为它需要从头开始索引,所以其时间复杂度为o(i)。但是对于元素的增删,linklist效率高,因为只需要修改前后指针即可,其时间复杂度为o(1).
vector:从vector和arraylist源码截图可以看出,它们继承的接口完全一致。所以,vector可以看做是一个线程安全的arraylist,它内部也是基于数组实现的,不过几乎所有的集合操作都加了synchronized关键字.
stack:上面是stack类源码截图,我们看到stack类其实继承自vector,stack只是在vector的基础上添加了几个方法以提供栈(last in first out lifo)的特性。stack的特点是添加时新元素会被添加到顶部,移除时顶部的元素最先被移除。这种数据结构主要用作一些特殊数据加工流程,如语言编译、xml解析等.
2.2 collection的set接口 。
set和list接口一样也是继承自collection接口,同样是对集合的一种实现,它们之间最大的区别是set中的对象不允许重复。对于set接口,java api提供了如下实现:
- java.util.enumset - java.util.hashset - java.util.linkedhashset - java.util.treeset 。
这些类的功能稍有不同,区别主要体现在对象的迭代的顺序及插入、查找的效率上.
hashset的实现很简单,其内部就是一个hashmap,不过它对元素的顺序没有保证.
linkedhashset的实现也很简单,其内部用的是一个linkedhashmap。因为linkedhashmap内部维护了一个双向链表以保持顺序,所以linkedhashset的特点是它当中的元素是有序的,元素迭代的顺序就是其插入的顺序,元素的再次插入不会影响原有元素的顺序.
treeset:从上图的继承关系可以看出,想要了解treeset就要先了解navigableset和sortedset接口.
sortedset接口 。
1
2
3
4
5
6
7
|
public
interface
sortedset<e>
extends
set<e> {
comparator<?
super
e> comparator();
sortedset<e> subset(e fromelement, e toelement);
sortedset<e> headset(e toelement);
sortedset<e> tailset(e fromelement);
e first();
}
|
从上面接口定义看,sortedset接口是set的一个子接口,它除了有一般set的特性之外它元素在内部是有序的。它内部元素的顺序取决于元素的排序规则,即元素顺序取决于元素对comparable接口的实现或者一个comparator比较器,关于comparable和comparator的区别,可以参考:
navigableset接口 。
1
2
3
4
5
6
7
8
9
|
public
interface
navigableset<e>
extends
sortedset<e> {
navigableset<e> descendingset();
iterator<e> descendingiterator();
sortedset<e> headset(e toelement);
sortedset<e> tailset(e fromelement);
sortedset<e> subset(e fromelement, e toelement);
ceiling(), floor(), higher(), and lower()
...
}
|
从navigableset接口定义可以看到,它是sortedset的一个子接口,并且提供了一些导航方法,至于这些导航方法的含义大家可以查看java doc.
所以,treeset的特点就是内部元素有序,并且有很多导航方法的实现。从第一部分java集合类概览中我们知道,set有一个子接口sortedset,而sortedset又有一个子接口navigableset接口,java api对sortedset、navigableset接口的实现只有一个,就是treeset.
2.3 collection的queue接口 。
queue接口继承自collection接口,它也代表了一个有序的队列,不过这个队列最大的特点就是新插入的元素位于队列的尾部,移除的对象位于队列的头部,这类似于超市中结账的队列.
我们通过第一节的java集合概览已经知道,queue接口还有一个子接口deque,下面我们分别看一下javaapi对这两个接口的定义:
queue接口:
1
2
3
4
5
6
7
|
public
interface
queue<e>
extends
collection<e> {
boolean
add(e e);
boolean
offer(e e);
e remove();
e poll();
e peek();
}
|
deque接口:
1
2
3
4
5
6
|
public
interface
deque<e>
extends
queue<e> {
void
addfirst(e e);
void
addlast(e e);
e removefirst();
e removefirst();
}
|
从这两个接口的定义我想大家已经看出些端倪,queue接口定义了一般队列的操作方式,而deque则是一个双端队列.
对于queue接口,java api提供了两个实现:
- java.util.linkedlist(也实现了deque接口) - java.util.priorityqueue 。
linkedlist:前面的list章节已经提到,它是一个标准队列。 priorityqueue:队列中的顺序类似于treeset,取决于元素的排序规则,即元素对comparable接口的实现或者一个comparator比较器.
对于deque接口,出了linklist类之外还有一个实现:
- java.util.arraydeque 。
arraydeque:从名称可以看出,其内部实现是一个数组.
3、java 集合之 map 。
从第一部分java集合类概览中我们知道,map不是继承自collection接口,而是和collection接口出于并列的位置。所以,map的行为和上面介绍的collection的行为由很大不同。map的主要特点是它存放的元素为key-value对,我们看一下map接口的定义:
1
2
3
4
5
6
7
8
|
public
interface
map<k,v> {
v put(k key, v value);
boolean
containskey(object key);
set<map.entry<k, v>> entryset();
int
hashcode(); v get(object key);
set<k> keyset();
... ...
}
|
对于map接口,java api提供了如下实现:
- java.util.hashmap - java.util.hashtable - java.util.enummap - java.util.identityhashmap - java.util.linkedhashmap - java.util.properties - java.util.treemap - java.util.weakhashmap 。
其中,我们最常用到的是hashmap和treemap.
hashmap中的key、value都是无序的。hashmap的内部实现非常值得研究,具体请参考hashmap内部实现 。
hashtable可以看做是hashmap的重量级实现,其中的大部分方法都加了synchronized关键字,是线程安全的。hashtable与hashmap的另一个区别是hashmap的key-value都允许为null,而hashtable不可以.
linkedhashmap也是一个hashmap,只是内部维护了一个双向链表以保持顺序,linkedhashset内部实现就是用的linkedhashmap.
treemap中的key、value不但可以保持顺序,类似于treeset和priorityqueue,treemap中key、value的迭代顺序取决于它们各自的排序规则.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/suifeng3051/article/details/49250819 。
最后此篇关于Java 集合概览(小结)的文章就讲到这里了,如果你想了解更多关于Java 集合概览(小结)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
目录 前言 style-loader css-loader sass-loader postcss-loader babel-l
目录 1、简单动态字符串(SDS) 2、链表 3、字典 哈希表 哈希表节点 字典 4、跳跃表
JS运行三部曲 js运行代码共分三步 语法分析 预编译 解释执行 JavaScript代码在运行时,首先会进行语法分析,通篇检查代码是否存在低级错误,然后进行预编译,整理内
目录 +拼接方式 sprintf函数 Join函数 buffer.Builderbuffer.WriteString函数 buffer.B
下面整理下python有哪些方式可以读取数据文件。 1. python内置方法(read、readline、readlines) read() : 一次性读取整个文件内容。推荐使用re
背景 项目中的流程监控,有几种节点,需要监控每一个节点是否超时。按传统的做法,肯定是通过定时任务,去扫描然后判断,但是定时任务有缺点:1,数据量大会慢;2,时间不好控制,太短,怕一
目录 1. 提炼函数 2. 合并重复的条件片段 3. 把条件分支语句提炼成函数 4. 合理使用循环 5. 提前让函数退出代替嵌套条件分支
开始之前,pandas中dataframe删除对象可能存在几种情况 1、删除具体列 2、删除具体行 3、删除包含某些数值的行或者列 4、删除包含某些字符、文字的行或者列 本文就针对这四种情况探讨
setData setData 是小程序开发中使用最频繁的接口,也是最容易引发性能问题的接口。在介绍常见的错误用法前,先简单介绍一下 setData 背后的工作原理。 工作原理 小程序的视图层
下面是五种实现斐波那契数列的方法 循环 ? 1
一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第
python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。本文主要介绍了一些简单易懂最常用的python图像处理库。 当今世界充满了各种
流式布局 采用流式布局会将元素按从左到右的顺序排列,如果一个元素在一行中放不下,那这个元素会另起一行依然按照从左到右的顺序排列 示例: 代码 public class Tes
@PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.properti
实现消息队列的两种方式 apache activemq官方实例发送消息 直接在apache官网http://activemq.apache.org/download-archives.html下
常用配置 以下配置能使用File -> New Projects Settings -> Settings for New Projects进行配置的尽量用这个配置,因为这个配置是作用
摘要: 开发者开发部署web应用时通常使用tomcat服务器,很多初学者只懂得在开发工具上配置,但离开了开发工具,自己手动配置部署,并让一个项目跑起来,你会了吗。小编也遇到过这样的困扰。网上查找的
1. 字符串的翻转 利用切片 ? 1
cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结。 1.cookie存在于浏览器 随意打开一个网址,用火狐的调试工具,随意选取
1、使用内置的tomcat,通过java -jar的方式启动 比如:java -jar bms.jar 但是这种启动方式 一旦关闭控制台 或者crtl+c 退出 此时应用就关闭了
我是一名优秀的程序员,十分优秀!