J2EE基础之集合框架Map

目录

一、Map集合的特点

        1、特点:

                ①、增删改查

                ②、键值对形式存在

                ③、key可以为空

        2、遍历方式

                ①keySet

                ②entrySet

二、常用实现类HashMap

                案例:1、统计字符串各字母出现的次数

                 案例:2、按照字符出现的次数进行排序

 三、泛型

四、集合框架工具类

结论:

其他工具类方法的应用


一、Map集合的特点

        1、特点:

                ①、增删改查

                ②、键值对形式存在

                ③、key可以为空

        2、遍历方式

                ①keySet

                ②entrySet

代码如下(特点):


		Map<String,Integer> map = new HashMap<>();
		//V put(K key, V value);
		//增加数据  map.put
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		map.put("d", 4);		map.put(null,null);
		System.out.println(map);
		//移除(删除)
		 Object remove = map.remove("b");
		 System.out.println(remove);
		 System.out.println(map);
		 //修改 调用put方法
		 map.put("c", 32);
		 System.out.println(map);
		 
//		 查询
		 System.out.println(map.get("c"));

 运行结果


 遍历方式(代码如下)

查询所有两种: 1、先拿到map集合中所有的key         map.keySet

            2、拿到映射关系        map.entrySet

package com.zwc.map;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 * map集合特点
 * 键值对
 * 遍历
 * 		拿到key,在拿值
 * 		拿到映射关系,键值都有了
 * 
 * 
 * @author Administrator
 *
 */
public class Demo1 {
	public static void main(String[] args) {
//		Hashtable<Object, Object> table = new Hashtable<>();
//		//public synchronized V put(K key, V value)
//		table.put("a", 1);
//		table.put(null, null);
//		
		Map<String,Integer> map = new HashMap<>();
		//V put(K key, V value);
		//增加数据  map.put
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		map.put("d", 4);		/*map.put(null,null);*/
//		
//		 查询所有
		 1、先拿到map集合中所有的key
		 Set set = map.keySet();
		 for (Object key : set) {
			System.out.println("键:"+key+":值:"+map.get(key));
		}
		 System.out.println("------------------");
		 2、拿到映射关系
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		 for (Entry<String, Integer> entry : entrySet) {
			 System.out.println("键:"+entry.getKey()+":值:"+entry.getValue());
		}
	}
}

运行结果:


面试题:
  Hashmap与Hashtable的区别:
  1、Hashtable线程是安全的
  2、JDK1.8以下Hashtable的key是不能放null值

  代码如下:

public static void main(String[] args) {
		Hashtable<Object, Object> table = new Hashtable<>();
		//public synchronized V put(K key, V value)
		table.put("a", 1);
		table.put(null, null);
//		
		Map<String,Integer> map = new HashMap<>();
		//V put(K key, V value);
		//增加数据  map.put
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		map.put("d", 4);		
		map.put(null,null);

注意:JDK在1.8以下的键是不能放null值的

二、常用实现类HashMap

                案例:1、统计字符串各字母出现的次数

        对于改案例的思路:

          1、做字符串切割,得到一个字符数组
          2、接下来遍历,拿到单个字符
          3、如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
          4、如果出现过,拿到原来的值加1

        代码如下:

package com.zwc.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Stream;

public class Demo2 {
	public static void main(String[] args) {
		String s ="sjflajaflajflwajjjlfwajflwajfwajflwajflwa";
		 /**
		  * 实现思路:
		  * 1、做字符串切割,得到一个字符数组
		  * 2、接下来遍历,拿到单个字符
		  * 3、如果该字符没有出现过,即value值为null,那么该字符为key,值初始化为1
		  * 4、如果出现过,拿到原来的值加1
		  * 
		  */
		char[] arr = s.toCharArray();
		Map<Character, Integer> map = new TreeMap<>();
		for (char c : arr) {
			Integer value = map.get(c);
			if(value==null) {
				map.put(c, 1);
			}
			else {
				map.put(c, value+1);
			}
//			System.out.println(value);
		}
        //按字母顺序查询
		Set<Entry<Character,Integer>> entrySet = map.entrySet();
		for (Entry<Character, Integer> entry : entrySet) {
			System.out.println(entry.getKey()+": "+entry.getValue());
			
		}
	}
}


        运行结果:

        

         案例:2、按照字符出现的次数进行排序

          下面讲一下需求和思路

           需求:按照字符出现的次数进行排序--->想按照map中的值进行比较然后排序
          1、--->拿到值两种方式--->①map.get(key) ②entry.getvalue();
          2、要进行排序,那么需要定义排序规则,实现java.Util.comparator接口(x,y)->{}        x/y必须拿到map集合中的value值
                      x可以是map集合本身,也可以是entry
          3、x怎么做到,代表是entry
             ->当list集合中放的是entry,那么x就代表entry
             
          思路:
          1.将map集合转成list集合,并且list集合中元素是entry
          2.针对list集合进行排序
          ctrl + shift + o 快速导包

        代码如下:

        

 * 需求:按照字符出现的次数进行排序--->想按照map中的值进行比较然后排序
		 * 1、--->拿到值两种方式--->①map.get(key) ②entry.getvalue();
		 * 2、要进行排序,那么需要定义排序规则,实现java.Util.comparator接口(x,y)->{}		x/y必须拿到map集合中的value值
		 * 			x可以是map集合本身,也可以是entry
		 * 3、x怎么做到,代表是entry
		 *    ->当list集合中放的是entry,那么x就代表entry
		 *    
		 * 思路:
		 * 1.将map集合转成list集合,并且list集合中元素是entry
		 * 2.针对list集合进行排序
		 * ctrl + shift + o 快速导包
		 * 
		 */
		
		Set<Entry<Character,Integer>> entrySet2 = map.entrySet();
		List<Entry<Character, Integer>> list = new ArrayList<>(entrySet2);
		System.out.println("--------没有按字符出现次数-----------");
		System.out.println(map);
		System.out.println(list);
		Collections.sort(list,(x,y) -> x.getValue()-y.getValue());
		System.out.println("--------按字符出现次数-----------");
		System.out.println(list);

运行结果

 三、泛型

泛型之前:(不健壮代码,会在运行时才会把错暴露出来)

代码如下:

package com.zwc.map;

import java.util.HashSet;
import java.util.List;
import java.util.Set;


/**
 * 泛型
 * 		之前:不健壮代码,会在运行时才会把错暴露出来
 * 		之后:将潜在的问题暴露出来,早预防早治疗
 * 			 将运行期出现的异常转化为编印期的错误
 * @author Administrator
 *
 */
public class Demo3 {
	public static void main(String[] args) {
		Set set = new HashSet<>();
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		set.add(5);
        set。add("a");
		for (Object obj : set) {
			if(Integer.valueOf(obj.toString()) % 2 ==0) {
				System.out.println(obj);
			}
//			set.remove(obj);
		}
	}
}

运行结果:

 数据类型转换错误

       泛型之后 

                将潜在的问题暴露出来,早预防早治疗
                将运行期出现的异常转化为编印期的错误

             代码:

package com.zwc.map;

import java.util.HashSet;
import java.util.List;
import java.util.Set;


/**
 * 泛型
 * 		之前:不健壮代码,会在运行时才会把错暴露出来
 * 		之后:将潜在的问题暴露出来,早预防早治疗
 * 			 将运行期出现的异常转化为编印期的错误
 * @author Administrator
 *
 */
public class Demo3 {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<>();
		set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		set.add(5);
		for (Object obj : set) {
			if(Integer.valueOf(obj.toString()) % 2 ==0) {
				System.out.println(obj);
			}
//			set.remove(obj);
		}
	}
}

运行结果

四、集合框架工具类

        代码展示:

package com.zwc.map;

import java.util.Arrays;
import java.util.List;

/**
 * 集合之间的相互转换
 * 1、数组转成集合,本质上依然是一个数组,长度是不可变的
 * 2、集合与数组所具备的方法是不一样的,对于数组而言,就没有判断内部包含哪个元素
 * @author Administrator
 *
 */
public class Demo4 {
	public static void main(String[] args) {
		 String[] arr= {"a","b","c","d"};
		 List<String> list = Arrays.asList(arr);
//		 Object[] array = list.toArray();
		 list.add("e");
//		  java.lang.UnsupportedOperationException
		 System.out.println(list.size());
		 
		 
	}
}

结论:

          集合之间的相互转换        
                 1、数组转成集合,本质上依然是一个数组,长度是不可变的
                2、集合与数组所具备的方法是不一样的,对于数组而言,就没有判断内部包含哪个元素 

代码如下:

package com.zwc.map;

import java.util.Arrays;
import java.util.List;

/**
 * 集合之间的相互转换
 * @author Administrator
 *
 */
public class Demo4 {
	public static void main(String[] args) {
		 String[] arr= {"a","b","c","d"};
		 List<String> list = Arrays.asList(arr);
//		 Object[] array = list.toArray();
		 list.add("e");
//		  java.lang.UnsupportedOperationException
		 System.out.println(list.size());
		 
		 
	}
}

运行结果:

其他工具类方法的应用

        sort

        tostring

package com.zwc.map;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 对于工具类其他方法的应用
 * sort
 * toString
 * @author Administrator
 *
 */
public class Demo5 {
	public static void main(String[] args) {

		
		List<Person> list = new ArrayList<>();
		list.add(new Person("b", 18));
		list.add(new Person("c", 20));
		list.add(new Person("a", 22));
		System.out.println("--------直接打印--------");
		System.out.println(list);
//		Collections.sort(list);
		System.out.println("--------按字母顺序--------");
		Collections.sort(list, (x,y) -> x.getName().compareTo(y.getName()));
		System.out.println(list);
		
		Integer[] arr = {2,5,6,3,8,9};
		Arrays.sort(arr);//升序
		Arrays.sort(arr,(x,y)-> y - x);//降序
		System.out.println(Arrays.toString(arr));
	}
}
class Person /*implements Comparable<Person>*/{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
//	@Override
//	public int compareTo(Person o) {
//		return o.getName().compareTo(this.name);
//	}
	
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值