day_18 散列表、泛型

散列表、泛型

1.Set
    1.1 HashSet使用
        for(Object object:set){}

2.散列表(哈希表)
    2.1 概述
        散列结构 可以理解为 数组中保存的是链表的首节点,用来保存k和v 键值对操作
        hash算法 一种安全的加密机制,可以把不定长的数据转换为定长数据,并且不能保证其唯一性,又叫哈希冲突
        在java中指的就是hashCode方法
        对一个对象生成多次hash值,值一定相同,多个对象可能生成相同的hash值,为哈希冲突
        k不可以重复,v可以重复

        添加过程
            1.根据要添加的key,调用的它的hashCode方法,生成hash值
            2.通过一定的算法,根据hash值生成数组的下标
            3.判断该下标是否有数据,如果没有就把该键值对映射关系保存到数组中
            4.若该下标有数据,则调用key的equals方法和对应的所有数据进行比较,不相等则添加到尾部
            5.如果有相同数据,key不再添加,但是value值会替换原来的value值
                因为链表在查询性能上较差,所以每个数组中的链表个数如果大于等于7,则会转换为红黑树
                数组默认初始化容量为16

            节点内布类为单向链表,保存当前hash值、添加的key、添加的value、下一个节点对象

3.Map 
    3.1概述
        Map是无序的,并且保存的是kv键值对映射关系
        HashMap:底层是散列表
        TreeMap:底层是红黑树

        映射关系:比如商品和购买数量

    3.2继承体系
        见笔记中图

    3.3常用方法
        HashMap map = new HashMap();    //创建map
        map.put("A","one");             //添加K V
                                        //K 重复不添加,value替换
                                        //支持k和v都null,但没有意义
        System.out.println(map.size()); //个数
        System.out.println(map.get("A"));//根据k获取v的值
        System.out.println(map.containsKey(k)); //判断是否包含某个k
        System.out.println(map.containsValue("one"));   //判断是否包含某个value
        map.remove();                   //根据key删除该映射关系,返回对应的value值
        
        Collection values = map.values();   //获取所有的value,并放到集合中返回                                        
        for(Object object:values){
            System.out.println(object);
        }
        
        //keyset:获取所有key,封装到set对象中并返回
        Set keys = map.leySet();
        for(Object object :keys){
            System.out.println(object + ":" + map.get(object));
        }

        //把map转换为set。Entry类中,保存了k和v两个变量,把map中的k和v转换额外ientry类的
        对象存储,所以我们只需要保存entry对象,就相当于保存了k和v
        Set set = map.entrySet();
        for(Object object:set){
            System.out.println(object);
            Entry entry = (Entry) object;       //转换为entry类型
            System.out.println(entry.getKey()+ ":" +entry.getValue());
        }

    3.5 TerrMap
        保存的元素会按照一定的规则进行排序,底层是红黑树

        使用compareTo时,如果返回类型是double,不能直接比较返回,应return 1;这种

4.泛型
    4.1概述
        在编译过程中检测数据类型是否匹配
        必须是引用类型,不能使用基本类型
        优点:统一了数据类型,减少了类型转换
        缺点:只能保存同一种类型

    4.2使用方式
        //没有使用泛型,什么也能放,取的时候拿到的是Object,使用
        //需要进行判断和向下转型才行

        //使用泛型 规定 该集合中 只能保存A类型
        List<A> list2 = new ArrayList<A>();
        list2.add(new A());
        //添加其他的报错,而且是编译报错
        //使用的时候拿到的就直接是A类型,不会出现类型转换异常,因为只要能运行一定是A
        for(A a: list2){

        }

    4.3注意
        泛型只能写引用类型,若想保存基本类型,需要编写对应的包装类类型
        List<int> list3 = new ArrayList<int>();
        List<Integer> list4 = new ArrayList<Integer>();

    4.4自定义泛型
        使用大写字母A~z表示,写什么都一样,占位符而已,但某些字符有特殊含义
        E:Element 一般代表元素,而集合中的数据我们叫元素
        K:key表示键
        V:value表示值,k和v一般在散列表中出现(Map)
        T:type表示一个Java类型
        N:表示number
        ?:表示不确定的类型

        如果规定了泛型使用的地方没有指定泛型,则默认Object类型

5.题
    Map以Value进行排序
    Map是没办法按照value排序的,因为源码中写死了,用key比较
    所以只能保存到list中进行排序
    
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<String, Integer>();
        map.put("b", 11);
        map.put("a", 21);
        map.put("c", 145);
        map.put("d", 41);
        map.put("e", 15);
        System.out.println(map);
        // 把Map封装到entry中并保存到set中
        Set set = map.entrySet();
        // 把Set 保存到list中 , 通过ArrayList的有参构造可以直接把set转换为list
        List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>> (set);
        // 排序
        Collections.sort(list, new Comparator<Entry<String, Integer>>() {
            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                return o1.getValue()-o2.getValue();
            }
        });
        System.out.println(list);
    }

tab 取数据


map:保存k和v

 entry遍历就和map没有关系了

 泛型:中药柜子
 泛型01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值