Map集合

一、
HashMap内部有数组保存键值对,存储元素时根据Key的hashcode值计算数组索引,并将键值对存入。获取时也根据计算索引值直接找到该元素,所HashMap根据这个方式避免了查找元素时对数组的遍历操作,所以不受元素的多少而影响查询性能。
由于Key的hashcode决定键值对在HashMap中数组索引位置,而equals方法决定着Key是否重复,所以这个方法要妥善重写;

hashcode与equals方法是定义在Object中的,所以要妥善重写这两个方法,当我们定义的类需要重写equals和hashcode时,必须遵守以下原则:
1.成对重写,当我们需要重写一个类的equals方法时,就应当重写hashcode方法。
2.一致性,当两个对象equals比较为true时,hashcode值应当相等。
3.稳定性,当参与equals比较的属性没有发生变化的情况系,多次强调用hasdcode方法返回数字不应当有变化。

public class Key {
	private int x;
	private int y;
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Key other = (Key) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}
}

二、java.util.Map接口
Map称为查找表,该数据结构体现的样子是一个“多行两列”的表格,左列称为Key,右列称为value;
Map总是根据Key查找对应的value,存储元素也要求key-value成对存入,key什么类型都可以
常用的实现类:java.util.HashMap散列表,哈希表HashMap是基于散列算法实现的Map,是最快的查询结构

/**
		 * V put(Key key,Value value);
		 * 将给定的Key-value键值对存入到Map中,Map有一个要求
		 * key值不允许重复(key的equals比较决定),若使用Map一有的Key存入value,
		 * 则是替换value操作,那么put方法返回的就是被替换的value,若没有替换,则返回null
		 * 
		 * 对应value是包装类型的情况,切记,不要用基本类型接受返回值,因为会触发自动拆装箱特性
		 * 否则会引发空指针异常
		 */
		 Map<String,Integer> map=new HashMap<String,Integer>();
		 map.put("语文", 98);
		 map.put("英语", 96);
		 map.put("数学", 92);
		 map.put("化学", 100);
		 System.out.println(map);
		
		//map集合的长度size()
		int size=map.size();
		//查看数学成绩
		int n=map.get("数学");
		/*
		 * V remove(key key)
		 * 删除当前map给定的key所对应的这组键值对
		 * 对应的value,若给的那个key在map中不存在,再返回null
		 */
		 Integer mm = map.remove("英语");
		 System.out.println("被删掉的value"+mm);
		 System.out.println(map.size()+","+map);
		//判断当前map是否包含给定的key或value
		boolean ck=map.containsKey("英语");
		boolean v=map.containsValue(98);
		//清空集合
		map.clear();
		//判断集合是否为空
		System.out.println(map.isEmpty());

三、Map的遍历
map有3种遍历方式:
1、遍历所有的key;
2、遍历所有的key-value键值对
3、遍历所有的value(相对不常用)

public static void main(String[] args) {
		Map<String,Integer> map=new HashMap<>();
		map.put("语文",100);
		map.put("英语", 99);
		map.put("数学",90);
		map.put("化学", 99);
		System.out.println(map);
		
		//可以有序的存入集合
		Map<String,Integer> linked=new LinkedHashMap<String,Integer>();
		linked.put("语文", 100);
		linked.put("英语", 99);
		linked.put("数学",90);
		linked.put("数学",90);
		linked.put("化学", 99);
		System.out.println(linked);
		//2.遍历所有的key-value键值对
		/*
		 * 遍历每一组键值对,在Map接口中定义了一个内部接口,java.util.Map.Entry
		 * Entry的每个实例用于表示当前Map中的一个组键值对,提供两个常用方法;
		 * K getKey():获取Key值
		 * V getValue():获取Value值
		 * 
		 * 不同的Map实现类都实现了EnTRY,并应实现类中的每个实例表示一个具体的键值对
		 * Set<> entrySet()该方法会将Map中所有键值对存入一个集合返回
		 */
		Set<Entry<String,Integer>> entry=map.entrySet();
		for(Entry<String,Integer> e:entry){
			String key=e.getKey();//从Entry中获取Map中的每一个Key
			Integer value=e.getValue();//从Entry中获取Map中的每一个value
			System.out.println(key+","+value);
		}
		/*
		 * 3.遍历所有的value(相对不常用)
		 * Collection values()
		 * 将当前的Map中所有的values以一个集合的形式返回
		 */
		Collection<Integer> values=map.values();
		for(Integer v:values){
			System.out.println(v);
		}
		//求各个科目中的平均值
		double sum=0.0;
		for(Integer v:values){
			sum+=v;
		}
		System.out.println(sum/map.size());
		}
	}

四、MapAndList

public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("admin");
		list.add("password");
		list.add("address");
		List<Integer> list2=new ArrayList<Integer>();
		list2.add(300);
		list2.add(200);
		list2.add(400);
		List<Double> list3=new ArrayList<Double>();
		list3.add(100.99);
		list3.add(111.99);
		list3.add(10.97);
		Map<String,Object> map=new HashMap<String,Object>();
		map.put("username",list);
		map.put("list2", list2);
		map.put("list3", list3);
		//获取用户信息
		Object obj=map.get("username");
		System.out.println(obj);
		//编写map集合中list集合中所有元素
		Set<Entry<String,Object>> entry=map.entrySet();
		for(Entry<String,Object> e:entry){
			String key=e.getKey();
			List<Object> li=(List<Object>) e.getValue();
			for(Object o:li){
				System.out.println(o);
			}
		}
}

五、ListAndMap

 public static void main(String[] args) {
 	Map<String,Double> tv=new HashMap<String,Double>();
		tv.put("平板电脑", 3500.99);
		tv.put("家庭影音", 12000.87);
		
		Map<String,Double> washing=new HashMap<String,Double>();
		washing.put("对开门冰箱", 8800.99);
		washing.put("立柜式空调", 5800.99);
		
		Map<String,Double> cosmetics=new HashMap<String,Double>();
		cosmetics.put("TF",439.99);
		cosmetics.put("YSL", 238.99);
		
		List<Map<String,Double>> list=new ArrayList<Map<String,Double>>();
		list.add(tv);
		list.add(washing);
		list.add(cosmetics);
		
		for(Map<String,Double> map:list){
			System.out.println(map);
			Set<Entry<String,Double>> entry=map.entrySet();
			for(Entry<String,Double> e:entry){
				String key=e.getKey();
				Double value=e.getValue();
				System.out.println(key+","+value);
			}
		}
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值