`
逆光
  • 浏览: 627 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java。Map 使用注意细节

阅读更多
当我们向一个set、HashMap、HashSet、HashTable集合中添加某个元素,集合会首先调用该对象的hashCode方法,
这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。
若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置(即,重新根据hash后的值,再hash值,类似执行一个递归)


Treemap key值按照顺序排列,hashmap的key存储位置由hashcode决定,所以无序。


当hashmap需要并发访问时:
Map m = Collections.synchronizedMap(new HashMap(…));


同时要注意hashMap使用的性能相关小细节

public static void main(String[] args) {
		Map<Integer,Object> map = new HashMap<>();
		Date d = new Date();
		for (int i = 0; i < 10000000; i++) {
			map.put(i, null); 
		}
		Date d1 = new Date();
		System.out.println(d1.getTime()-d.getTime());

		Map<Integer,Object> map1 = new HashMap<>(10000000); 
		for (int i = 0; i < 10000000; i++) {
			map1.put(i, null); 
		}
		Date d2 = new Date();
		System.out.println(d2.getTime()-d1.getTime()); 
	}


HashMap 使用时,如果不提前提供初始容量,那么每次超过容量,自动扩容时,由于key值根据hash值来确定,所以导致需要对key值进行rehash操作。导致大量的内存消耗,所以建议使用hashmap时,对初始容量进行正确的设置



运行结果:
5897
2694



综合一下map的使用

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.

HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。

HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。


并发编程时,多使用copyonwritearraylist  concurrenthashmap 优化多线程读写
性能要求时,使用weakhashmap 会自动gc的map
分享到:
评论

相关推荐

    map.toString()后转换成Map类型

    在Java编程中,有时我们需要将一个`Map`对象转换为字符串形式进行存储或传输,而在接收端又需要将该字符串重新转换回`Map`对象以便进一步处理。本篇将详细介绍如何通过特定的方法实现这一过程,并深入分析其实现细节...

    MAP<---&gt;XML格式互相转换接口,已封装,可直接使用(java版)

    标题提到的"MAP&lt;---&gt;XML格式互相转换接口,已封装,可直接使用(java版)"正是这样一个工具,它提供了一个便捷的方式来在Java中进行这种转换。 Map是Java中的一个核心接口,它存储键值对数据,而XML(eXtensible ...

    JavaScript实现Java中Map容器的方法

    在介绍JavaScript实现Java中Map容器方法之前,我们先要了解Map在Java和JavaScript中的概念和...对于更复杂的场景,可能需要使用ES6引入的Map和Set数据结构,或者引入第三方库来获得更接近Java Map容器的行为和性能。

    Java API.tar JAVA AP学习JAVA必备手册

    在"Java API.tar"压缩文件中,可能包含了详细的API文档,这些文档通常以HTML格式呈现,提供每个类、接口、方法的详细描述、示例代码和使用注意事项。通过阅读和查阅这些文档,开发者可以深入理解Java API的每一个...

    Map、Set、Iterator迭代详解

    ### Map接口详解 #### 1. Map接口概览 ...通过以上对`Map`、`Set`、`Iterator`以及Java集合框架的详细介绍,我们不仅可以了解到这些接口和类的基本概念和使用方法,还能深入理解它们在实际编程中的应用价值。

    POJO转Map.txt

    2. **安全性考虑**:由于使用了反射,可能会暴露出类的内部细节,需要注意权限控制和安全性。 3. **兼容性问题**:不同的POJO结构可能会导致转换失败,需要确保所有属性都有对应的getter方法。 4. **扩展性考虑**:...

    Treasure Map Deadhand

    使用.ttf文件,用户可以在自己的设计软件中轻松安装并应用这款字体,从而在他们的创作中实现《Treasure Map Deadhand》的独特风格。 在设计应用中,考虑到《Treasure Map Deadhand》的海盗主题,它可以与航海、冒险...

    Activity 间intent传递有序排序的map集合

    需要注意的是,尽管LinkedHashMap保证了顺序,但当序列化并跨进程传递时,顺序可能因系统或实现细节而略有不同。此外,由于Parcelable接口通常比Serializable更高效,如果你需要在大量数据传递时优化性能,可以考虑...

    提高java代码性能各种技巧

    字符串池可以使用自己定义的 Map, String&gt; 或者使用 JDK 提供的 String.intern() 方法实现。 Java 6 中的字符串池 在 Java 6 中,字符串池是存储在 PermGen 中的固定的内存区域中。PermGen 的大小是固定的,无法...

    java 集合

    关于源码,Java集合框架的实现类通常包含了许多内部细节,比如数据结构的优化、线程安全的考虑等。例如,`ArrayList`底层使用的是动态增长的数组,而`LinkedList`则由双向链表构成,它们在插入和删除操作上的性能...

    map-dao是数据库接口包

    1. **基于Map的数据映射**:map-dao将数据库表的字段映射到Java中的Map对象,使得数据操作更加灵活。开发者无需手动创建大量的实体类,减少了代码量,提高了开发效率。 2. **简单易用的API**:map-dao提供了简单的...

    使用Java-freemarker生成word文档.doc

    本篇文章将详细讲解如何使用Java-Freemarker来生成Word文档。 首先,我们需要理解基本的工作流程: 1. **创建Word模板**:在Microsoft Word中设计好文档模板,包括所需的格式、样式和内容,这些内容将被实际数据...

    Java C# 语法 比较

    - Java程序的执行入口是`main`方法,C#则为`Main`方法,注意C#中的`Main`方法可以是静态的也可以不是。 2. 部署应用程序 - Java应用程序可通过JAR文件部署,Java Applet已经过时且不安全,不建议使用。 ***应用...

    Java调用存储过程--传入集合参数

    通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...

    java代码细节总结1.0版本.7z

    - 控制流:`if`, `for`, `while`语句,以及`switch`语句的使用和注意事项。 - 函数和方法:定义、调用、参数传递(传值与传引用)。 2. **面向对象** - 类与对象:类是对象的蓝图,对象是类的实例。 - 封装:...

    java避免内存泄露

    Java中的内存管理虽然相对自动化,但仍需开发者关注细节,避免不必要的内存泄露。通过显式地释放资源、使用弱引用来管理对象引用等手段,可以有效地预防内存泄露问题,提高程序的稳定性和性能。 #### 六、参考资料 ...

    达内JAVA培训综合笔记

    这部分最后提及了Java系统API方法的调用、二进制基础和Java基础其他注意事项。 三、面向对象 面向对象是Java编程的核心思想,笔记中对类、对象、包、方法及其调用、引用、访问控制、构造器、继承、接口等概念都进行...

    java全集.pdf JAVA全集

    **14.6 使用互斥锁的注意事项** - 死锁问题:多个线程互相等待对方释放锁导致无法继续执行。 #### 十四、标准I/O流与文件 **15.1 对文件的操作** - 文件读写操作通常使用File类和相关的流类。 **15.2 处理跨...

    Java调用批处理示例

    ### Java调用批处理知识点详解 #### 一、概述 ...但是,在实际应用中还需要注意各种细节问题,比如异常处理、命令格式的选择等,以确保程序的稳定性和安全性。此外,还可以通过更高级的用法来满足不同的需求。

    java笔记以及初学者应注意的地方

    Java编程语言是软件开发领域最广泛使用的编程语言之一,尤其对于初学者来说,它提供了丰富的资源和支持。这篇笔记将引导你逐步了解Java的基础知识,并强调初学者在学习过程中需要注意的关键点。 1. **Java简介** ...

Global site tag (gtag.js) - Google Analytics