当前位置: 首页 > 编程日记 > 正文

【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

转自:http://blog.csdn.net/paincupid/article/details/47746341

一、HashMap和TreeMap区别

1.HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。

TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。
2、HashMap、TreeMap都继承AbstractMap抽象类;TreeMap实现SortedMap接口,所以TreeMap是有序的!HashMap是无序的。
    接口层次:
    public interface SortedMap<K,V> extends Map<K,V>
    public interface NavigableMap<K,V> extends SortedMap<K,V>
    public class HashMap<K,V>     extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable
    public class HashMap<K,V>    extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable
3、两种常规Map性能
    HashMap:适用于在Map中插入、删除和定位元素。
    Treemap:适用于按自然顺序或自定义顺序遍历键(key)。    
4.总结:HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

二、HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

三、HashSet和HashMap的区别
    HashSet是基于HashMap实现的。
  
[java] view plain copy
  1. public class HashSet<E> extends AbstractSet<E>  implements Set<E>, Cloneable, java.io.Serializable  
  2. {  
  3.     static final long serialVersionUID = -5024744406713321676L;  
  4.   
  5.     private transient HashMap<E,Object> map;  
  6.   
  7.     private static final Object PRESENT = new Object();  
  8.   
  9.     public HashSet() {  
  10.         map = new HashMap<>();  
  11.     }  
  12.     public HashSet(Collection<? extends E> c) {  
  13.         map = new HashMap<>(Math.max((int) (c.size()/.75f) + 116));  
  14.         addAll(c);  
  15.     }  
  16.     public boolean add(E e) {  
  17.         return map.put(e, PRESENT)==null;  
  18.     }  
  19.     public boolean remove(Object o) {  
  20.         return map.remove(o)==PRESENT;  
  21.     }  
  22.     .......  
  23. }  


    
HashMapHashSet
HashMap实现了Map接口HashSet实现了Set接口
HashMap储存键值对HashSet仅仅存储对象
使用put()方法将元素放入map中使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap

相关文章:

ASP.NET实现数据图表

作者&#xff1a;马金虎 来自&#xff1a;yesky 在ASP中插入图表&#xff0c;常用的方法是使用MSChart控件。那么在ASP.NET是否也是这样呢?答案是不可以的。 我们知道ASP.NET是一种编译语言&#xff0c;当客户端第一次调用ASP.NET页面的时候&#xff0c;其实是经过了一种…

Struts2基础(1)_MVC

2019独角兽企业重金招聘Python工程师标准>>> Struts2是有传统的Struts1和WebWork两个经典MVC框架发展起来&#xff0c;无论从Struts2的设计角度或则实际项目中的易用性来开&#xff0c;它都是一个非常优秀的MVC框架。 MVC的理解&#xff1a;MVC思想将应用中各组件按…

我发现了个Python黑魔法,执行任意代码都会自动念上一段「平安经」

来源 | Python编程时光最近的"平安经"可谓是引起了不小的风波啊。作为一个正儿八经的程序员&#xff0c;最害怕的就是自己的代码上线出现各种各样的 BUG。为此&#xff0c;明哥今天分享一个 Python 的黑魔法&#xff0c;教你如何在你执行任意 Python 代码前&#xff…

Java第一天学习笔记整理

一、关键字 java的关键字对java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量名、方法名、类名、包名。 常见的关键字&#xff1a; 用于定义数据类型的关键字 class interface byte short int lon…

ASP.NET中树形图的实现

来自&#xff1a;DotNET中文技术网 树形图用于显示按照树形结构进行组织的数据&#xff0c;其用途比较广泛&#xff0c;如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView…

同步你的手机联系人

从web1.0到2.0,我们进入了一个新的互联网时代移动时代.相信你的手机中,有许多联系人信息,你肯定不想把他们弄丢吧,像我之前隔一段时间就备份下,存到电脑中.现在再也不怕联系人信息丢了,只需要一个账户,同步一下,所有联系人信息都回来了.我是在Android智能手机上操作的,IOS就不清…

AI 技术发展飞快,高校 AI 教师的知识储备能满足学生旺盛的求知欲吗?

2019 年&#xff0c;AI 技术以惊人的速度发展&#xff1b;2020 年&#xff0c;AI 技术成熟的时机已经到来&#xff0c;随之而来的&#xff0c;是越来越旺盛的 AI 人才需求。近日&#xff0c;国家正式发布了一份《2020 年人工智能产业人才发展报告》显示&#xff0c;2020 年人工…

Windows Server 2008 R2安装子域控制器

一、实验网络拓扑图&#xff1a; 二、实验说明&#xff1a; 子域控制器安装前需要先把主域控制器安装好&#xff0c;然后子域控制器的DNS先指向主域控制器的IP地址 192.168.10.30&#xff0c;主域控制器委派DNS给子域控制器后再把子域控制器DNS指向自己的IP地址 192.168.10.31即…

使用嵌套的Repeater控件显示分级数据

作者&#xff1a;wincheer 来自&#xff1a;Asp.Net中文专业网 简介 本文描述如何使用嵌套的Repeater 控件来显示分级数据 。当然了&#xff0c;你也可以将这一技术应用到其他的列表绑定控件上去&#xff0c;比如DataGrid包含DataGrid&#xff0c;DataList包含DataList等等…

我还没考试,算法就说我的物理一定挂科

来源 | HyperAI超神经责编 | Carol封图 | CSDN 下载自视觉中国大学物理是理工科学生的基础必修课程&#xff0c;但也因为有一定的难度&#xff0c;令很多学生望而生畏。研究人员提出了用 AI 算法预测&#xff0c;哪些学生物理课有挂科风险&#xff0c;好让老师更好地进行教学指…

Dorado7功能及技术特点

简介 Dorado PresentationMiddleware&#xff08;即Dorado展现中间件&#xff0c;以下简称Dorado&#xff09;致力于辅助Web应用中表现层的开发过程。Dorado主要可以为您带来如下两方面的使用价值&#xff1a; 更加美观、更加人性化的Web操作界面。更加高效的表现层开发…

ELK日志分析平台搭建全过程

一、使用背景 当生产环境有很多服务器、很多业务模块的日志需要每时每刻查看时 二、环境 系统&#xff1a;centos 6.5 JDK&#xff1a;1.8 Elasticsearch-5.0.0 Logstash-5.0.0 kibana-5.0.0 三、安装 1、安装JDK 下载JDK&#xff1a;http://www.oracle.com/technetwork/java/j…

Android中Handler

本文通过例子来验证和说明使用Handler对象开启的线程是否和主线程为在同一线程中。 程序结构图如下&#xff1a; [1] HandlerActivity.java中的源码如下&#xff1a; [html] view plaincopyprint?package com.andyidea.handlerdemo2; import android.app.Activity; import…

刚出炉!程序员人才补贴:单项目最高补贴1000万元

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

ASP.NET中在线用户统计

天极论坛 统计在线用户的作用不言而喻&#xff0c;就是为了网站管理者可以知道当前用户的多少&#xff0c;然后根据用户数量来观察服务器或者程序的性能&#xff0c;从而可以直观的了解到网站的吸引力或者网站程序的效率。现在&#xff0c;我们就介绍一个简单明了的方法来统计…

数(Number)

--读《自然数原本&#xff1a;数数论》&#xff08;薛海明&#xff0c;山西科学技术出版社&#xff09;和《数论概论》&#xff08;[美]Joseph H.Silverman&#xff0c;机械工业出版社&#xff09;笔记 人们对于数的认识从数数&#xff08;counting&#xff09;开始&#xff0c…

linux 中root用户与普通用户的切换

su是在用户间切换&#xff0c;可以是从普通用户切换到root用户&#xff0c;也可以是从root用户切换到普通用户。 如果当前是root用户&#xff0c;那么切换成普通用户test用以下命令&#xff1a;su test或su - test 如果要切换回root用户或普通用户切换至root用户&#xff0c;用…

2个月做出一款AI项目?这些学生在DeeCamp上决出两个总冠军

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2个月&#xff0c;一群来自世界各地高校的学生做出了技术与商业化兼具的AI落地项目。8月5日&#xff0c;DeeCamp 2020人工智能训练营迎来总冠军答辩暨结营典礼。最终&#xff0c;自动驾驶赛道和创新赛道的两支团队夺得…

C语言宏定义技巧

C语言宏定义技巧&#xff08;常用宏定义&#xff09; 写好C语言&#xff0c;漂亮的宏定义很重要&#xff0c;使用宏定义可以防止出错&#xff0c;提高可移植性&#xff0c;可读性&#xff0c;方便性等等。下面列举一些成熟软件中常用得宏定义。 1、防止一个头文件被重复包含 …

了解C++默默编写并调用哪些函数

在C中&#xff0c;如果你写下 1 classEmpty{…}; 就相当于写下1 classEmpty{ 2 public: 3 Empty();//default构造函数 4 Empty(constEmpty& rhs){……};//copy构造函数 5 ~Empty(){…}//析构函数 6 Empty&operator(constEmpty& rhs){…};//copy赋值运算符 7 }; 惟有…

仅50张图片训练数据的AI分类技术PK​,阿里拿下ECCV 2020竞赛冠军

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;两年一度的世界计算机视觉领域顶会ECCV 2020的各项挑战赛结果出炉&#xff0c;在图像分类赛中&#xff0c;阿里安全的高效AI分类技术超越三星、深兰科技、同济大学等国内外多支队伍的同类技术获得冠军…

Eclipse生成jar文件

2019独角兽企业重金招聘Python工程师标准>>> 具体做法如下&#xff1a; 方法一&#xff1a;(工程没有引用外部jar包时&#xff0c;直接导出) 选中工程---->右键&#xff0c;Export...--->Java--->JAR file--->next-->选择jar file的路径及名称-->…

动态的管理ASP.NET DataGrid数据列

动网先锋 在ASP.NET的DataGrid数据显示控件编程中&#xff0c;我们有几种方式可以增加DataGrid columns。其中最常见的方法是在web forms设计器中增加&#xff0c;通过在控件工具箱中拖访DataGrid控件到web设计页面&#xff0c;然后在属性生成器中增加Columns列;还有一种方式就…

Django模型层Meta内部类详解

Django 模型类的Meta是一个内部类&#xff0c;它用于定义一些Django模型类的行为特性。以下对此作一总结&#xff1a; abstract这个属性是定义当前的模型类是不是一个抽象类。所谓抽象类是不会对应数据库表的。一般我们用它来归纳一些公共属性字段&#xff0c;然后继承它的子类…

ASP.NET虚拟主机的重大安全隐患

作者&#xff1a;秦海鹏 来自&#xff1a; yesky 说明&#xff1a;本文中所有程序均在Windows 2000 Server中文版 SP2上编译运行无误开发环境&#xff1a;.Net 框架1.0 Version 1.0.3705 一、ASP.NET虚拟主机存在的重大隐患 我曾经在WWW.BRINKSTER.COM申请了一个免费的…

给力!一行代码躺赚普通程序员10年薪资!

笔者这两天闲逛知乎&#xff0c;看到了这个帖子&#xff1a;匿名答题&#xff0c;发表于2014年&#xff0c;此外没有留下任何多余信息。2年躺赚200万&#xff0c;相当于普通程序员10年的工资。没想到Pyhon这么强大&#xff0c;怪不得有人说“除了不会生孩子&#xff0c;Python什…

Hello world!

2019独角兽企业重金招聘Python工程师标准>>> 向世界打招呼&#xff0c;大家好&#xff0c;这是我的第一篇文章&#xff0c;我准备在这里开博&#xff01; 转载于:https://my.oschina.net/chinesedragon/blog/57259

在VMware Workstation上安装Ubuntu 16.04 Server操作系统

Ubuntu 16.04 Server的下载 http://www.ubuntu.org.cn/download/server 按空格键&#xff08;Space&#xff09;选中第一个ssh服务 成功&#xff01;

ASP.NET中WebForm组件CheckBoxList编程

作者&#xff1a;马金虎 来自&#xff1a;yesky CheckBox选择组件是一个程序中都经常的组件。在程序设计中使用到该组件&#xff0c;一般都不会只使用到一个&#xff0c;往往是以多个此类组件的形式出现的。在ASP.NET页面中如果要使用到多个CheckBox组件&#xff0c;除了添加…

今晚 8 点直播 | OpenCV 20 年,首款开源软硬一体的 OAK 套件来了!

从 2000 年首个开源 OpenCV Alpha 版本&#xff0c;到不久前刚刚发布的 OpenCV 4.4&#xff0c;跨平台计算机视觉库 OpenCV 在不知不觉间已经走过了 20 个年头。相信不少 IT、AI 的从业者几乎都使用过。据 CSDN 发布的《中国AI应用开发者报告2020》显示&#xff0c;作为计算机视…