java进阶打卡11

HashMap存储自定义类型键值

Map集合保证key是唯一的:
    作为key的元素,必须重写hashCode和equals方法,以保证key唯一

1. HashMap存储自定义类型键值
    key:String类型
        String类重写了hashCode方法和equals方法,可以保证key唯一
    value:Person类型
        value可以重复(同名同年龄的人视为同一个)
        
例如:	HashMap<String, Person> map = new HashMap<>();
		map.put("XX", new Person("Xxx",18));
		
		// 使用keySet加增强for遍历Map集合
        Set<String> set = map.keySet();
        for (String key : set) {
            Person value = map.get(key);
            System.out.println(key + "-->" + value);
        }

2. HashMap存储自定义类型键值
    key:Person类型
        Person类型就必须重写hashCode方法和equals方法,以保证key唯一
    value:String类型
        可以重复

例如:	HashMap<Person, String> map = new HashMap<>();
		map.put(new Person("Xxx",18),"XX");

		// 使用entrySet和增强for遍历Map集合
        Set<Map.Entry<Person, String>> set = map.entrySet();
        for (Map.Entry<Person, String> entry : set) {
            Person key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "-->" + value);
        }

LinkedHashMap集合

java.util.LinkedHashMap<K,V> extends HashMap<K,V>

Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
底层原理:
    哈希表 + 链表(记录元素的顺序)

HashMap<String, String> map = new HashMap<>();
map.put("a","a");
System.out.println(map); // key不允许重复,无序

LinkedHashMap<String, String> linked = new LinkedHashMap<>();
linked.put("a","a");
System.out.println(linked);// key 不允许重复,有序 

Hashtable集合

java.util.Hashtable<K,V>集合 implements Map<K,V>接口

Hashtable:底层是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

HashMap集合(之前学的所有集合):可以存储null值,null键
Hashtable集合:不能存储null值,null键

Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流结合的集合

HashMap<String,String> map = new HashMap<>();
        map.put(null,"a");
        map.put("b",null);
        map.put(null,null);

Hashtable<String,String> table = new Hashtable<>();
		// table.put(null,"a"); // NullPointerException
		// table.put("a",null); // NullPointerException
		// table.put(null,null); // NullPointerException

Map集合练习

计算一个字符串中每个字符出现次数

  • 分析
使用Scanner获取用户输入的一个字符串
	aaabbbbcca
	a			4
	b			4
	c			2
	不能重复		可以重复
	字符		统计个数
HashMap<Character,Integer>	

遍历字符串,获取每一个字符
	1. String类的方法toCharArray,把字符串转换为一个字符数组,遍历数组
	2. String类的方法length() + charAt(索引)

使用Map集合中的方法判断获取到的字符是否存储在Map集合中
	1. 使用Map集合中的方法containsKey(获取到的字符),返回的是boolean值
		true:字符存在
			通过字符(Key),获取value(统计个数)
			把value++
			再把新的value存储到Map集合中
		false:字符不存在
			把字符作为key,1作为value存储到Map集合中
	2. 使用Map集合的get(key)
		返回null,key不存在
		不是null,可以存在
  • main方法
分析:
    1. 使用Scanner获取用户输入的字符串
    2. 创建Map集合,key是字符串中的字符,value是字符的个数
    3. 遍历字符串,获取每一个字符
    4. 使用获取到的字符串,去Map集合判断key是否存在
        key存在:
            通过字符串(key),获取value(字符个数)
            value++
            put(key,value)把新的value存储到Map集合中
        key不存在:
            put(key,1)
    5. 遍历Map集合,输出结果

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个字符串:");
    String str = sc.next();
       
    HashMap<Character,Integer> map = new HashMap<>();
    
    for(char c : str.toCharArray()){
    	if(map.containsKey(c)){
         	//key存在
            Integer value = map.get(c);
            value++;
            map.put(c,value);
         } else {
         	//key不存在
            map.put(c,1);
         }
	}
       
	for(Character key : map.keySet()) {
    	Integer value = map.get(key);
    	System.out.println(key + "=" + value);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java员工打签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值