Java中TreeMap使用

Map接口

Map及其实现类对比

  • java.util.Map 存储一对一对的数据(类似于函数)
    • HashMap 主要实现类 线程不安全、执行效率高 可以添加null的key和value值 底层使用数组+单向链表+红黑树结构存储(jdk8)
      • LinkedHashMap: 是HashMap的子类,在HashMap使用的数据结构基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而在遍历元素时,可以按照添加的顺序显示。对于频繁的遍历操作,建议使用LinkedHashMap
    • TreeMap:底层使用红黑树存储,可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历。需要考虑使用自然排序定制排序
    • Hashtable : 古老实现类 线程安全、执行效率低、不可添加null的key和value值(二者都不可)、底层使用数组+单向链表结构存储
      • Properties Hashtable的子类 其key和value都是String类型.常用来处理属性文件

HashMap中元素的特点

  • HashMap中所有的key彼此之间是不可重复的 无序的.所有的key就构成一个set集合(Key所在的类要重写hashCode()和equals()方法)
  • HashMap中的所有value 彼此之间是可重复的,无序的.所有的value就构成了一个Collection集合.(value所在的类要重写equals()方法)
  • HashMap中的一个key-value就构成了一个Entry.
  • HashMap中的所有的entry彼此之间是不可重复,无序的.所有的entry就构成了一个set集合

Map中常用方法

  • 添加、修改操作:
    • Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
    • void putAll(Map m):将m中的所有key-value对存放到当前map中
  • 删除操作:
    • Object remove(Object key):移除指定key的key-value对,并返回value
    • void clear():清空当前map中的所有数据
  • 元素查询的操作:
    • Object get(Object key):获取指定key对应的value
    • boolean containsKey(Object key):是否包含指定的key
    • boolean containsValue(Object value):是否包含指定的value
    • int size():返回map中key-value对的个数
    • boolean isEmpty():判断当前map是否为空
    • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • 元视图操作的方法:
    • Set keySet():返回所有key构成的Set集合
    • Collection values():返回所有value构成的Collection集合
    • Set entrySet():返回所有key-value对构成的Set集合

增: put(Object key,Object value)

putAll(Map m)

删: Object remove(Object value)

改: put(Object key,Object value)

查: Object get(Object key)

长度: size()

遍历:

​ 遍历key集 Set keySet()

​ 遍历value集 Collection values()

​ 遍历entry集 Set entrySet()

public class MapTest {
    @Test
    public void test1(){
        HashMap map = new HashMap();
        //put
        map.put("AA",56);
        map.put("BB",78);
        map.put(new Person("Tom",12),78);

        System.out.println(map);
        //size()  长度
        System.out.println(map.size());

        //remove() 移除
        Object value = map.remove("AA");
        System.out.println(value);
        System.out.println(map);
        //修改 put
        //如果要修改Person类,则要重写hashCode()和 equals()方法
        Object oldValue = map.put("BB",99);
        System.out.println(oldValue); //oldValue存放原来的value值
        System.out.println(map);

        //get(Object key)
        Object value1 = map.get(99);
        System.out.println(value1);
    }
}
//输出
{AA=56, BB=78, Person{name='Tom', age=12}=78}
3
56
{BB=78, Person{name='Tom', age=12}=78}
78
{BB=99, Person{name='Tom', age=12}=78}
null
public void test2(){
    //map的遍历操作
    //keySet()
    HashMap map = new HashMap();
    map.put("AA",56);
    map.put("BB",78);
    map.put(new Person("Tom",12),12);

    System.out.println(map.keySet());
    //或
    Set keySet = map.keySet();
    //使用迭代器
    Iterator iterator = keySet.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }
    System.out.println();
    //遍历value集 Collection values()
    //方式1
    Collection values = map.values();
    //使用增强for遍历
    for(Object obj : values){
        System.out.println(obj);
    }
    System.out.println();
    //方式2
    Set keySet1 = map.keySet();
    for(Object obj : keySet1){
        System.out.println(map.get(obj));
    }
    
}
//输出结果
[AA, BB, Person{name='Tom', age=12}]
AA
BB
Person{name='Tom', age=12}

56
78
12
56
78
12
public void test3(){
    HashMap map = new HashMap();
    map.put("AA",32);
    map.put("BB",213);
    map.put(new Person("Tom",12),45);

    //遍历entry
    Set entrySet = map.entrySet();
    Iterator iterator = entrySet.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }
}
//输出结果
AA=32
BB=213
Person{name='Tom', age=12}=45

TreeMap的使用

  • 底层使用红黑树存储
  • 可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历.
  • 需要考虑使用自然排序定制排序
  • 要求,向TreeMap中添加的key必须是同一个类型的对象
//定制排序
public class TreeMapTest{
    public static void main(String []args){
        Comparator comparator = new Comparator(){
            public int compare(Object o1,Object o2){
                if(o1 instanceof User && o2 instanceof User){
                    User u1 = (User)o1;
                    User u2 = (User)o2;
                    int value = u1.getName().compareTo(u2.getName());
                    if(value != 0){
                        return value;
                    }
                    return u1.getAge() - u2.getAge();
                }
                throw new RuntimeException("类型不匹配");
            }
        }
        TreeMap map = new TreeMap(comparator); //使用定制排序
    }
}

Hashtable与Properties的使用

  • Properties是Hashtable的子类,其keyvalue是String类型的,常用来处理属性文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值