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. unity---小地图制作

    脚本控制移动 public float moveSpeed =5f; public float roundSpeed=120f; void Update() { this.transform.Tran ...

  2. Vue路由的安装

    1.在Vue ui中插件中找到添加vue-router 2.安装以后,项目中的会自动完成配置. 3.在store中的index.js配置路由页面以及路径.

  3. Vue2-组件通讯传值

    Vue2组件通讯传值 方法 Slot插槽--父向子内容分发,子组件只读 mixin混入--定义公共变量或方法,mixin数据不共享,组件中mixin实例互不影响 provide+inject--依赖注 ...

  4. 关于『进击的Markdown』:第一弹

    关于『进击的Markdown』:第一弹 建议缩放90%食用 比起隐蔽物下的狙击手,Markdown更像冲锋陷阵的阵头兵 简单.粗暴.直接.而且好上手 各位晚上好! 早饭吃了吗您 我 今 天 没 吃 M ...

  5. 聊聊OOP中的设计原则以及访问者模式

    一  设计原则 (SOLID) 1.  S - 单一职责原则(Single Responsibllity Principle) 1.1  定义 一个类或者模块只负责完成一个职责(或功能), 认为&qu ...

  6. java基础题(4)

    5.4接口和抽象类 5.4.1实现抽象方法 描述: 已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法.要求定义Base的子类Su ...

  7. java中synchronized关键字基础-1

    1.synchronized关键字简介 synchronized是java中的一个关键字,在中文中为同步,也被称之为'同步锁',以此来达到多线程并发访问时候的并发安全问题,可以用来修饰代码块.非静态方 ...

  8. sort是不稳定排序

    今天才知道sort是不稳定的,WA了一个点. sort()排序不是稳定排序,sort是主要用到了快速排序(平均时间复杂度为O(nlogn)),还结合了插入排序(时间复杂度为O(n2))和堆排序(时间复 ...

  9. 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)

    目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...

  10. 我熬夜开发了一款简约实用、支持多平台的Markdown在线编辑器(开源)

    前言 之前,一直想开发一款属于自己的Markdown编辑器,主要是自己平常写文章可以更加灵活操作,另外扩宽自己的视野也是非常不错的选择啊!所以在周末就决定玩耍一番.首先我调研了很多线上热门的md编辑器 ...