1.HashMap
- 注意点:当引用类型放在键的位置上时,要想键不重复,就必须在引用类上重写 hashCode()和 equals() 方法
HashMap和Hashtable的区别
- 1、HashMap中允许null键和null值存在,而Hashtable不允许(键和值都不允许为null)
- 2、HashMap是线程不安全的,而Hashtable是线程安全的
package com.shujia.wyh.day21;
import java.util.HashMap;
import java.util.Hashtable;
/*
HashMap和Hashtable的区别
1、HashMap中允许null键和null值存在,而Hashtable不允许(键和值都不允许为null)
2、HashMap是线程不安全的,而Hashtable是线程安全的
*/
public class HashMapAndHashtable {
public static void main(String[] args) {
HashMap<String, String> map1 = new HashMap<>();
map1.put(null,null);
Hashtable<String, String> table1 = new Hashtable<>();
// table1.put("123",null);
// table1.put(null,"qqq");
}
}
HashMap案例
HashMap<String,String>
代码如下:
package com.bigdat.java.day22;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
HashMap案例
HashMap<String,String>
*/
public class HashMapDemo1 {
//创建 HashMap 的实例
public static void main(String[] args) {
HashMap <Integer,String> hashMap = new HashMap();
//向集合中添加元素
hashMap.put(10001, "年轻人!");
hashMap.put(10002, "要努力!");
hashMap.put(10003, "多奋斗!");
hashMap.put(10004, "年轻不吃苦!");
hashMap.put(10005, "啥时候吃苦呢?");
// 由键找值 遍历
Set<Integer> integers = hashMap.keySet();
//增强 for 循环
for (Integer integer : integers) {
String s = hashMap.get(integer);
System.out.println("代码:"+integer+",对应值:"+s);
}
System.out.println("============================");
//迭代器遍历
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
String s = hashMap.get(next);
System.out.println("代码:"+next+",对应值:"+s);
}
System.out.println("=====================================");
// entrySet() 遍历
Set<Map.Entry<Integer, String>> entries = hashMap.entrySet();
//增强 for循环
for (Map.Entry<Integer, String> entry : entries) {
Integer key = entry.getKey();
final String f = entry.getValue();
System.out.println("键:"+key+",对应值:"+f);
}
System.out.println("=======================================");
// 迭代器遍历
Iterator<Map.Entry<Integer, String>> iterator1 = entries.iterator();
while (iterator1.hasNext()){
Map.Entry<Integer, String> next = iterator1.next();
Integer key = next.getKey();
String value = next.getValue();
System.out.println("键:"+key+",对应值:"+value);
}
}
}
引用类型
package com.bigdat.java.day22;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
HashMap<String,Student>
*/
public class HashMapDemo3 {
public static void main(String[] args) {
//创建 HashMap 对象
HashMap<Integer, Student03> smap = new HashMap<>();
//创建学生类对象
Student03 s1 = new Student03("刘德华",29);
Student03 s2 = new Student03("周润发",22);
Student03 s3 = new Student03("黎明",32);
Student03 s4 = new Student03("吴宗宪",24);
Student03 s5 = new Student03("吴宗宪",24);
Student03 s6 = new Student03("吴宗宪",25);
//将学生对象添加到集合中
smap.put(1001, s1);
smap.put(1002, s2);
smap.put(1003, s3);
smap.put(1004, s4);
smap.put(1005, s5);
smap.put(1006, s6);
//向集合中添加元素
//底层依赖是元素的hashCode() 和equals 方法
//因为底层保证唯一的只是针对于键来说的并没有对值做唯一的逻辑运算
//遍历学生
Set<Integer> integers = smap.keySet();
for (Integer integer : integers) {
Student03 student03 = smap.get(integer);
System.out.println("编号:"+integer+",学生信息:"+student03);
}
System.out.println("==================================");
Set<Map.Entry<Integer, Student03>> entries = smap.entrySet();
for (Map.Entry<Integer, Student03> entry : entries) {
Integer key = entry.getKey();
Student03 value = entry.getValue();
System.out.println("编号:"+key+",学生信息:"+value);
}
}
}
学生类:
package com.bigdat.java.day22;
import java.util.Objects;
/*
创建学生类
*/
public class Student03 {
private String name;
private int age;
public Student03() {
}
public Student03(String name, int age) {
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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student03 student03 = (Student03) o;
return age == student03.age && Objects.equals(name, student03.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student3{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
LinkedHashMap集合
- 概述:public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
哈希表和链表实现的Map接口,具有可预测的迭代次序。 这种实现不同于HashMap,它维持于所有条目的运行双向链表。
哈希表保证了元素的键的唯一性
双链表保证元素的键的迭代次序
package com.shujia.wyh.day21;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/*
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
哈希表和链表实现的Map接口,具有可预测的迭代次序。 这种实现不同于HashMap,它维持于所有条目的运行双向链表。
哈希表保证了元素的键的唯一性
双链表保证元素的键的迭代次序
*/
public class LinkedHashMapDemo {
public static void main(String[] args) {
//创建集合对象
LinkedHashMap<String, String> lhm = new LinkedHashMap<>();
//向集合中添加元素
lhm.put("1001", "张三");
lhm.put("1002", "李四");
lhm.put("1003", "王五");
lhm.put("1002", "赵六");
lhm.put("1001", "张三");
lhm.put("1004", "张三");
lhm.put("1005", "张三");
//遍历集合
Set<Map.Entry<String, String>> entries = lhm.entrySet();
for (Map.Entry<String, String> keyValue : entries) {
String key = keyValue.getKey();
String value = keyValue.getValue();
System.out.println(key + ":" + value);
}
}
}