Map集合的特点

1、Map集合中保存的都是键值对,键和值是一一对应的

2、一个映射不能包含重复的值

3、每个键最多只能映射到一个值上

Map接口和Collection接口的不同

Map是双列集合的根接口,Collection是单列集合的根接口

1、Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口)

2、Map的键是唯一的,Collection的子接口Set是唯一的

3、Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效

Map集合的遍历方式

package com.jd.text;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class Demo06 { public static void main(String[] args) {
// 创建map集合
Map map = new HashMap<>();
// 添加 将指定的值与此映射中的指定键关联
map.put("张三", 12);
map.put("李四", 13);
map.put("蔡文姬", 14);
map.put("王五", 15);
// 删除 如果存在一个键的映射关系,则将其从此映射中移除
map.remove("王五");
// map.clear();//删除全部 从此映射中移除所有映射关系
// 根据指定的key获取对应的value
Object obj1 = map.get("张三");
System.out.println(obj1);
// 是否包含指定的key,包含返回true,不包含返回false。
boolean b = map.containsKey("张三");
System.out.println(b);
// 是否包含指定的value,包含返回true,不包含返回false。
boolean c = map.containsValue(13);
System.out.println(c); System.out.println("******************************"); // map集合的遍历,通过keyset()方法(迭代器)
Set keySet = map.keySet();
Iterator iter = keySet.iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的遍历,通过keyset()方法(foreach)
Set keySet2 = map.keySet();
for (Object key : keySet2) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的遍历,通过entrySet()方法(foreach)
Set entrySet = map.entrySet();
for (Object obj3 : entrySet) {
Entry e = (Entry) obj3;
Object key = e.getKey();
Object value = e.getValue();
System.out.println(key + ":" + value);
}
System.out.println("******************************"); // map集合的values方法,获取到的map集合的value的值组成的collection集合
Collection coll = map.values();
for (Object obj : coll) {
System.out.println(obj);
}
}
}

运行结果:

12
true
true
******************************
李四:13
张三:12
蔡文姬:14
******************************
李四:13
张三:12
蔡文姬:14
******************************
李四:13
张三:12
蔡文姬:14
******************************
13
12
14

TreeMap集合保存自定义对象

package com.jd.text;

import java.util.Set;
import java.util.TreeMap;

/*
* TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
* 1.通过实现Comparable接口,重写compareTo()方法。
*/
public class Demo07 {

public static void main(String[] args) {
TreeMap map=new TreeMap<>();
map.put(new User("张三01", 12),11);
map.put(new User("张三01", 10),11);
map.put(new User("张三02", 13),11);
map.put(new User("张三01", 12),11);
//通过重写hashCode()和equals(Object obj)方法防止重复的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
}

package com.jd.text;
/*
* 通过实现Comparable接口,重写compareTo()方法。
*/
public class User implements Comparable{ private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public User() {
super();
} @Override
public int hashCode() {
final int prime=31;
int result=1;
result=prime*result+age;
result=prime*result+((name==null)?0:name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this==obj)
return true;
if(obj==null)
return false;
if(getClass()!=obj.getClass())
return false;
User user=(User) obj;
if(age!=user.age)
return false;
if(name==null){
if(user.name!=null)
return false;
}else if(!name.equals(user.name))
return false;
return true;
}
@Override
public int compareTo(Object o) {
if(o instanceof User){
User user=(User) o;
int sum=name.compareTo(user.name);
if(sum==0)
return age-user.age;
return sum;
}
throw new ClassCastException("不是User类型");
} }

运行结果:

User [name=张三01, age=10]:11
User [name=张三01, age=12]:11
User [name=张三02, age=13]:11
package com.jd.text;
/*
* TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
* 2.自己构造比较器实现Comparator接口,重写compare(Object o1, Object o2)方法
*/ import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap; public class Demo08 { public static void main(String[] args) {
TreeMap map=new TreeMap(new MyCompare());
map.put(new User2("张三01", 12),11);
map.put(new User2("张三01", 10),11);
map.put(new User2("张三02", 13),11);
map.put(new User2("张三01", 12),11);
//通过重写hashCode()和equals(Object obj)方法防止重复的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
} class User2{
String name;
int age; public User2(String name,int age){
this.name=name;
this.age=age;
} @Override
public int hashCode(){
final int prime=31;
int result=1;
result=prime*result+age;
result=prime*result+((name==null)?0:name.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this==obj)
return true;
if(obj==null)
return false;
if(getClass()!=obj.getClass())
return false;
User2 u=(User2) obj;
if(age!=u.age)
return false;
if(name==null){
if(u.name!=null)
return false;
}else if(!name.equals(u.name))
return false;
return true;
}
@Override
public String toString() {
return "User2 [name=" + name + ", age=" + age + "]";
}
}
//比较器
class MyCompare implements Comparator{ @Override
public int compare(Object o1, Object o2) {
if(o1 instanceof User2 && o2 instanceof User2){
User2 u1=(User2) o1;
User2 u2=(User2) o2;
int sum=u1.age-u2.age;
if(sum==0){
return u1.name.compareTo(u2.name);
}
return sum;
}
throw new ClassCastException("不是User2 类型");
} }

运行结果:

User2 [name=张三01, age=10]:11
User2 [name=张三01, age=12]:11
User2 [name=张三02, age=13]:11

Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式的更多相关文章

  1. 8.13.2 TreeSet实现Comparable接口的两种方式

    推荐使用第二种方式,编写比较器可以使数据类的程序耦合度降低,同时比较器也可以重复利用! 第一种方式:数据类实现Comparable接口,实现其中的compareTo方法 创建对象时,使用TreeSet ...

  2. TreeMap集合根据指定元素,进行删除和修改的两种方式实现及bug梳理

    TreeMap根据key中的指定元素进行删除修改的两种方式实现及注意事项: 方式一:利用增强for进行删除和修改 总结:逻辑简单,但是局限性太强,如果排序规则是从小到大进行排序的,则该方法不能进行删除 ...

  3. Spring IOC 依赖注入的两种方式XML和注解

    依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...

  4. JQuery中阻止事件冒泡的两种方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  5. JQuery 提供了两种方式来阻止事件冒泡。

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function(event){ ...

  6. 遍历Map集合:java.util.Map.Entry、KeySet两种方式

    遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...

  7. java的取出map里所有元素的两种方式

    /* * 取出map元素的两种方式 */package com.map.test; import java.util.HashMap;import java.util.Iterator;import ...

  8. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  9. [Java] HashMap遍历的两种方式

    Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...

随机推荐

  1. 学习Java的第十七天——大数字运算

    学习内容:大数字运算 代码实现: package 数字处理类; import java.math.BigInteger; public class BigIntegerDemo { public st ...

  2. SpringSecurity简单入门

    1.简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spr ...

  3. Android Proguard混淆对抗之我见

    关于何为Proguard,可以参考GuardSquare官网其优化业务及Wikipedia相关条目. Proguard:https://www.guardsquare.com/proguard Wik ...

  4. 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现

    内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...

  5. 动态线程池框架 DynamicTp v1.0.6版本发布。还在为Dubbo线程池耗尽烦恼吗?还在为Mq消费积压烦恼吗?

    DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池管理工具,主要功能可以总结为 动态调参.通知报警.运行监控.三方包线程池管理等几大类. 经过几个版本迭代,目前最新 ...

  6. Conda 虚拟环境移植

    这时候你应该位于具有待移植的环境的服务器: 1 进入你要移植的环境 conda activate your_env 2 导出当前conda环境到某个文件(文件名字可以自定义) conda env ex ...

  7. Java实用类(五) -Math类和指定范围的随机数

    1.Math类 java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数) 和PI(圆周率) // 绝对值 System.out.println(Math.abs(-3. ...

  8. python+requests+yaml实现接口自动化用例(二)---升级版

    一.前言:前面一段时间封装的接口自动化测试框架用了一段时间发现还是有很多弊端的,目前又改良了一下,可以说整体思路全都推翻了,功能比之前强大许多,有兴趣的可以私信我单独交流,希望共同学习进步! 二.项目 ...

  9. 11.2 Android Studio如何切换主题和更改字体

    如何进入设置? 全平台启动界面 Configure-Preferences 主界面 Windows版本:File-Settings Mac版本:Android Studio-Preferences 外 ...

  10. 一文读懂数仓中的pg_stat

    摘要:GaussDB(DWS)在SQL执行过程中,会记录表增删改查相关的运行时统计信息,并在事务提交或回滚后记录到共享的内存中.这些信息可以通过 "pg_stat_all_tables视图& ...