一、Map
1.概述
存储键值对数据 将键映射到值的对象
元素的集合,键值对的集合 K-V 键值对
1)键值对
key,value可以为任意引用数据类型的数据
key–> 唯一的,无序的 --> Set集合 value --> 无序的,可重复的 -->Collection
2)键值对分析
键值对为一个映射关系
key–> 映射–>value
一个key只能对应一个value
一个key可以实现对应一个集合作为value,集合中可以存放多个值
2.Map中的常用方法(功能)
a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数
public static void main(String[] args) {
Map<Integer,String> map = new HashMap();
//常用方法
//V put(K key, V value) 返回被覆盖的value,如果没有覆盖返回null
System.out.println(map.put(103,"胡歌"));
System.out.println(map.put(104,"胡歌"));
System.out.println(map.put(102,"彭于晏"));
System.out.println(map);
System.out.println(map.put(104,"胡一菲"));
System.out.println(map);
/*
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true 。
*/
System.out.println(map.containsKey(103));
System.out.println(map.containsValue("彭于晏"));
//V get(Object key) 返回指定键映射到的值,如果此映射不包含键的映射,则返回 null 。
System.out.println(map.get(103));
//static <K,V> Map<K,V> of(K k1, V v1) 返回包含单个映射的不可修改的映射。
Map<String,Integer> map1 = Map.of("zhangsan",18,"lisi",19);
System.out.println(map1);
}
1)Map集合的遍历方式
1.keySet() 获取集合中所有的key,然后遍历key,根据key获取value
2.values() 获取集合中所有的value
3.entrySet() 返回多个Map.Entry类型的键值对对象,一个set集合
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(102,"胡歌");
map.put(103,"胡歌");
map.put(104,"胡一菲");
map.put(105,"胡一天");
//1.keySet
Set<Integer> keys = map.keySet();
for (Integer i:keys){
System.out.println(i+"-->"+map.get(i));
}
//2.values()
Collection<String> value = map.values();
Iterator<String> it = value.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
//3.entrySet()
Set<Map.Entry<Integer,String>> set = map.entrySet();
for (Map.Entry entry:set){
System.out.println(entry.getKey()+"-->"+entry.getValue());
}
}
二、HashMap实现类
1.概述
底层: 哈希表(数组+链表+红黑树)
特点: 查询,增删效率较高
新增方法: 无新增方法
遍历方式: 与map相同 并允许null值和null键
另:
DEFAULT_LOAD_FACTOR : 默认的加载因子 0.75
DEFAULT_INITIAL_CAPACITY : 默认初始容量 1<<4 = 16
threshold 扩容临界值 | 阀值 CAPACITY*LOAD_FACTOR
扩容: newCap = oldCap << 1 每次扩容原数组容量的2倍
去重: key中存储数据的类型要求重写hashcode与equals方法
2.练习
定义一个HashMap结构,用来存储指定类型的数据,要求存储key为Teacher,value为Teacher所教授的学科
public static void main(String[] args) {
//构建一个HashMap
HashMap<Teacher,String> map = new HashMap<>();
map.put(new Teacher("laoshi",false,"java"),"java");
map.put(new Teacher("李老师",false,"db"),"db");
map.put(new Teacher("曹老师",false,"web"),"web");
map.put(new Teacher("曹老师",false,"web"),"前端");
System.out.println(map);
}
三、TreeMap实现类
根据key实现去重
1.概述
底层结构: 红黑树
特点: 根据key对数据做升序排序
新增功能: 比较相关的一些方法
1)TreeMap里的去重和排序都是根据key值来判断的
要求: key指定比较规则|方式|比较器|排序
内部比较器 外部比较器 前面讲过,就不具体分析了
2.例题
定义TreeMap存储键值对数据,key为Teacher
1)首先新建一个javabean的Teacher类
public class Teacher {
private String name;
private boolean gender; //true女 false男
private String subject;
public Teacher() {
}
public Teacher(String name, boolean gender, String subject) {
this.name = name;
this.gender = gender;
this.subject = subject;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", gender=" + gender +
", subject='" + subject + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return gender == teacher.gender &&
Objects.equals(name, teacher.name) &&
Objects.equals(subject, teacher.subject);
}
@Override
public int hashCode() {
return Objects.hash(name, gender, subject);
}
}
2)引用实现
public static void main(String[] args) {
//根据key默认比较规则,对数据进行升序排序
//TreeMap<Teacher,String> tree = new TreeMap<>();
//根据实参传递的外部比较规则,对key数据进行升序排序
//lambda表达式简化
TreeMap<Teacher,String> tree = new TreeMap<>((t1,t2)->t1.getSubject().compareTo(t2.getSubject()));
tree.put(new Teacher("laoshi",false,"java"),"java");
tree.put(new Teacher("李老师",false,"db"),"db");
tree.put(new Teacher("曹老师",true,"web"),"web");
tree.put(new Teacher("曹老师",false,"web"),"前端");
System.out.println(tree);
System.out.println(tree.firstKey());
System.out.println(tree.firstEntry()+"-->"+tree.firstEntry().getKey());
}
四、Properties实现类
1.概述
存储的键值对都是字符串
Properties可以保存到流中或从流中加载。
1)软编码 经常修改的内容
软编码 : 经常改动的内容不要定义在源代码中,定义在一个外部的文件中–>配置文件,从程序中每次动态从文件中进行读取内容,使用读入的最新内容
在项目中新建一个配置文件 配置文件 : properties格式,符合Properties特点: 键值对 都是字符串
2.常用方法(功能)的调用
public class Class05_Properties {
public static void main(String[] args) throws IOException {
Properties pro = new Properties();
//设置键值对为字符串数据
pro.setProperty("name","zhangsan");
pro.setProperty("pwd","12345");
//设置键值对为字符串的数据
System.out.println(pro.getProperty("name"));
System.out.println(pro);
//void load(InputStream inStream) 从输入字节流中读取属性列表(键和元素对)。
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
//从配置文件中读取数据
System.out.println(pro.getProperty("name"));
System.out.println(pro.getProperty("pwd"));
}