Java Map集合解析

本文介绍了Java中的双例集合,重点比较了HashMap和TreeMap的区别,包括存储原理、遍历方式以及TreeMap的自定义排序。通过实例演示了如何使用MyComparator进行TreeMap的排序操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.heilong.map;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

/*
 * 双例集合
 * --------|Map  如果实现了Map接口的集合类,具备的特点:存储的数据都是以键值对的形式存在的,键不可重复,值可以重复
 * ------------|HashMap	 底层也是基于哈希表实现
 * ------------|TreeMap  TreeMap是基于红黑树数据结构实现的  特点:会对元素的键进行排序存储 
 * ------------|HashTable
 * 
 * HashMap的存储原理:
 * 	往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置
 * 	情况1:如果算出的位置没有任何元素存储,那么该元素可以直接添加到哈希表中
 * 	情况2:如果算出的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,
 * 			如果equals方法返回的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允许存储
 * 
 * TreeMap存储注意事项:
 * 	1.往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序进行排序存储
 * 	2.往TreeMap添加元素的时候,如果元素的键不具备自然顺序的特性,那么键所属的类必须要实现Comparable接口,把键的比较规则定义在ComparaeTo方法内
 * 	3.往TreeMap添加元素的时候,如果元素的键不具备自然顺序的特性,键所属的类必须也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器
 * 
 * */

class Emp implements Comparable<Emp>{
	
	String name;
	
	int salary;
	
	public Emp(String name, int salary){
		super();
		this.name = name;
		this.salary = salary;
	}
	
	@Override
	public String toString() {

		return "[姓名:" + this.name + " 薪水:" + this.salary + "]";
	}
	
	@Override
	public int compareTo(Emp o) {
		return this.salary-o.salary;
	}
}

class MyComparator implements Comparator<Emp>{
	
	@Override
	public int compare(Emp e1, Emp e2) {
		return e1.salary-e2.salary;
	}
}

public class map {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("1", "一");
		map.put("2", "二");
		map.put("3", "三");
		map.put("4", "四");
		
		System.out.println("方式一:");
		//迭代方式一:使用keySet方法进行遍历    缺点:只返回了所有的键,没有值
		Set<String> keys = map.keySet();
		Iterator<String> it = keys.iterator();
		while(it.hasNext()){
			String key = it.next();
			System.out.println("键:" + key + " 值:" + map.get(key));
		}
		
		System.out.println("方式二:");
		//迭代方式二:使用values方法进行遍历	缺点:只返回了所有的值,
		Collection<String> c = map.values();
		Iterator<String> it2 = c.iterator();
		while(it2.hasNext()){
			System.out.println("值:" + it2.next());
		}
		
		System.out.println("方式三:");
		Set<Entry<String, String>> entrys = map.entrySet();
		Iterator<Entry<String, String>> it3 = entrys.iterator();
		while(it3.hasNext()){
			Entry<String, String> entry = it3.next();
			System.out.println("键:" + entry.getKey() + " 值:" + entry.getValue());
		}
		
		
		System.out.println("----------------------------------------------------------------------");
	
		MyComparator myComparator = new MyComparator();
		TreeMap<Emp, String> treeMap = new TreeMap<Emp, String>(myComparator);
		treeMap.put(new Emp("张三", 200), "001");
		treeMap.put(new Emp("李四", 100), "002");
		treeMap.put(new Emp("王五", 300), "003");
		treeMap.put(new Emp("赵六", 500), "004");
		System.out.println(treeMap);
		
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值