Java学习笔记之集合(九):TreeMap的存储原理

package com.collection.map;

import java.util.Comparator;
import java.util.TreeMap;

import org.junit.Test;

/*
双列集合体系:
------| Map:如果是实现了Map接口的集合类,具备的特点:存储的数据都是以键值对的方式存在的,键不可重复,值可以重复;
---------| HashMap:底层也是基于哈希表实现的;此处的哈希表存在两列,值列和键列;
---------| TreeMap:TreeMap也是基于红黑树(二叉树)数据结构实现的;特点:会对元素的键进行排序存储;

	TreeMap注意事项:
		1、往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就按照键的自然顺序特性进行排序存储;
		2、往TreeMap添加元素的时候,如果元素的键不具备自然顺序,那么键所属的类就必须要实现Comparable接口,
			并重写 compareTo()方法,将自定义比较规则定义在该方法中;
		3、往TreeMap添加元素的时候,如果元素的键不具备自然顺序,而且键所属的类也没有实现Comparable接口,
			那么就必须在创建TreeMap对象的时候,传入一个比较器,并且比较器中定义了比较规则;
		4、如果同时实现了Comparable接口和Comparator接口,则比较规则以Comparator为准;	

---------| HashTable:底层也是依赖哈希表实现的,和HashMap一样,但是他是线程安全的,效率较低,已经被淘汰了;
 */

class Emp implements Comparable<Emp>{
	
	String name;
	int salary;
	
	public Emp(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "[name=" + name + ", salary=" + salary + "]";
	}

	// 自定义比较规则
	@Override
	public int compareTo(Emp o) {
		return this.salary - o.salary;
	}
	
}

// 自定义比较器
class MyComparator implements Comparator<Emp>{

	@Override
	public int compare(Emp o1, Emp o2) {
		return o1.salary - o2.salary;
	}
	
}

public class Demo3 {

	// TreeMap注意事项2:实现Comparable接口;
	@Test
	public void test1() {
		TreeMap<Emp, String> map = new TreeMap<Emp, String>();
		map.put(new Emp("张三", 1000),  "001");
		map.put(new Emp("李四", 2000),  "002");
		map.put(new Emp("王五", 3000),  "003");
		
		System.out.println("集合中的元素:" + map);
	}

	// TreeMap注意事项3:实现Comparator接口(自定义比较器)
	@Test
	public void test2() {
		// 创建自定义比较器对象
		MyComparator comparator = new MyComparator();
		
		// 创建TreeMap对象的时候,传入自定义比较器
		TreeMap<Emp, String> map = new TreeMap<Emp, String>(comparator);
		map.put(new Emp("张三", 1000),  "001");
		map.put(new Emp("李四", 2000),  "002");
		map.put(new Emp("王五", 3000),  "003");
		
		System.out.println("集合中的元素:" + map);
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值