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

JAVAMap集合详解

     特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。      Map集合和Set集合很像,其实Set集合底层就是使用了Map

       特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。

       Map集合和Set集合很像,其实Set集合底层就是使用了Map集合。

什么时候使用Map集合:

    数据之间存在映射关系时,优先考虑Map集合。

Map集合常用共有方法

1.添加

V put(K key, V value):将指定的值与此映射中的指定键关联,添加键值对。

void putAll(Map m):从指定映射中将所有映射关系复制到此映射中,批量添加键值对。

2.删除

void clear():从此映射中移除所有映射关系,清空所有键值对。

V remove(Object key):如果存在一个键的映射关系,则将其从此映射中移除,删除单个键值对。

3.判断

boolean containsKey(Object key):如果此映射包含指定键的映射关系(是否包含该键),则返回 true。

boolean containsValue(Object value):如果此映射将一个或多个键映射到指定值(是否包含该值),则返回 true。

boolean isEmpty():如果此映射未包含键-值映射关系,该map集合为空,则返回 true。

4.获取

V get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。

int size():返回此映射中的键-值映射关系(键值对)数。

Collection values():返回此映射中包含的值的 Collection 视图(集合)。

重点取出方式:

Set keySet():返回此映射中包含的键的 Set 视图(集合)。

Set> entrySet():返回此映射中包含的映射关系的 Set 视图(集合)。

练习

class MapDemo{
public static void main(String[] args){
Map map=new HashMap();

// 添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值。
// put方法会返回被覆盖的值。
System.out.println("put:"+map.put("01","zhangsan1"));
System.out.println("put:"+map.put("01","wangwu"));
map.put("02","zhangsan2");
map.put("03","zhangsan3");

System.out.println("containsKey:"+map.containsKey("022"));
System.out.println("remove:"+map.remove("02"));

System.out.println("get:"+map.get("023"));

map.put("04",null); // 一般值不要存储null,没有意义
System.out.println("get:"+map.get("04"));
// 可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断

// 获取map集合中所有的值
Collection coll=map.values();

System.out.println(coll);
System.out.println(map);

}
}

Hashtable

底层是哈希表数据结构

特点:不可以存入null键null值,该集合是线程同步的,JDK1.0出现,效率低。

HashMap

底层是哈希表数据结构

特点:允许使用null值和null键,该集合是线程不同步的,JDK1.2出现,效率高。

Map集合的两种取出方式

Map集合的取出原理:将Map集合转成Set集合,再通过迭代器取出。

  1. Set keySet():

将Map集合中所有的键存入到Set集合。因为Set集合具备迭代器,所以可以通过迭代方法取出所有的键,再根据get()方法,获取每一个键对应的值。

《JAVA--Map集合详解》

      2.Set> entrySet():

将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型就是:Map.Entry。

   Map.Entry:其实Entry也是一个接口,它是Map接口中的一个内部接口。 

interface Map{
public static interface Entry{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map{
class Hahs implements Map.Entry{
public Object getKey(){};
public Object getValue(){};
}
}

《JAVA--Map集合详解》

案例 

import java.util.*;
class MapDemo2{
public static void main(String[] args){
Map map=new HashMap();

map.put("02","zhangsan2");
map.put("03","zhangsan3");
map.put("01","zhangsan1");
map.put("04","zhangsan4");

/*// 方法一:通过keySet()获取Map集合元素
// 先获取Map集合的所有键的Set集合,通过keySet()方法获取到
Set keySet=map.keySet();

// 有了键的Set集合,就可以获取其迭代器
Iterator it=keySet.iterator();
while(it.hasNext()){
String key=it.next();
// 有了键可以通过Map集合的get()方法获取其对应的值
String value=map.get(key);
System.out.println("Key:"+key+",value:"+value);
}*/

// 方法二:通过entrySet()获取Map集合元素
// 先获取Map集合中的映射关系的Set集合,通过entrySet()方法获取到
Set> entrySet=map.entrySet();

// 有了键的Set集合,就可以获取其迭代器
Iterator> it=entrySet.iterator();
while(it.hasNext()){
Map.Entry me=it.next();
// 有了映射关系可以通过映射关系的getKey()和getValue()方法获取其对应的键值
String key=me.getKey();
String value=me.getValue();
System.out.println("Key:"+key+",value:"+value);
}

}
}

练习

import java.util.*;
/*
目标:
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。
思路:
1.描述学生;
2.定义Map容器。将学生(唯一性)作为键,地址作为值,存入;
3.获取Map集合中的元素。
*/
class MapTest{
public static void main(String[] args){
Map map=new HashMap();

map.put(new Student("lisi1",21),"beijing");
map.put(new Student("lisi1",21),"tainjin");
map.put(new Student("lisi2",22),"shanghai");
map.put(new Student("lisi3",23),"nanjing");
map.put(new Student("lisi4",24),"jinan");

// 第一种取出方式keySet
Set keySet=map.keySet();

Iterator it=keySet.iterator();
while(it.hasNext()){
Student stu=it.next();
String addr=map.get(stu);
sop(stu+"..."+addr);
}

// 第二种取出方式entrySet
Set> entrySet=map.entrySet();

Iterator> it2=entrySet.iterator();
while(it2.hasNext()){
Map.Entry me=it2.next();
Student stu=me.getKey();
String addr=me.getValue();
sop(stu+"......"+addr);
}

}

// 打印语句
public static void sop(Object obj){
System.out.println(obj);
}
}
// 学生类,保证学生的唯一性
class Student implements Comparable{
private String name;
private int age;

public Student(String name,int age){
this.name=name;
this.age=age;
}

// 防止该对象往二叉树数据类型集合中存储报异常,应使该对象具备可比性
public int compareTo(Student s){
int num=new Integer(this.age).compareTo(new Integer(s.age));

if(num==0)
return this.name.compareTo(s.name);

return num;
}

// 保证学生的唯一性
public int hashCode(){
return this.name.hashCode()+age*35;
}

public boolean equals(Object obj){

if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配!");

Student s=(Student)obj;

return this.name.equals(s.name) && this.age==s.age;
}

public String getName(){
return name;
}

public int getAge(){
return age;
}

public String toString(){
return name+":"+age;
}
}

TreeMap

底层是二叉树(红黑树)数据结构

特点:线程不同步,可以同时给Map集合中的键进行排序。

案例

import java.util.*;
/*
目标:
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。
并且对学生对象大的年龄进行升序排序。
思路:
因为数据是以键值对形式存在的,
所以要使用可以排序的Map集合:TreeMap。
1.描述学生;
2.定义Map容器。将学生(唯一性)作为键,地址作为值,存入;
3.获取Map集合中的元素。
*/
class MapTest2{
public static void main(String[] args){
TreeMap tm=new TreeMap(new StuNameComparator());

tm.put(new Student("lisi1",21),"beijing");
tm.put(new Student("blisi3",23),"nanjing");
// tm.put(new Student("lisi1",21),"tainjin");
tm.put(new Student("alisi4",24),"jinan");
tm.put(new Student("lisi2",22),"shanghai");

Set> entrySet=tm.entrySet();

Iterator> it=entrySet.iterator();
while(it.hasNext()){
Map.Entry me=it.next();
Student stu=me.getKey();
String addr=me.getValue();
sop(stu+"......"+addr);
}
}
// 打印语句
public static void sop(Object obj){
System.out.println(obj);
}
}
// 按照学生姓名排序,当对象本身具有比较性,但还需另一种比较,
// 可以定义比较器,在集合初始化时传入比较器,当有两种比较方式时默认按照比较器方法排序
class StuNameComparator implements Comparator{
public int compare(Student s1,Student s2){
int num =s1.getName().compareTo(s2.getName());

if(num==0)
return new Integer(s1.getAge()).compareTo(s2.getAge());

return num;
}
}
// 学生类,保证学生的唯一性
class Student implements Comparable{
private String name;
private int age;

public Student(String name,int age){
this.name=name;
this.age=age;
}

// 防止该对象往二叉树数据类型集合中存储报异常,应使该对象具备可比性
public int compareTo(Student s){
int num=new Integer(this.age).compareTo(new Integer(s.age));

if(num==0)
return this.name.compareTo(s.name);

return num;
}

// 保证学生的唯一性
public int hashCode(){
return this.name.hashCode()+age*35;
}

public boolean equals(Object obj){

if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配!");

Student s=(Student)obj;

return this.name.equals(s.name) && this.age==s.age;
}

public String getName(){
return name;
}

public int getAge(){
return age;
}

public String toString(){
return name+":"+age;
}
}

练习

核心思想原理图

《JAVA--Map集合详解》

import java.util.*;
/*
目标:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:
a(1)c(2)……
通过结果发现,每一个字母都有对应的次数。
说明字母和次数之间存在映射关系。
什么时候使用Map集合:
当数据之间存在映射关系时,优先考虑Map集合。
思路:
1.将字符串转换成字符数组。因为要对每一个字母进行操作。
2.定义一个Map集合。而且打印结果字母有顺序,所以使用TreeMap集合。
3.遍历字符数组。
将每一个字母作为键去查Map集合元素。
如果返回null,将该字母和1存入到Map集合中。
如果返回不是null,说明该字母在Map集合已经存在并有对应次数(值)。
那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到Map集合中。原理:覆盖已有键对应的值。
4.将Map集合中的数据变成指定的字符串形式返回。
*/
class MapTest3{
public static void main(String[] args){

String s="sdfgzxcv,asdfxcv+df";

String result=charCount(s);

System.out.println(result);

}

public static String charCount(String str){

char[] chs=str.toCharArray();

TreeMap tm=new TreeMap();

int count=0;
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]);

if(value!=null)
count = value;
count++;
tm.put(chs[x],count);

count=0;

/*// 繁复写法
if(value==null){
tm.put(chs[x],1);
}else{
value=value+1;
tm.put(chs[x],value);
}*/
}

// System.out.println(tm);

StringBuilder sb=new StringBuilder();
Set> entrySet=tm.entrySet();
Iterator> it=entrySet.iterator();
while(it.hasNext()){
Map.Entry me=it.next();
char key=me.getKey();
int value=me.getValue();
sb.append(key+"("+value+") ");
}

return sb.toString();
}
}

 


推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
kenyousay
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有