J2EE基础:集合框架之Map

目录

一.特点

1.增删改查

2.键值对形式存在

3.key可以为空

二.遍历方式

1.entrySet

2.keySet

 三.常用实现类HashMap

1.面试题:统计字符串个字母出现的次数

2.怎么能够按字符进行排序

3.debugger的使用:调试代码 

 四.泛型

1.作用

2.泛型

3.泛型方法

五.集合框架工具类

1.Collections 集合

2.Arrays 数组

面试题:

 解决方案:

2.2:对于这个集合而言,集合也是可以转换为数组的toArray


一.特点

1.增删改查

package com.jiangwenjuan.map;


import java.util.Map;
import java.util.Set;

/**
 * 	map集合的特点
 *
 * @author JWJ
 *
 * @date 2022年6月9日 上午11:26:38
 */
public class Demo1 {
	public static void main(String[] args) {
		
		
		Map<String,Integer> map = new HashMap<>();
//		增加
//		 V put(K key, V value);
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		map.put("d", 4);
		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"));
		
		
		
		
	}

}

结果为:

 

2.键值对形式存在

Map的里面的put的方法,具备添加的功能也具备修改的功能

Map:
    Map<String,Integer> map = new HashMap<>();
//    增加:
    map.put("a",1);
    //        键       值
    // V put(K key, V value);

Hashtable:
      Hashtable<Object, Object> table = new Hashtable<>();
//    增加      
	    table.put("a", 1);
//                                键       值
//    public synchronized V put(K key, V value)

3.key可以为空

在jdk1.8以下hashtable的key不能存放null

package com.jiangwenjuan.map;

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

/**
 * 	map集合的特点
 * 		键值对
 *
 * @author JWJ
 *
 * @date 2022年6月9日 上午11:26:38
 */
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("a", 1);
		map.put("b", 2);
        map.put("null",2);
		map.put("c", 3);
		map.put("d", 4);
		System.out.println(map);
		
	}

}

二.遍历方式

1.entrySet

2.keySet

区别1:注意:Hashtable有同步方法的,相较比较安全

Hashtable<Object, Object> table = new Hashtable<>();

//		 public synchronized V put(K key, V value)

 区别2:而注意:HashMap没有,相对不安全

	Map<String,Integer> map = new HashMap<>();

//		 V put(K key, V value);

面试题:HashMap与Hashtable的区别:1.Hashtable是线程安全的

package com.jiangwenjuan.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 JWJ
 *
 * @date 2022年6月9日 上午11:26:38
 */
public class Demo1 {
	public static void main(String[] args) {
		Hashtable<Object, Object> table = new Hashtable<>();
        //注意:Hashtable有synchronized同步方法,相较比较安全

//		 public synchronized V put(K key, V value)
		table.put("a", 1);
//		table.put("null", null);
		
		
		Map<String,Integer> map = new HashMap<>();
//		增加
        //注意:HashMap没有,相对不安全

//		 V put(K key, V value);
		map.put("a", 1);
		map.put("b", 2);
		map.put("null",2);
		map.put("c", 3);
		map.put("d", 4);
		System.out.println(map);

		
//		查询所有
//		第一种方式:先拿到map集合中的所以的key
		Set keys = map.keySet();
		for (Object key : keys) {
			System.out.println("键:"+key+";值:"+map.get(key));
		}
		System.out.println("===============");
		
//		第二种方式:拿到映射关系
		Set<Entry<String,Integer>> entrySet = map.entrySet();
		for (Entry<String, Integer> entry : entrySet) {
			System.out.println("键:"+entry.getKey()+";值:"+entry.getValue());
		}
	}

}

结果为:

 三.常用实现类HashMap

1.面试题:统计字符串个字母出现的次数

String s="sjflajlfjalewfjwjelkfjwlkefjlkwajflajljfl";

需要一个Map容器,比如这张图:

实现思路:

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

代码块:

package com.jiangwenjuan.map;

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

public class Demo2 {
	public static void main(String[] args) {
		String s="sjflajlfjalewfjwjelkfjwlkefjlkwajflajljfl";

		
		char[] arr = s.toCharArray();
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		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集合

Map<Character, Integer> map = new TreeMap<>();

 结果为:

3.debugger的使用:调试代码 

       1.打断点 双击即可
      2.采用debugger的方式运行程序

3.进入调试窗口,左上方有一个step over调试箭头,快捷键F6

这里下一步,下一步就一个一个字符出现的出现.
 4.接下来可以通过F6一步步调试当前程序对应的每一个变量值 

 四.泛型

1.作用

        ①.将运行时产生的异常转换为编译期的错误什么意思:下面讲解

          ②.提高代码的健壮性

当这行代码你还没有运行时是:之前:不健壮的代码,会在运行时才会把错误暴露出来

加上Set<Integer> set = new HashSet<>();就会直接告诉你不能加入字符串,因为是整数

Set<Integer> set = new HashSet<>();
        set.add(1);
		set.add(2);
		set.add(3);
		set.add(4);
		set.add(5);
		set.add("a");
package com.jiangwenjuan.map;

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

/**
 * 	泛型
 * 	
 * @author JWJ
 *
 * @date 2022年6月9日 下午8:12:53
 */
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);//出错
		}
	}

}

当你运行的时候结果出来时:之后:将潜在的问题暴露出来,早预防早治疗 

2.泛型

        ①.通用的增删改查

之前我们就是要在BookDao里面写很多增删改查方法,现在只要写一个方法即可通用

下面这些就是泛型的作用

class BookDao{
//	add(Bokk book)
//	add(Bokk book)
//	add(Bokk book)
//	add(Bokk book)
}
class UserDao extends BaseDao{
	
}
class BaseDao<T>{
	void add(T t) {
		
	}
	void del(T t) {
			
		}
	void edit(T t) {
		
	}
	List<T> list(T t) {
		return null;
	}
	
}

3.泛型方法

        ②.通用结果集处理

Result 的类没有任何的这个 <T> 你又想添加一个方法,怎么加呢,

就在前面加<T> 这就是泛型方法

class Result{
	<T> void del(T t) {
		
	}
}

五.集合框架工具类

1.Collections 集合

        ①.排序
        ②.集合转数组:toArray

2.Arrays 数组

        ①.toString

        ②.asList  数组可以转换为集合

         ③.sort

面试题:

arr是数组,数组长度是不可变的,然后把它转为list,list集合的长度是可变的,这个list集合本身到底是集合还是数组,list能用集合的方法,但是会报错。

你把arr工具类转换成list集合,它底层还是一个数组,数组长度是不可变的,所以说你往这个数组里面在加一个元素,是没有用的,加不了

package com.jiangwenjuan.map;

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

/**
 * 集合之间的相互转换
 * @author JWJ
 *
 * @date 2022年6月9日 下午8:40:15
 */
public class Demo4 {
	public static void main(String[] args) {
//		数据长度是不可变的
		String[] arr = {"a","b","c","d"};
//		list长度是可变的
		List<String> list = Arrays.asList(arr);
		list.add("e");
//		java.lang.UnsupportedOperationException
		System.out.println(list.size());
	}

}

就会出错:

 解决方案:

        集合之间的相互转换:

          1.数组转成集合:本质上依然是一个数组,长度是不可变的

          2.集合与数组所具备的方法是不一样的,如对于数组而言,就没有判断内部包含哪个元素

解释:

把数组转换成一个集合,它本质上依然是一个数组,只不过你可以利用集合的方式去操作这个数组,因为集合里面有很多的方法,比如说:String element = list.add(index, element); 方法,这个在数组里面就没有

2.2:对于这个集合而言,集合也是可以转换为数组的toArray

数据长度是不可变的
		String[] arr = {"a","b","c","d"};
//		list长度是可变的
		List<String> list = Arrays.asList(arr);
		//转换为数组
		Object[] array = list.toArray();

     ①.Collections的自带排序及sort代码:

package com.jiangwenjuan.map;

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

/**
 *	 对于工具类其他方法的应用
 * 	sort
 * 	toString
 * @author JWJ
 *
 * @date 2022年6月9日 下午9:05:49
 */
public class Demo5 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("b");
		list.add("c");
		list.add("a");
		System.out.println(list);
//		自带排序规则
		Collections.sort(list);
		System.out.println("排序"+list);
//		改变排序
//		这里面x,y指的是集合中的元素
		Collections.sort(list, (x,y)-> y.compareTo(x) );
		System.out.println("倒序排序"+list);
	}

}

结果为:

排序代码块:

这行就会报错:什么原因呢?

Collections.sort(list);
package com.jiangwenjuan.map;

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

/**
 *	 对于工具类其他方法的应用
 * 	sort
 * 	toString
 * @author JWJ
 *
 * @date 2022年6月9日 下午9:05:49
 */
public class Demo5 {
	public static void main(String[] args) {
		
		List<Person> list = new ArrayList<>();
		list.add(new Person("b", 16));
		list.add(new Person("c", 18));
		list.add(new Person("a", 20));
		System.out.println(list);
		Collections.sort(list);
		
	}

}
class Person{
	private String name;
	private int age;
	public Person() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
}

 怎么解决呢?

用昨天的方法:Person实现Comparable<>方法,然后在重写

class Person implements Comparable<Person>{
	private String name;
	private int age;

    @Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		return o.getName().compareTo(this.name);
	}
}

结果为:

 可不可以不实现Comparable<>,可以,怎么不实现呢,调用下一个方法:

Collections.sort(list, (x,y)-> x.getName().compareTo(y.getName()));
		System.out.println("排序:"+list);

结果为:

 降序排序与升序的排序:

Integer[] arr = {3,6,9,2,5,8};
//		降序排序
		Arrays.sort(arr, (x,y)-> y-x);
//		升序排序
//		Arrays.sort(arr);
		System.out.println("默认地址:"+arr);
		System.out.println("排序:"+Arrays.toString(arr));

结果为:

        降序:

降序排序:[9, 8, 6, 5, 3, 2]

          升序:

排序:[2, 3, 5, 6, 8, 9]

案例:按照字符出现的次数进行排序-->想按照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();
//		把map集合转换成list
		List<Entry<Character, Integer>> list = new ArrayList<>(entrySet2);
		
		System.out.println(map);
		System.out.println(list);
		
		Collections.sort(list, (x,y)->x.getValue() - y.getValue());
		System.out.println(list);

结果: 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值