热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java集合框架篇Collection—Map&HashMap&TreeMap

MapHashMapMap.EntryHashMap&HashTableTreeMap

  • Map
    • HashMap
    • Map.Entry
    • HashMap&HashTable
    • TreeMap

Map
  • Map K-Key ,V -Value
  • Set的底层其实就是Map(Map在英语里是地图就是一一对应的意思)

  • public interface Map将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

   此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。 
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集
的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的
collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,
如 TreeMap 类;另一些映射实现则不保证顺序,如HashMap 类。
注:将可变对象用作映射键时必须格外小心。
当对象是映射中某个键时,如果以影响 equals
比较的方式更改了对象的值,则映射的行为将是不确定的。
此项禁止的一种特殊情况是不允许某个映射将自身作为一个键包含。
虽然允许某个映射将自身作为值包含,但请格外小心:在这样的映射上
equals 和 hashCode 方法的定义将不再是明确的。

HashMap

  • Class HashMap
  • 从名字我们就可以得知它的底层数据结构是Hash表(Hash表的实质是数组+链表)
  • Hash表?、Hash算法?
  • HashMap实现原理分析
  • HashMap 是我们在程序中用的很多的一个类,我们常说它是一个无序的容器那么这个无序到底是什么意思呢?
  • 无序、有序?
    意思就是说它是存取无序的(注意不是随机),存储是有序的。它每次输出的顺序是一样的这个是Hash算法决定的。
import java.util.*;
class MapDemo{
public static void main(String[] args){
Map m = new HashMap();
print("put:"+m.put("01","w111"));
print("put:"+m.put("01","w112"));
//会返回这个键对应的原来的值并覆盖

m.put("02","w2");
m.put("03","w3");
m.put(null,"w3");
m.put("04",null);

print(m.containsKey("01"));
print(m.get(null));
print(m.get("04"));
print(m.values());

}

public static void print(Object obj){
System.out.println(obj);
}
}
  • 它有两个重要的方法 entrySet() KeySet() 会返回Set集合
  • entrySet:public Set> entrySet()
  • keySet:public Set keySet()

Map.Entry

  • public static interface Map.Entry映射项(键-值对)。
  • 可以看见Map.Entry接口有静态修饰符。从接口的概念上来讲,接口只能由抽象方法和全局常量组成,但是内部结构是不受概念限制的,正如抽象类中可以定义抽象内部类一样,在接口中也可以定义普通内部类、抽象内部类和内部接口
  • Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。

存储数据关系

  • 举一个一对多的例子
/*一对多 Map> 、 Map>*/

import java.util.*;

class MapTest{
public static void main(String[] args){
Map> school = new HashMap>();
Map class01 = new HashMap();
Map class02 = new HashMap();

school.put("class01",class01);
school.put("class02",class02);

class01.put("xiaoa",01);
class01.put("xiaob",02);
class02.put("xiaoc",01);
class02.put("xiaod",02);

getClassInfo(school);

}

public static void getClassInfo(Map> school){
// Set keySet = school.keySet();
for (Iterator it = school.keySet().iterator();it.hasNext() ; ) {
Map cls = school.get(it.next());
// for(Iterator clit = cls.keySet().iterator();clit.hasNext();){
// System.out.println(cls.get(clit.next()));
// }

Set.Entry> clsme = cls.entrySet();
for (Iterator.Entry> cli = clsme.iterator();cli.hasNext() ; ) {
Map.Entry me = cli.next();
System.out.println(me.getKey()+"::"+me.getValue());

}
}
}
}

HashMap&HashTable

  • HashTable 不允许null
  • HashMap 运行null键和null值
  • HashTable 同步
  • HashMap 不同步

TreeMap

  • public class TreeMap
  • 基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
//统计字符出现次数

import java.util.*;

class TreeMapTest2{
public static void main(String[] args){
String str = "asdfkcv43_gergxzkzsdaa";
char[] chs = str.toCharArray();
//Character 实现了自然排序 Comparable
TreeMap tm = new TreeMap();

for (int x=0;x if(!(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
tm.put(chs[x],value==null?1:++value);
}

StringBuilder sb = new StringBuilder();

Set> entrySet = tm.entrySet();
for (Iterator> it = entrySet.iterator();it.hasNext() ; ) {
Map.Entry me= it.next();
sb.append(me.getKey()+"("+me.getValue()+")");
}

System.out.println(sb);
}
}

推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
紫色咖啡调
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有