Java基础:容器

转载请注明出处:jiq?钦‘s
technical Blog

一、Collection:存放独立元素

Collection中的接口都是可选操作,其实现类 并不一定实现了其所有接口,这是为了防止“接口爆炸”。最常见的Unsupported Operation
都源自于背后由固定尺寸的数据结构支持的容器,比如使用ArrayList.asList将数组转换成List的时候,就会得到这样的容器。

 (1)Collection之List

List较之Collection增加了很多额外的接口。特别是LinkedList。


优点


缺点


保存元素的顺序


应用


ArrayList            


随机访问速度快,内部使用数组实现。


迭代,插入和删除元素慢,尤其是当List]尺寸比较大的时候。


插入顺序


可变长数组


LinkedList


迭代(顺序访问经过优化),插入,删除都很快

内部使用双向链表实现


随机访问速度慢


插入顺序


顺序访问, 批量插入删除元素的场合

(2)Collection之Set

存入Set的每一个元素都必须是唯一的,因为Set不保存重复元素,但是存入Set的元素必须要定义equals()方法以确保对象的惟一性。另外Set与Collection有着完全相同的接口,Set并不保证维护元素的次序。所以需要注意,Set不包含随机访问的get方法,因为Set是自己维护内部顺序的,不需要随机访问。


优点


保存元素的顺序


要求


HashSet


为快速查找设计


散列存储


必须定义hashCode()方法


LinkedHashSet


和HashSet一样的查询速度,但是插入要比HashSet慢一些,因为它通过维护链表形式维护元素。


使用链表维护元素顺序(插入顺序)


必须定义hashCode()方法


TreeSet


保存有序的Set,底层通过TreeMap来实现的


按照排序顺序维护元素


必须实现Comparable接口(包含compareTo方法)

注意,如果没有特别的限制,HashSet就应该是你的默认选择,因为它对速度进行了优化。

(3)Collection之Queue:


特点


保存元素的顺序


LinkedList


LinkedList除了普通List之外,还添加了很多实现<队列,栈,双向队列>三种数据结构的方法。

尤其是模拟Queue的时候在两端插入删除元素很快(经过了优化)。


插入的顺序


PriorityQueue


按照排序顺序取出元素,所以要求必须实现Comparable接口。


排序顺序

二、Map:存放键-值对

为了保证Map中的唯一性,任何“键”都需要有一个equals()方法,判断当前键是否与表中的键相同。


特点


保存元素的顺序


要求


HashMap


Map基于散列存储,插入和查询“键值对”的开销是固定的。


散列存储


存入的键需要具备hashCode()方法,当然,返回的标识不一定要唯一


LinkedHashMap


为了提高速度散列了所有元素,插入查询只比HashMap慢一点点,因为它在维护散列数据结构的同时还要维护链表(插入顺序)。 但是迭代访问的时候更快,因为内部使用链表维护次序。


插入顺序


同样需要键实现hashCode()方法


TreeMap


Map基于红黑树的实现。所以所得的结果是经过排序的。


红黑树


为了排序,必须实现Comparable接口。

其他为解决特殊问题设计的Map还有IdentityHashMap,WeakHashMap,ConcurrentHashMap等。

实验证明,除了IdentityHashMap之外的其他所有Map,随着Map的尺寸变大,插入会明显变慢,但是查找的代价小很多。我猜测这是由于每次插入都要通过equals方法来确保键值的唯一性导致的,不过Map最常用的操作是查询操作,所以情况还比较乐观。

总结:

(1)要想让你的容器类型安全,需要使用泛型(否则编译器允许你向容器中插入各种不同类型,只要是Object即可);

(2)创建容器的时候尽量将其向上转型为接口,像这样:

List<Apple> apples = newArrayList<Apple>();

使用接口的目的在于当你决定修改你的实现的时候,只需要在创建的地方修改它就可以了。

(3)Java有大量的用于容器的卓越的方法,他们被封装到java.util.Collections类中,全部都是static方法。比如Collections类中有unmodifiableMap/List/Set()方法设置Collection和Map为不可修改,还有synchronizedCollection/List/Set/Map等方法同步整个容器。另外排序,填充,逆置,最大最小值等很多方法也可以找到。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-06 14:26:53

Java基础:容器的相关文章

Java基础-容器

容器 Collection 数据结构是复杂的,难以被初中级程序员用好,这与Java的设计理念相违背... Java作为一门高大上的语言,怎么会让我们失望呢~~ (Java设计理念:Java语言是一门面向应用的,而不是面向研究的语言--来自Java编程规范JavaSE8版) 于是,Java砖家们就针对数据结构进行了开发来让数据结构变得简单易用,然后Collection接口诞生了 我们可以用Collection接口存放无序的.不重复的数据 可是我们想要存储有序的数据啊~ 别担心,砖家们替我们搞定了,

java基础-容器简述

常用的容器有list.queue.set.map list有ArrayList.LinkedList,还有一个CopyOnWriteArrayList: queue有LinkedList.ArrayQueue.LinkedBlockingQueue.ConcurrentLinkedQueue: map有HashMap.TreeMap.ConcurrentHashMap.ConcurrentSkipListMap: set内部一般会使用map做存储,有HashSet.TreeSet.CopyOnW

Java基础复习笔记系列 六 容器

Java基础复习笔记系列之 容器 1. 2.

Java基础学习第五天——方法与数组

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.24 lutianfei none 第三章Java基础语法 方法 方法就是完成特定功能的代码块,即函数. 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2-) { 函数体; return 返回值; } 详细解释: 修饰符,目前就用public static,后详解. 返回值类型:就是功能结果的数据类型. 方法名:符合命名规则即可,方便我们的调用. 参数: 实际参数:就是实际参与运算的.

第2篇-JAVA基础

第2篇-JAVA基础 每篇一句 :无论处在任何领域中,即使是在小的事情,都要让每一天有所价值 初学心得: 在学习的过程中,错误是很宝贵的,它一笔"财富",更是一种"价值" (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-24 | JAVA基础] JAVA基础 回顾 在上一篇文章中,最后提到两个问题, 相信读者们已经提前超额完成了"任务" 下面跟着笔者的思路,深入掌握JAVA底层的运行机制 JAVA运行机制 (重中之重) JAV

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

JAVA基础知识整理 常用框架

JAVA反射---相关资料: 1.Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息 2.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值. 参考框架:Butterfly Persistence 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

java基础问题总结

1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并