java基础7(Map集合)

学习之前我们首先要知道什么是映射:就比如生活中一个人对应这一个身份证号,这种一一对应的关系就叫做映射,在java中 java.util.Map接口专门用来存放这种关系的对象

一. Map集合

1.1 Map集合与Collection集合区别

Map接口与Collection接口里面下的集合,它们存储数据的形式不同。
1.Collection 中的集合称为单列集合,向集合中存储元素采用一个个元素的方式存储。
2.Map 中的集合称为双列集合每个元素由键与值两部分组成,通过键可以找对所对应的值。
注意 Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

1.2 Map的常用子类

map的子类很多,经常用到HashMap集合、LinkedHashMap集合
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

1.3 Map的常用方法

public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
public boolean containKey(Object key) :判断该集合中是否有此键。

public class MapDemo { 
	public static void main(String[] args) {
	 //创建 map对象
	  HashMap<String, String> map = new HashMap<String, String>(); 
	  //添加元素到集合 map.put("黄晓明", "杨颖"); 
	  map.put("文章", "马伊琍"); 
	  map.put("邓超", "孙俪"); 
	  System.out.println(map); 
	  //String remove(String key) 
	  System.out.println(map.remove("邓超")); 
	  System.out.println(map); 
	  // 想要查看 黄晓明的媳妇 是谁
	   System.out.println(map.get("黄晓明")); 
	   System.out.println(map.get("邓超"));
	  }
 }

1.4 Map的遍历

方式1:键找值方式

  1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
  2. 遍历键的Set集合,得到每一个键。
  3. 根据键,获取键所对应的值。方法提示: get(K key)
    在这里插入图片描述

方式2:键值对方式

Entry 将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历 Map 集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。

在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

获取了Entry对象 , 表示获取了一对键和值,那么同样Entry中 , 分别提供了获取键和获取值的方法:
public K getKey():获取Entry对象中的键。
public V getValue() :获取Entry对象中的值。

操作步骤与图解:

  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。
  2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
  3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示: getkey() getValue()
    在这里插入图片描述

1.5 HashMap存储自定义类型

练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到
map集合中。学生作为键, 家庭住址作为值。
注意,学生姓名相同并且年龄相同视为同一名学生。
编写学生类:

public class Student { 
	private String name; 
	private int age;
	 //构造方法 //get/set
	 @Override 
	 public boolean equals(Object o) { 
	 	if (this == o)   return true; 
	 	if (o == null || getClass() != o.getClass()) 
	 	return false; 
	 	Student student = (Student) o;
	 	return age == student.age && Objects.equals(name, student.name);
	  }
	  @Override 
	  public int hashCode() { 
	  	return Objects.hash(name, age); 
	  	} 
	  }
编写测试类:
public class HashMapTest { 
  	public static void main(String[] args) { 
  		//1,创建Hashmap集合对象。 
  		Map<Student,String> map = new HashMap<Student,String>();
  		 //2,添加元素。 
  		 map.put(new Student("lisi",28), "上海"); 
  		 map.put(new Student("jxl",22), "北京"); 
  		 map.put(new Student("jxl",22), "南京"); 
  		 //3,取出元素。键找值方式 
  		 Set<Student> keySet = map.keySet(); 
  		 for(Student key : keySet){ 
  		 	String value = map.get(key); 
  		 	System.out.println(key.toString() + "....." + value); 
  		 } 
  	}
 }

当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法
如果要保证map中存放的key和取出的顺序一致,可以使用 java.util.LinkedHashMap 集合来存放。

1.6 LinkedHashMap

有序,速度快 链表和哈希表组合的一个数据存储结构

public class LinkedHashMapDemo { 
	public static void main(String[] args) { 
		LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); 
		map.put("jxl", "shy");
		 map.put("jyz", "sl"); 
		map.put("haha", "xixi"); 
		Set<Entry<String, String>> entrySet = map.entrySet(); 
		for (Entry<String, String> entry : entrySet) { 
			System.out.println(entry.getKey() + " " + entry.getValue()); 
			} 
    	}
    }

输出结果:
jxl shy jyz sl haha xixi

小提示:

在使用 HashMap 的时候,用 String 做 key 有什么好处?
HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,
所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。
发布了12 篇原创文章 · 获赞 4 · 访问量 388

猜你喜欢

转载自blog.csdn.net/weixin_44079478/article/details/104914780