Java集合框架总结(二)

                                            

                 接上一篇文章《Java集合框架(一)》,今天我们对双列集合展开来进行分析。

Map集合:

         一、首先我们先对Map有一个基础的认识:

                1、Map集合被称为双列集合,合适:{key1 = value1, key2 = value2 , key3 = value3, ......},一次需要储存一堆数据作为一个元素。

                2、Map集合的每个元素 “key = value” 称为一个键值对/键值对对象/一个Entry对象,Map集合也被称为 “键值对集合”。

                3、Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己的对应的值。

                总之通俗一点就是:一瓶饮料 —— 五元,其中“一瓶饮料”就是键,“五元”就是值,他们是对应的,被称为键值对。

        二、Map集合包含了:HashMap,LinkedHashMap,Treemap。特点如下:

                1、HashMap:无序,不重复,无索引;

                2、LinkedHashMap:有序,不重复,无索引;

                3、TreeMap:按照大小默认升序排序,不重复,无索引;

        三、常用方式:

       代码如下:

package d9_map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Map_Test2 {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("手表",100);
        map.put("手表",200);
        map.put("手机",2);
        map.put("java",2);
        map.put(null,null);
        System.out.println(map);

        //获取集合的大小
        System.out.println(map.size());

        //清空结合
//        map.clear();
//        System.out.println(map);

        //判断集合是否为空,为空返回true,反之
        System.out.println(map.isEmpty());

        //根据键获取对应值
        int v1 = map.get("java");
        System.out.println(v1);

        //根据键删除整个元素(删除键会返回键的值)
        System.out.println(map.remove("手表"));

        //判断是否包含某个键,包含返回true,反之
        System.out.println(map.containsKey("手表"));
        System.out.println(map.containsKey("java"));

        //判断是否包含某个值
        System.out.println(map.containsValue(2));//true
        System.out.println(map.containsValue("2"));//false

        //获取Map集合的全部键
        System.out.println(map.keySet());

        //获取Map集合的全部值
        Collection<Integer> values=  map.values();
        System.out.println(values);

        //把其他Map集合的数据拷贝到自己的集合中去
        Map<String,Integer> map1 = new HashMap<>();
        map1.put("java",20);
        map1.put("java1",10);
        Map<String,Integer> map2 = new HashMap<>();
        map2.put("java3",10);
        map2.put("java",100);
        map1.putAll(map2);//把map2全部拷贝到map1中
        System.out.println(map1);
        System.out.println(map2);
    }
}

        四、遍历方式:

                1、键找值:

代码如下:

package d10_map_traverse;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapTest1 {
    public static void main(String[] args) {
        //准备一个Map集合。
        Map<String, Double> map = new HashMap<>();
        map.put("小红",162.5);
        map.put("小红",169.8);
        map.put("小明",165.8);
        map.put("小李",169.5);
        map.put("小赵",183.8);
        System.out.println(map);

        //获取Map集合的全部键
        Set<String> keys = map.keySet();
        System.out.println(keys);
        //遍历全部的键,根据键获取其对应的值
        for (String key : keys) {
            //根据键获取对应的值
            double value = map.get(key);
            System.out.println(key + "====>" +value);
        }
    }
}

                2、键值对:

代码如下:

package d10_map_traverse;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapTest2 {
    public static void main(String[] args) {
        Map<String, Double> map = new HashMap<>();
        map.put("小红",162.5);
        map.put("小红",169.8);
        map.put("小明",165.8);
        map.put("小李",169.5);
        map.put("小赵",183.8);
        System.out.println(map);

        //调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合
        Set<Map.Entry<String, Double>> entries = map.entrySet();
        for (Map.Entry<String, Double> entry : entries) {
            String key = entry.getKey();
            Double value = entry.getValue();
            System.out.println(key + "--->" + value);
        }
    }
}

HashMap底层原理:

        HashMapHashSet的底层原理相同,都是基于哈希表实现的。(Set系列的集合的底层原理就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据

                                哈希表(数组+链表+红黑树)

                ①    创建一个默认长度16的数组,默认加载因子为0.75,数组名table

                ②    使用元素的哈希值和对数组的长度求余计算出相应的存入位置

                ③    判断当前位置是否为null,如果是null直接存入

                ④    如果不为null,表示有元素,则调用equals方法比较

                               相等,则不存;不相等,则存入数组

        JDK 8之前,新元素存入数组,占老元素位置,老元素挂下面

        JDK 8之后,新元素直接挂在老元素下面

    特点:1、HashMap集合是一种增删改查的数据,性能都比较好的集合

                2、无序,不能重复,没有索引支持

                3、HashMap的键依赖hashCode方法和equals方法保证键的唯一

                4、如果键储存的是自定义类型的对象,可以通过重写hashCode和equals方法,这样可以保证多个对象内容一样时,HashMap集合就能认为是重复的。

代码如下:

package d11_map_impl;

import java.util.HashMap;
import java.util.Map;

public class Test1HashMap {
    public static void main(String[] args) {
        Map<Student,String> map = new HashMap<>();
        map.put(new Student("小明",25,168.5),"大学");
        map.put(new Student("小明",25,168.5),"初中");
        map.put(new Student("小李",23,163.5),"初中");
        map.put(new Student("小赵",28,186.1),"小学");
        System.out.println(map);
    }
}

LinkedHashMap底层原理:

        LinkedHashMap结构同样是基于哈希表实现的,只是每个键值对元素额外的多了一个双链表的机制记录元素顺序(保证有序)。LinkedHashSet集合的底层原理就是LinkedHashMap。

代码如下:

package d11_map_impl;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;


public class Test2LinkedHashMap {
    public static void main(String[] args) {
//        Map<String, Integer> map = new HashMap<>();
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("手表",100);
        map.put("手表",200);
        map.put("手机",2);
        map.put("java",2);
        map.put(null,null);
        System.out.println(map);


    }
}

TreeMap底层原理:

        TreeMap的底层原理是基于红黑树实现的,它能够确保集合中的元素处于排序状态,并且提供了高效的查询、插入和删除操作。

        特点:不重复,无索引,可排序(按照键的大小默认升序排序,只对键排序)

        排序方法:

                1、默认排序方法:TreeMap的底层实现是基于红黑树的,这种数据结构能够确保集合中的元素始终处于有序状态。在没有指定比较器的情况下,TreeMap会使用键的类的自然顺序来对元素进行升序排列。

                2、自定义排序:通过实现Comparator接口来定义自定义排序规则。在创建TreeMap时,可以将这个比较器传递给TreeMap的构造方法,这样TreeMap就会使用这个比较器来确定元素的排序顺序。

注意:如果需要对TreeMap中的值进行排序,而不是键,那么可以考虑使用Map.Entry返回的Collections视图,并在这个视图上应用排序。但是,这将不会改变TreeMap本身的排序方式,而只是对视图中的元素进行排序。

  代码如下:

package d11_map_impl;


import java.util.Map;
import java.util.TreeMap;

public class Test3TreeMap {
    public static void main(String[] args) {
        Map<Student,String> map = new TreeMap<>(( o1,  o2)->Double.compare(o2.getHeight(), o1.getHeight()));
        map.put(new Student("小明",25,168.5),"大学");
        map.put(new Student("小明",25,168.5),"初中");
        map.put(new Student("小李",23,163.5),"初中");
        map.put(new Student("小赵",28,186.1),"小学");
        System.out.println(map);
    }
}

                        

新手制作,哪里有错,烦请各位大佬指出。也请各位大佬给出指导性意见。

如有侵权,联系删除。

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值