资讯专栏INFORMATION COLUMN

java 编程思想 - Chapter11&Chapter17- 不同容器之间的比较

imtianx / 655人阅读

摘要:中所有方法都是直接或者间接同步的,所以是线程安全的即多个线程操作同一个对象时是线程安全的,但是只有一个线程操作时考虑到同步控制会耗费系统资源所以效率低。中的所有方法都是线程非同步的,但有多个线程操作时是不安全的。

虽是读书笔记,但是如转载请注明出处http://segmentfault.com/blog/exploring/
..拒绝伸手复制党

容器之间的区别通常归结为:由什么在背后“支持”它们,即,所使用的接口是由什么样的数据结构实现的。

# 对 List 的 选择:

ArrayList 和 LinkedList 基本的 List 操作是相同的。但是 ArrayList 底层是 数组实现的,LinkedList 是双向链表实现的(其中每个对象包含数据的同时还包含指向链表中前一个元素和后一个元素的应用)。
因此,如果经常在表中插入删除应该使用 LinkedList,如果大量随机访问元素,应该使用ArrayList.

最佳的做法可能是将 ArrayList 作为默认首选,只有你需要使用额外的功能,或者当程序的性能因为经常插入和删除变差的时候,才去选择LinkedList.

# 对 Set 的选择

Set 可以被实现为 TreeSet, HashSet, LinkedHashSet. 可以根据所需要的行为来选择不同的接口。

行为: HashSet 最常用,特别添加和查询元素的时候速度快;
LinkedHashSet 保持元素的插入顺序; 插入操作,LinkedHashSet 比HashSet 代价更高,这是由维护链表所带来额外开销造成的。
TreeSet 基于TreeMap,1. 生成一个维持元素处于排序状态的Set. 只有当需要一个排好序的 Set 时,才应该使用TreeSet. 因为其内部结构支持排序。 2. 用 TreeSet 迭代速度比 HashSet 速度快。

# 对 Map 的选择

除了 IdentityHashMap, 所有的Map实现插入和删除操作都会随着Map尺寸的变大而明显变慢。但是查找的代价要比插入小很多。

Hashtable 的性能大体上与 HashMap 相当,因为HashMap 是用来替代 Hashtable 的,因此他们使用了相同的底层和查找机制。使用 Map 时候,第一选择应该是hashmap.
LinkedHashMap 比 HashMap 慢, 代价更高,这是由维护散列结构的同时还要维护链表所带来额外开销造成的。
TreeMap 通常比 HashMap 慢。 与使用 TreeSet 一样,TreeMap 是一种创建有序列表的方式。
IdentityHashMap 具有完全不同的性能,因为它使用 == 而不是 equal() 来比较元素。

应该避免使用Vector,它只存在于支持遗留代码的类库中。

ArrayList 和 Vector 区别?
Vector 和 ArrayList 都是基于Object[] array 数组来实现的,根据索引来访问元素。二者最大的区别就是同步的使用。
Vector 中所有方法都是直接或者间接同步的,所以 Vector 是线程安全的(即多个线程操作同一个 vector 对象时是线程安全的),但是只有一个线程操作时考虑到同步控制会耗费系统资源所以效率低。
ArrayList 中的所有方法都是线程非同步的,但有多个线程操作时是不安全的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64239.html

相关文章

  • 第二十七章:SpringBoot使用ApplicationEvent&Listener完成业

    摘要:实体代码如下所示恒宇少年码云用户名密码创建内添加一个注册方法,该方法只是实现注册事件发布功能,代码如下所示恒宇少年码云用户注册方法省略其他逻辑发布事件事件发布是由对象管控的,我们发布事件前需要注入对象调用方法完成事件发布。 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之...

    Reducto 评论0 收藏0
  • Spring Boot 2.x基础教程:快速入门

    摘要:编写一个接口创建命名为根据实际情况修改创建类,内容如下启动主程序,使用等工具发起请求,可以看到页面返回编写单元测试用例打开的下的测试入口类。 简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让你更易上手,更简单快捷地构建Spring应...

    tigerZH 评论0 收藏0
  • 第三十章:SpringBoot使用MapStruct自动映射DTO

    摘要:商品类型实体恒宇少年码云商品基本信息实体恒宇少年码云接下来我们继续创建相关的。注解是用于标注接口抽象类是被自动映射的标识,只有存在该注解才会将内部的接口方法自动实现。 MapStruct是一种类型安全的bean映射类生成java注释处理器。我们要做的就是定义一个映射器接口,声明任何必需的映射方法。在编译的过程中,MapStruct会生成此接口的实现。该实现使用纯java方法调用的源和目...

    weakish 评论0 收藏0
  • 第二十八章:SpringBoot使用AutoConfiguration自定义Starter

    摘要:代码如下所示自定义业务实现恒宇少年码云消息内容是否显示消息内容,我们内的代码比较简单,根据属性参数进行返回格式化后的字符串。 在我们学习SpringBoot时都已经了解到starter是SpringBoot的核心组成部分,SpringBoot为我们提供了尽可能完善的封装,提供了一系列的自动化配置的starter插件,我们在使用spring-boot-starter-web时只需要在po...

    fasss 评论0 收藏0
  • 一起学并发编程 - 利用观察者模式监听线程状态

    摘要:在前面的文章中介绍过观察者模式及并发编程的基础知识,为了让大家更好的了解观察者模式故而特意写了这篇番外概述在多线程下我们需要知道当前执行线程的状态是什么比如运行,关闭,异常等状态的通知,而且不仅仅是更新当前页面。 在前面的文章中介绍过 观察者模式 及 并发编程的基础知识,为了让大家更好的了解观察者模式故而特意写了这篇番外.. 概述 在Java多线程下,我们需要知道当前执行线程的状态是...

    Juven 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<