Java基础(7)----Map集合

Map集合

  • Map集合概述

    interface Map<K,V>  K:键的类型;V:值的类型
    
  • Map集合的特点

    • 键值对映射关系
    • 一个键对应一个值:成对出现,键值对(名值对)保存,每一个key对应一个value
    • 键不能重复,值可以重复:保存的记录唯一,相同key的记录添加过后会替换为新的
    • 元素存取无序
    • Map集合容器中,所有的(key-value)都保存在Entry对象中

他的

基本方法

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素,返回被删除的键值的value值
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数
@Test
	/*
	 * Map集合容器
	 * 1.成对出现,键值对(名值对)保存,每一个key对应一个value
	 * 2.保存的记录唯一,相同key的记录添加过后会替换为新的
	 * 3.Map集合容器中,所有的(key-value)都保存在Entry对象中
	 */
	public void test1(){
		//创建集合对象
		Map<String,String> cities = new HashMap<String,String>();
		//put(K key,V value)将指定的值与该映射中的指定键相关联
		cities.put("吉林省", "长春市");
		cities.put("黑龙江省", "哈尔滨市");
		cities.put("辽宁省", "沈阳市");
		//输出集合对象
		System.out.println(cities);//{辽宁省=沈阳市, 吉林省=长春市, 黑龙江省=哈尔滨市}
		//get(Object key)
		System.out.println(cities.get("吉林省"));//长春市
		//size()
		System.out.println(cities.size());//3
		//containsKey(Object key)
		System.out.println(cities.containsKey("吉林省"));//true
		//containsValue(Object value)
		System.out.println(cities.containsValue("沈阳市"));//true
        //根据键删除键值对元素,返回被删除的键值的value值
		System.out.println(cities.remove("吉林省"));//长春市
		System.out.println(cities);//{辽宁省=沈阳市, 黑龙江省=哈尔滨市}
		System.out.println(cities.isEmpty());//false
		//void   clear()移除所有的键值对元素,没有返回值
		cities.clear();
		System.out.println(cities.isEmpty());//true
	}

获取方法

方法名说明
V get(Object key)根据键获取值
Set keySet()获取所有键的集合
Collection values()获取所有值的集合
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合
public void test1(){
		//创建集合对象
		Map<String,String> cities = new HashMap<String,String>();
		//put(K key,V value)将指定的值与该映射中的指定键相关联
		cities.put("吉林省", "长春市");
		cities.put("黑龙江省", "哈尔滨市");
		cities.put("辽宁省", "沈阳市");
		
		//Collection<V> values():获取所有值的集合
        Collection<String> values = cities.values();
        for(String value : values) {
            System.out.println(value);
        }
	}

遍历方法

都是通过增强for循环,进行遍历,只是获取值的方法不一样

方法1:

Collection values():获取所有值的集合

public void test1(){
		//创建集合对象
		Map<String,String> cities = new HashMap<String,String>();
		//put(K key,V value)将指定的值与该映射中的指定键相关联
		cities.put("吉林省", "长春市");
		cities.put("黑龙江省", "哈尔滨市");
		cities.put("辽宁省", "沈阳市");
		
		//Collection<V> values():获取所有值的集合
        Collection<String> values = cities.values();
        for(String value : values) {
            System.out.println(value);
        }
	}
方法2:

keySet()方法

public void test1(){
		//创建集合对象
		Map<String,String> cities = new HashMap<String,String>();
		//put(K key,V value)将指定的值与该映射中的指定键相关联
		cities.put("吉林省", "长春市");
		cities.put("黑龙江省", "哈尔滨市");
		cities.put("辽宁省", "沈阳市");
		
		//获取所有键的集合。用keySet()方法实现
        Set<String> keySet = cities.keySet();
        //遍历键的集合,获取到每一个键。用增强for实现
        for (String key : keySet) {
            //根据键去找值。用get(Object key)方法实现
            String value = cities.get(key);
            System.out.println("key="+key + ",value=" + value);
        }

	}
方法3:

entrySet():获取所有键值对对象的集合

public void test1(){
		//创建集合对象
		Map<String,String> cities = new HashMap<String,String>();
		//put(K key,V value)将指定的值与该映射中的指定键相关联
		cities.put("吉林省", "长春市");
		cities.put("黑龙江省", "哈尔滨市");
		cities.put("辽宁省", "沈阳市");

		//获取所有键值对对象的集合
		Set<Entry<String,String>> ens = cities.entrySet();
		//遍历键值对对象的集合,得到每一个键值对对象
		for(Entry<String,String> en : ens){
			//根据键值对对象获取键和值
            String key = en.getKey();
            String value = en.getValue();
            System.out.println("key="+key + ",value=" + value);
		}
		
	}

HashMap()

存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

HashMap多线程开发环境下不安全的

HashTable()

用法基本上和HashMap一样

多线程开发环境下是安全的,原因是具备线程的同步锁

LinkedHashMap

HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证键的唯一、不重复需要重写键的hashCode()方法、equals()方法。

LinkedHashSet集合特点

  • 哈希表和链表实现的Set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复的元素

案例1:Map套List

@Test
	public void test3(){
		Scanner sc = new Scanner(System.in);
		Map<String,List<City>> cities = new HashMap<String,List<City>>();
		List<City> c1 = new ArrayList<City>();
		c1.add(new City("1001","长春"));
		c1.add(new City("1002","吉林"));
		c1.add(new City("1003","通化"));
		
		List<City> c2 = new ArrayList<City>();
		c2.add(new City("2001","哈尔滨"));
		c2.add(new City("2002","齐齐哈尔"));
		c2.add(new City("2003","漠河"));
		
		List<City> c3 = new ArrayList<City>();
		c3.add(new City("3001","沈阳"));
		c3.add(new City("3002","大连"));
		c3.add(new City("3003","铁岭"));
		
		cities.put("吉林省", c1);
		cities.put("黑龙江省", c2);
		cities.put("辽宁省", c3);
		
		Set<Entry<String,List<City>>> entrySet = cities.entrySet();
		String name = sc.next();
		/*自己写的垃圾方法
		for(Entry<String,List<City>> en : entrySet){
			String key = en.getKey();
			List<City> value = en.getValue();
			if("吉林省".equals(key)){
				System.out.println(value);
				break;
			}else if("黑龙江省".equals(key)){
				System.out.println(value);				
				break;
			}else if("辽宁省".equals(key)){
				System.out.println(value);
				break;
			}
		}
		*/
		if("吉林省".equals(name) || "黑龙江省".equals(name) || "辽宁省".equals(name)){
			List<City> c = cities.get(name);
			for(City city : c){
				System.out.println(city);
			}
		}else{
			System.out.println("输入的省会不存在!");
		}
	}

案例2:List套Map

1.案例题目描述:
使用集合完成功能
2.案例完成思路要求:
1)HashMap类实例化一个Map类型的对象m1,键
(String类型)和值(int型)分别用于存储员工的姓名和工
资,存入数据如下:
张三——800元;李四——1500元;王五——3000元; (15分)
2)张三的工资更改为2600元(15分)
3)为所有员工工资加薪100元;(15分)
4)创建ArrayList<HashMap<String,Employee>>;(15分)
5)封装Employee对象,Map中的key为员工姓名;(15分)
1)遍历list集合,在控制台打印员工信息。(15分)
2) 要求代码每个方法都有注释。(10分)

Employee类

package Day0818am;

public class Employee {
	private String name;
	private int salary;
	public Employee(String name, int salary) {
		super();
		this.name = name;
		this.salary = salary;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	public Employee() {	}
	@Override
	public String toString() {
		return "Employee [name=" + name + ", salary=" + salary + "]";
	}
	
	

}

测试类

@Test
	public void test4(){
		List<Map<String,Employee>> em = new ArrayList<Map<String,Employee>>();
		Map<String,Employee> m1 = new HashMap<String,Employee>();
		m1.put("张三", new Employee("张三",800));
		m1.put("李四", new Employee("李四",1500));
		m1.put("王五", new Employee("王五",3000));
		
		em.add(m1);
		
		System.out.println(em.get(0));
		System.out.println("----------------");
		
		Employee employee = m1.get("张三");
		System.out.println(employee.getName()+"的原本工资为:"+employee.getSalary());
		employee.setSalary(2600);
		System.out.println(employee.getName()+"的工资变为:"+employee.getSalary());
		
		Set<Entry<String,Employee>> entrySet = m1.entrySet();
		for(Entry<String, Employee> s : entrySet){
			String name = s.getKey();
			Employee value = s.getValue();
			value.setSalary(value.getSalary()+100);
		}
		
		
		for(Map<String, Employee> l : em){
			Set<Entry<String,Employee>> entrySet2 = l.entrySet();
			for(Entry<String, Employee> s : entrySet2){
				String name = s.getKey();
				Employee value = s.getValue();
				System.out.println(name+"的工资变为:"+value.getSalary());
			}
			
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

?abc!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值