HashMap和TreeMap

  • 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存储结构
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值