您的位置:首页 > 编程语言 > Java开发

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

2017-09-27 10:50 387 查看
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: