- HashMap
package com.uncle.myutil.testmap;
/**
* Map 映射 通过某一个key可以直接定位到一个value值
* 存储的方式以 键值对 存储 key-value
* key无序无重复 value无序可重复
* key无序还是一样,指的是存入顺序与取得顺序不一致
* key无重复当然指的是 元素不能一致
*
* 1.map基本使用
* HashMap
* TreeMap
* Properties
*
* HashMap
* 1.包 java.util
* 2.如何创建对象
* 3.基本方法
* 增删改查
* 增put(key,value) 存放一组映射关系 key-value
* 1.key存储的顺序与取得顺序不同
* 2.不同的key可以存储相同的value
* 3.key若有相同的 则将 原有的value覆盖而不是拒绝存入(跟set刚好相反)
* 删E = remove(key);
* 改put(key,value1) put(key,value2)
* replace(key,newValue)
* 查E = get(key)
* 遍历map集合? key不一定什么样
* 获取到所有的key 遍历key 通过key获取value
* Set<Key> = keySet()获取全部的key
* Set<Entry> = entrySet();
* size();
* 4.除了上述几个常用的方法外 其他API中提供的方法
* clear containsKey(key) containsValue(value)
* getOrDefault(key,defaultValue);如果key存在就返回对应的value 若没有找到则返回默认值
* isEmpty()
* putAll(map)
* putIfAbsent(key,value);//如果key不存在才向集合内添加 如果key存在就不添加啦
* 5.map集合在什么情形下用?
* 1.想要存储一组元素
* 数组 or 集合 如果存储的元素以后长度不变用数组 如果长度以后不确定 用集合
* 2.如果发现长度以后不确定--->集合
* List Set Map
* List家族有序的 存储有顺序用这个
* ArrayList 更适合遍历轮询
* LinkedList 更适合插入和删除
* Stack LIFO
* Set家族无重复 存储元素希望自动去掉重复元素用这个
* Hash 性能更高
* Tree 希望存进去的元素自动去重复 同时还能自动排序
* Map家族k-v 通过唯一的k快速找寻v用这个
* Hash 性能更高
* Tree 希望存进去的元素key自动排序
* 6.HashMap底层的数据结构存储
* 散列表的形式 数组+链表
* Person对象存入HashMap中? 可以
* hashCode方法---->不同的对象 可以产生相同的hashCode码的
* 不同的hashCode码-->不同的对象
*/
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class TestHashMap {
public static void main(String[] args){
//创建一个HashMap对象
HashMap<Integer,String> map = new HashMap<Integer,String>();
//将一些key-value的映射关系存入集合
map.put(2,"bbb");
map.put(5,"eee");
map.put(6,"aaa");//key不同 value与1相同
map.put(4,"ddd");
map.put(3,"ccc");
map.put(5,"xxx");//key相同 value与之前的5不同
map.put(1,"aaa");
Set<Entry<Integer,String>> entrys = map.entrySet();//获取集合中全部的entry对象
Iterator<Entry<Integer,String>> it = entrys.iterator();
while(it.hasNext()){
Entry<Integer,String> entry = it.next();//entry key value
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"--"+value);
}
// map.putIfAbsent(20,"yyy");
// System.out.println(map);
//
// System.out.println(map.getOrDefault(10,"1000"));
//
// //获取map集合的全部key
// Set<Integer> keys = map.keySet();
// //通过迭代器遍历keys
// Iterator<Integer> it = keys.iterator();
// while(it.hasNext()){
// Integer key = it.next();
// String value = map.get(key);
// System.out.println(key+"---"+value);
// }
// System.out.println(map);
// map.remove(3);
// System.out.println(map);
}
}
- TreeMap
package com.uncle.myutil.testmap;
/**
* TreeMap 自然有序 按照Unicode编码自然有序
* map集合中的key需要可比较的 key的对象需要实现Comparable接口
* 1.java.util包
* 2.构造方法
* 无参数 带map参数
* 3.常用方法
* put get remove replace size
* 4.底层数据结构的存储
* 红黑二叉树
*/
import java.util.TreeMap;
public class TestTreeMap {
public static void main(String[] args){
TreeMap<Integer,String> map = new TreeMap<Integer,String>();
map.put(5,"e");
map.put(2,"b");
map.put(3,"c");
map.put(7,"g");
map.put(1,"a");
map.put(8,"h");
map.put(9,"i");
map.put(4,"d");
map.put(6,"f");
System.out.println(map);
}
}
- 小案例
package com.uncle.myutil.testmap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
public class LoginService {
//设计一个方法 用来登录认证 一维数组
// private String[] userBox = new String[]{"步尔斯特","大叔","Java"};
// private int[] passwordBox = new int[]{123,666,888};
// public String loingForArray(String name,String password){
// for(int i=0;i<userBox.length;i++){
// if(userBox[i].equals(name)){
// if(passwordBox[i]==Integer.parseInt(password)){
// return "登录成功";
// }
// break;
// }
// }
// return "用户名或密码错误";
// }
//设计一个方法 用来登录认证---ArrayList
// private ArrayList<String> userBox = new ArrayList<String>();
// {
// userBox.add("步尔斯特-123");
// userBox.add("大叔-666");
// userBox.add("Java-888");
// }
// public String loginForList(String name,String password){
// for(int i=0;i<userBox.size();i++){
// String[] value = userBox.get(i).split("-");//一个人的信息 v[0] v[1]
// if(value[0].equals(name)){
// if(value[1].equals(password)){
// return "登录成功";
// }
// break;
// }
// }
// return "用户名或密码错误";
// }
//设计一个方法 用来登录认证-----Set
// private HashSet<String> userBox = new HashSet<String>();
// {
// userBox.add("步尔斯特-123");
// userBox.add("大叔-666");
// userBox.add("Java-888");
// }
// public String loginForSet(String name,String password){
// Iterator<String> it = userBox.iterator();
// while(it.hasNext()){
// String[] value = it.next().split("-");
// if(value[0].equals(name)){
// if(value[1].equals(password)){
// return "登录成功";
// }
// break;
// }
// }
// return "用户名或密码错误";
// }
//设计一个方法 用来登录认证---map name(唯一) pass
private HashMap<String,Integer> userBox = new HashMap<String,Integer>();
{
userBox.put("步尔斯特",123);
userBox.put("大叔",666);
userBox.put("Java",888);
}
public String loginForMap(String name,String password){
Integer realPassword = userBox.get(name);//null
if(realPassword!=null && realPassword.equals(Integer.parseInt(password))){//人名存在
return "登录成功";
}
return "用户名或密码错误";
}
}
- Hash结构
- Tree存储结构