首页 > 其他分享 >Map集合

Map集合

时间:2023-02-18 18:33:33浏览次数:27  
标签:Map name map age TreeMap 集合 public

介绍

 

Map在Java⾥边是⼀个接⼝,常⻅的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap

 

 内嵌类

 

 

 

 

Map是java中的接口,Map.Entry是Map的一个内部接口

Map集合封装键值对类型的数据,在Map集合的底层,每一个Key-Value键值对都被封装到一个Entry类型的子容器中,一个Entry对象只包含一个键值对,Map集合底层使用entry对象来存储这些键值对,在遍历Map集合时,可以通过遍历Key来遍历Map集合,还可以通过遍历entry对象来遍历集合。

Entry接口提供了getKey()方法和getValue()方法,用来获取entry对象存储的key和value值。

map  中的key使用set来进行存放的,注意由于是set来进行存储的,   那么不允许key是重复的

Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。

k,v默认是object类型

 

 

 常用API

包含键/值

 

 

 

存储/复制存储/如果不存在则存储否则返回当前值

 

 移除

 

 

 

三种视图

结论:使用键值映射关系集,entry视图

键值映射关系集   

推荐   直接通过Entry对象获取键和值,一个Entry只存储一个键值对

 

 

 1     @Test
 2     public void mapTest() {
 3         HashMap<String,Object>map=new HashMap<>();
 4         map.put("1号",1);
 5         map.put("2号","222");
 6         map.put("3号",666);
 7         for(Map.Entry<String,Object> e:map.entrySet()
 8         ){
 9             System.out.println(e.getKey()+"="+e.getValue());
10         }
11     }

 

 

键集

只获取Map的键,返回Set

 

 

1         //返回键的set视图
2         Set<String>se=map.keySet();
3         for(String a:se
4         ){
5         System.out.println("k:"+a+map.get(a));
6 }

 

值集

只获取Map的值,返回Collection,而且没有通过值找键的直接API

1         //返回值的Collection视图
2         Collection<Object>k=map.values();
3         for(Object o:k
4         ){
5         //该视图没有通过值找键的方法,Entry里面有直接获取键、值的方法
6         System.out.println(o);
7 }

 

 

HashMap

结果和hashset一样,无序,不能保证映射的顺序
通过hashcode和equals来判断键是否重复
基于hash表的Map接口实现,HashMap底层数据结构是数组+链表/红⿊树
此实现提供所有可选的映射操作,并允许使用null值和null键

HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null

 

构造方法

负载因子是在容量自动增加之前允许哈希表得到满足的度量

通常,默认负载因子(0.75)提供了时间和空间成本之间的良好折衷。 更高的值会减少空间开销,但会增加查询条目的时间成本

 

 

 

常用API

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

HashTable

 

 

 

此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
维护着一个运行于所有条目的双重链接列表

 Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable 。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable 。

 

LinkedHashmap

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。

底层数据结构是数组+链表/红⿊树+双向链表

 

 

TreeMap

根据键的自然排序进行排序

自定义类可以自定义排序(和treeset相似),

  1. 实现comparable接口,重写comparetTo方法
  2. 定义比较器,实现comparator接口,重写compare方法

底层数据结构是红⿊树

 

排序

例子对象类

 1 package map;
 2 //对象类
 3 public class Users implements  Comparable<Users>{
 4    private String name;
 5    private Integer age;
 6 
 7     @Override
 8     public int compareTo(Users o) {
 9         // this-传入对象  顺序排列
10         int i=this.age-o.age;
11         return i==0?this.name.compareTo(o.name):i;
12     }
13 
14     @Override
15     public String toString() {
16         return "Users{" +
17                 "name='" + name + '\'' +
18                 ", age=" + age +
19                 '}';
20     }
21 
22     public Users() {
23     }
24 
25     public Users(String name, Integer age) {
26         this.name = name;
27         this.age = age;
28     }
29 
30     public String getName() {
31         return name;
32     }
33 
34     public void setName(String name) {
35         this.name = name;
36     }
37 
38     public Integer getAge() {
39         return age;
40     }
41 
42     public void setAge(Integer age) {
43         this.age = age;
44     }
45 }

 

两种排序

package map;


import java.util.Comparator;

import java.util.Map.Entry;
import java.util.TreeMap;
//TreeMap两种排序方法,同treeset
public class TreeMaps {

    public static void main(String[] args) {


       // test1();
        new TreeMaps().test2();
    }
    //此方法创建TreeMap
    private static TreeMap<Users,Object> creat(){
        TreeMap<Users,Object> tre=new TreeMap<>();
        tre.put(new Users("张",22),1);
        tre.put(new Users("李",12),"2号");
        tre.put(new Users("王",26),"3号");
        return tre;
    }
    //遍历方法-通过映射的set视图,k对象实现comparable,重写compareTo,为自定义自然排序
    public static void test1(){

        for (Entry<Users,Object> en:creat().entrySet()
             ) {
            System.out.println(en.getKey()+":"+en.getValue());
        }
    }
    //自定义排序,通过自定义的比较器
    private void test2(){
                                //传入比较器时,传的是实例化的比较器
        TreeMap<Users,Object> ttt=new TreeMap<>(new Com() );
        //复制映射关系到此映射中
            ttt.putAll(creat());
                 System.out.println(ttt);
     }

    }
    //自定义比较器类
class Com implements Comparator<Users> {
    @Override
    public int compare(Users o1, Users o2) {
        int i = o1.getName().length() - o2.getName().length();
        return  i== 0 ? o1.getAge()-o2.getAge() : i;

    }
}

 

标签:Map,name,map,age,TreeMap,集合,public
From: https://www.cnblogs.com/deity-night/p/17131750.html

相关文章

  • C# List集合查找删除指定数据
    1.实体类publicclassFaultLevelModel{publicstringLBWJ{get;set;}publicstringLBSJ{get;set;}publicstringINDCODE{get;set;}}2.操作第......
  • Geospatial,Hyperloglog,BitMap
    geospatial:地理位置底层实现geoadd:添加 geopos:获取指定的经纬度 geodist georadius:获取指定位置的指定半径的数据 georadiusbymember:获取指定元素指......
  • Java集合框架
    Java集合框架Java的集合框架大致分为两个部分:Collection:主要有List、Set、Queue组成。Map:主要是HashMap,代表是键值对的集合。ListList的特点是存取有序,可以存放重......
  • python学习笔记三:元组和集合
    学习python的小伙伴们经常会有这样一个疑问,既然有列表里,问什么还要有元组呢。因为列表是可变的,而元组是不可变的。比如我们经常需要传入函数的数据是不变的,这时就要用到元组......
  • Semaphore源码解析
    Semaphore源码解析描述:一个计数信号量。从概念上讲,信号量维护一组许可。每个acquire()方法在必要时阻塞,直到获得许可,然后才能使用它。每次release()释放一个许可,潜在......
  • 集合概述
    集合框架体系,Collection接口,Map接口,Collections工具类Author:MsuenbDate:2023-02-17集合是Java中提供的一种容器,可以用来存储多个数据。数组也是容器,但相较于集......
  • SpringBoot学习记录(1)——@Autowired在集合上的作用
    publicclassSmsHandlerextendsBaseHandlerimplementsHandler{@AutowiredprivateMap<String,SmsScript>smsScripts;//......}例如如上,一个......
  • 3、TreeMap源码解析
    目录1TreeMap基本介绍2红黑树数据结构回顾3成员变量4内部类Entry5构造函数6重要方法分析6.1get方法分析6.2put方法分析6.3插入调整函数fixAfterInsertion()解析6.......
  • 2、HashMap源码分析
    目录1一般数据结构及特点2HashMap基本属性说明3HashMap数据结构3.1构造函数3.2Node<k,v>分析4put过程分析4.1扩容方法resize()分析4.2put方法分析5关于HashMap5.1......
  • map数据类型,与object 类型的区别
    https://www.cnblogs.com/ht955/p/14170885.htmlhttps://www.cnblogs.com/Hijacku/p/16457600.htmlMAP数据类型是一个类似于对象的数据类型,大型项目中会经常使用。  ......