Java SE 之Map

Map接口


一.Map概述

① Map里面存储的数据是 : key -value 对。

② Map存储key - value 对时,只考虑 key的存储即可,key存储后,value “作为其附属”即可,对Map而言,value只是附属物,因此Map对value几乎没有要求,但是Map对key有要求;

再进一步,如果只管Map里面的key,并把key收集起来,就变成了Set 集合,Map与Set一一对应。

二.HashMap 类

① HashMap 根据keyhashCode()方法的返回值来将计算key的存取位置;

② HashMap 判断key 重复的条件:

     —— 通过equals()比较返回true

     —— 两个keyhashCode()返回值相等

③ Hashtable 与HashMap 的区别:

  — Hashtable 从JDK1.0就开始有,已废弃,不推荐使用;

  — Hashtable 不允许null作为key 、value,但是HashMap允许;

  — Hashtable 是线程安全的(其实现不够好),HashMap是线程不安全的,但是其性能好。

示例程序 1

import java.util.*;

//定义Apple

class Apple

{

private String color;

private double weight;

public Apple(String color ,double weight )

{

this.color = color;

this.weight= weight;

}

//重写toString()方法

@Override

public String toString() 

{

return "Apple[color=" + color +",weight=" +weight +"]";

}

//重写equals()方法

@Override

public boolean equals(Object obj)

{

if(this == obj)

{

return true;

}

if(obj != null && obj.getClass()==Apple.class)

{

Apple apple =(Apple)obj;

return this.weight == apple.weight

&& this.color.equals(apple.color);

}

return false;

}

//重写 hashCode()方法

@Override

 public int hashCode()

 {

  //这里的数字“9”是任意的,因为weightdouble型,所以强转

  return color.hashCode()+ 9*(int)weight;

  }

}

   public class HashMapTest

{

   public static void main (String[] args) 

{

//***************************************************

//HashMap只考虑对key的存储,存储机制与HashSet几乎一样

//注意这里是用的是 Double 对象

HashMap<String,Double> score = new HashMap<>();

//对于Map而言,存入的数据都是key-value

score.put("语文",89.0);

score.put("数学",99.0);

score.put("英语",88.0);

//输出元素个数

System.out.println(score.size());

//输出所有元素

        System.out.println(score);

        

        

        //***************************************************

        //HashSet要求 元素 正确重写hashCode()和equals()

        //HashSet要求 key  正确重写hashCode()和equals()

        

        HashMap<Apple,Double> apples= new HashMap<>();

        

        //对于Map而言,存入的数据都是key-value

        apples.put(new Apple("红色",3.5),3.55);

        apples.put(new Apple("红色",3.6),3.66);

        apples.put(new Apple("青色",3.5),3.55);

        

        System.out.println(apples);

}

}

运行结果:

3

{语文=89.0, 英语=88.0, 数学=99.0}

{Apple[color=青色,weight=3.5]=3.55, Apple[color=红色,weight=3.6]=3.66, Apple[color=      色,weight=3.5]=3.55}

示例程序 2

import java.util.*;

public class LinkedHashMapTest

{

public static void main(String[] args)

{

//HashMap只考虑对key的存储,存储机制与HashSet几乎一样

//如果需要HashMap记住添加元素的顺序,应该考虑使用LinkedHashMap

LinkedHashMap<String,Double> score= new LinkedHashMap<>();

     score.put("语文",89.0);

score.put("英语",99.0);

score.put("数学",88.0);

System.out.println(score.size());

System.out.println(score);

}

}

     运行结果:

     3

     {语文=89.0, 英语=99.0, 数学=88.0}

三.TreeMap 

—— 底层的红黑树只对key进行排序

    

① TreeMap 要求key必须是可比较大小的 ——自然排序或定制排序;

② TreeMap 通过compareTo()方法比较大小,返回值为0是代表两个元素相等。

示例程序:

import java.util.*;

public class Test

{

public static void main(String[] args)

{

//如果创建TreeMap时没有传入Comparator,说明用的是自然排序

//String 已经实现了 Comparable 接口

TreeMap<String,Double> treeMap =new TreeMap<>();

treeMap.put("abc",88.0);

treeMap.put("abD",89.0);

treeMap.put("abC",90.0);

treeMap.put("Abc",91.0);

//输出结果已经自然排序

System.out.println("自然排序为:");

System.out.println(treeMap);

 }

运行结果:

自然排序为:

{Abc=91.0, abC=90.0, abD=89.0, abc=88.0}

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值