Java集合之Map接口

Wesley13
• 阅读 541

Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap

  1)HashMap

  基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒久不变。它除了非同步和允许使用null外,与Hashtable大致相同。

  HashMap实现原理:

  1.HashMap默认数组大小为16,加载因子为0.75,当数组使用量达到数组长度*加载因子时,需要进行扩充。

  2.HashMap是以数组为头,连接链表形成的(要计算key的hashcode值),根据散列值求出对象在哈希表的存储位置,相同位置上的多个数据以链表方式连接,每次先加入的对象放进链表头。

  Java集合之Map接口

  示例代码:

  Java代码

  1. publicstaticvoidmain(String[] args){

  2. Map<Integer, String>maps=newHashMap<Integer, String>();

  3. maps.put(1,"小黑");

  4. maps.put(2,"小白");

  5. maps.put(null,null);

  6. maps.put(10, "老王");

  7. System.out.println("size: "+maps.size());

  8. //根据key获取对象值

  9. System.out.println(maps.get(10));

  10. //是否存在此键

  11. System.out.println(maps.containsKey(2));

  12. //是否存在此值

  13. System.out.println(maps.containsValue(null));

  14. //遍历

  15. Set<Entry<Integer,String>>entry=maps.entrySet();

  16. Iterator<Entry<Integer,String>>iter=entry.iterator();

  17. while(iter.hasNext())

  18. {

  19. System.out.println(iter.next());

  20. }

  21. //清除map

  22. maps.clear();

  23. }

  HashMap是线程不安全的,非同步的,当需要重新散列时,数组扩大为原来的两倍,将会把所有数据重新进行插入,此时可能会破换原来的顺序,所有HashMap不能保证映射顺序。HaspMap的重新散列会影响性能。

  2)Hashtable

  此类实现了哈希表,该哈希表将键映射到相对应的值。任何非null都可以用作键或值,为了成功的在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法。

  用法基本和HashMap相同,不过多介绍

  HashMap和Hashtable的区别

  1.HashMap可以使用null作为键或值,Hashtable不可以

  2.HashMap是非同步的,线程不安全,而Hashtable是同步的,线程安全

  3.Hashtable的默认容量为11,而HashM的默认容量为16。

  3)TreeMap

  基于红黑树显示的,该映射根据其键的自然排序进行排序,或者根据创建映射时提供的Comparator进行排序。所以,TreeMap使用自定义类作为key时要实现Comparable接口。

  如:

  自定义Person类,实现Comparable接口。使用age属性进行排序

  Java代码

  1. publicclassPerson implementsComparable{

  2. publicString name;

  3. publicintage;

  4. publicPerson(String name,intage)

  5. {

  6. this.name=name;

  7. this.age=age;

  8. }

  9. publicintcompareTo(Person o) {

  10. if(o==null)

  11. thrownewNullPointerException();

  12. if(this.age>o.age)

  13. return1;

  14. if(this.age<o.age)

  15. return-1;

  16. return0;

  17. }

  18. @Override

  19. publicString toString() {

  20. return"Person [name="+ name + ", age="+ age + "]";

  21. }

  22. }

  调用代码:

  Java代码

  1. publicstaticvoidmain(String[] args){

  2. Map<Integer, String>maps=newTreeMap<Integer, String>();

  3. maps.put(1,"小黑");

  4. maps.put(2,"小白");

  5. maps.put(10, "老王");

  6. //遍历

  7. Set<Entry<Integer,String>>entry=maps.entrySet();

  8. Iterator<Entry<Integer,String>>iter=entry.iterator();

  9. while(iter.hasNext())

  10. {

  11. System.out.println(iter.next());

  12. }

  13. //清除map

  14. maps.clear();

  15. //-----------------------------使用自定义Person做key

  16. Map<Person, String>map=newTreeMap<Person, String>();

  17. map.put(newPerson("xiaobai", 20), "xiaobai");

  18. map.put(newPerson("xiaohei", 18), "xiaohei");

  19. map.put(newPerson("xiaohong", 30), "xiaohong");

  20. //遍历

  21. Set<Entry<Person,String>>entry1=map.entrySet();

  22. Iterator<Entry<Person,String>>iter1=entry1.iterator();

  23. while(iter1.hasNext())

  24. {

  25. System.out.println(iter1.next());

  26. }

  27. //清除map

  28. map.clear();

  29. }

  运行结果:

  Java集合之Map接口

技术分享: www.kaige123.com

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Wesley13 Wesley13
2年前
java中map接口hashMap以及Enty之间的用法和关系
java中map接口hashMap以及Enty之间的转换首先说的是map接口:Map提供了一种映射关系,其中的元素是以键值对(keyvalue)的形式存储的,能够实现根据key快速查找value;建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。Ma
Stella981 Stella981
2年前
HashMap的实现原理
HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap的数据结构在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数
Stella981 Stella981
2年前
HashMap1.7和1.8,红黑树原理!
jdk1.7概述HashMap基于Map接口实现,元素以键值对的方式存储,并允许使用null键和null值,但只能有一个键作为null,因为key不允许重复,另外HashMap不能保证放入元素的数据,它是无序的,和放入的顺序并不能相同,HashMap是线程不安全的。继承关系publicclassH
Wesley13 Wesley13
2年前
Java中的Map集合
Map接口简介Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value,Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖。Map常用
Stella981 Stella981
2年前
HashMap 的底层实现原理
HashMap是一个用于存储KeyValue键值对的集合,每一个键值对也叫做Entry。这些个Entry分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。 !(https://oscimg.oschina.net/oscnet/8495d30fe00a2865dd74088d2
Wesley13 Wesley13
2年前
Java集合,HashMap底层实现和原理(1.7数组+链表与1.8+的数组+链表+红黑树)
概述文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明。HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究