Java Map集合 体系

    技术2023-12-01  98

    1 Collection集合

    1.1 常用集合的体系

    #mermaid-svg-dmg6k5CugOsij3Ax .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-dmg6k5CugOsij3Ax .label text{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .node rect,#mermaid-svg-dmg6k5CugOsij3Ax .node circle,#mermaid-svg-dmg6k5CugOsij3Ax .node ellipse,#mermaid-svg-dmg6k5CugOsij3Ax .node polygon,#mermaid-svg-dmg6k5CugOsij3Ax .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-dmg6k5CugOsij3Ax .node .label{text-align:center;fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .node.clickable{cursor:pointer}#mermaid-svg-dmg6k5CugOsij3Ax .arrowheadPath{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-dmg6k5CugOsij3Ax .flowchart-link{stroke:#333;fill:none}#mermaid-svg-dmg6k5CugOsij3Ax .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-dmg6k5CugOsij3Ax .edgeLabel rect{opacity:0.9}#mermaid-svg-dmg6k5CugOsij3Ax .edgeLabel span{color:#333}#mermaid-svg-dmg6k5CugOsij3Ax .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-dmg6k5CugOsij3Ax .cluster text{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-dmg6k5CugOsij3Ax .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-dmg6k5CugOsij3Ax text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-dmg6k5CugOsij3Ax .actor-line{stroke:grey}#mermaid-svg-dmg6k5CugOsij3Ax .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-dmg6k5CugOsij3Ax .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-dmg6k5CugOsij3Ax #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-dmg6k5CugOsij3Ax .sequenceNumber{fill:#fff}#mermaid-svg-dmg6k5CugOsij3Ax #sequencenumber{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax #crosshead path{fill:#333;stroke:#333}#mermaid-svg-dmg6k5CugOsij3Ax .messageText{fill:#333;stroke:#333}#mermaid-svg-dmg6k5CugOsij3Ax .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-dmg6k5CugOsij3Ax .labelText,#mermaid-svg-dmg6k5CugOsij3Ax .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-dmg6k5CugOsij3Ax .loopText,#mermaid-svg-dmg6k5CugOsij3Ax .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-dmg6k5CugOsij3Ax .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-dmg6k5CugOsij3Ax .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-dmg6k5CugOsij3Ax .noteText,#mermaid-svg-dmg6k5CugOsij3Ax .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-dmg6k5CugOsij3Ax .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-dmg6k5CugOsij3Ax .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-dmg6k5CugOsij3Ax .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-dmg6k5CugOsij3Ax .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .section{stroke:none;opacity:0.2}#mermaid-svg-dmg6k5CugOsij3Ax .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-dmg6k5CugOsij3Ax .section2{fill:#fff400}#mermaid-svg-dmg6k5CugOsij3Ax .section1,#mermaid-svg-dmg6k5CugOsij3Ax .section3{fill:#fff;opacity:0.2}#mermaid-svg-dmg6k5CugOsij3Ax .sectionTitle0{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .sectionTitle1{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .sectionTitle2{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .sectionTitle3{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-dmg6k5CugOsij3Ax .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .grid path{stroke-width:0}#mermaid-svg-dmg6k5CugOsij3Ax .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-dmg6k5CugOsij3Ax .task{stroke-width:2}#mermaid-svg-dmg6k5CugOsij3Ax .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .taskText:not([font-size]){font-size:11px}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-dmg6k5CugOsij3Ax .task.clickable{cursor:pointer}#mermaid-svg-dmg6k5CugOsij3Ax .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-dmg6k5CugOsij3Ax .taskText0,#mermaid-svg-dmg6k5CugOsij3Ax .taskText1,#mermaid-svg-dmg6k5CugOsij3Ax .taskText2,#mermaid-svg-dmg6k5CugOsij3Ax .taskText3{fill:#fff}#mermaid-svg-dmg6k5CugOsij3Ax .task0,#mermaid-svg-dmg6k5CugOsij3Ax .task1,#mermaid-svg-dmg6k5CugOsij3Ax .task2,#mermaid-svg-dmg6k5CugOsij3Ax .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutside0,#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutside2{fill:#000}#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutside1,#mermaid-svg-dmg6k5CugOsij3Ax .taskTextOutside3{fill:#000}#mermaid-svg-dmg6k5CugOsij3Ax .active0,#mermaid-svg-dmg6k5CugOsij3Ax .active1,#mermaid-svg-dmg6k5CugOsij3Ax .active2,#mermaid-svg-dmg6k5CugOsij3Ax .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-dmg6k5CugOsij3Ax .activeText0,#mermaid-svg-dmg6k5CugOsij3Ax .activeText1,#mermaid-svg-dmg6k5CugOsij3Ax .activeText2,#mermaid-svg-dmg6k5CugOsij3Ax .activeText3{fill:#000 !important}#mermaid-svg-dmg6k5CugOsij3Ax .done0,#mermaid-svg-dmg6k5CugOsij3Ax .done1,#mermaid-svg-dmg6k5CugOsij3Ax .done2,#mermaid-svg-dmg6k5CugOsij3Ax .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-dmg6k5CugOsij3Ax .doneText0,#mermaid-svg-dmg6k5CugOsij3Ax .doneText1,#mermaid-svg-dmg6k5CugOsij3Ax .doneText2,#mermaid-svg-dmg6k5CugOsij3Ax .doneText3{fill:#000 !important}#mermaid-svg-dmg6k5CugOsij3Ax .crit0,#mermaid-svg-dmg6k5CugOsij3Ax .crit1,#mermaid-svg-dmg6k5CugOsij3Ax .crit2,#mermaid-svg-dmg6k5CugOsij3Ax .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-dmg6k5CugOsij3Ax .activeCrit0,#mermaid-svg-dmg6k5CugOsij3Ax .activeCrit1,#mermaid-svg-dmg6k5CugOsij3Ax .activeCrit2,#mermaid-svg-dmg6k5CugOsij3Ax .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-dmg6k5CugOsij3Ax .doneCrit0,#mermaid-svg-dmg6k5CugOsij3Ax .doneCrit1,#mermaid-svg-dmg6k5CugOsij3Ax .doneCrit2,#mermaid-svg-dmg6k5CugOsij3Ax .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-dmg6k5CugOsij3Ax .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-dmg6k5CugOsij3Ax .milestoneText{font-style:italic}#mermaid-svg-dmg6k5CugOsij3Ax .doneCritText0,#mermaid-svg-dmg6k5CugOsij3Ax .doneCritText1,#mermaid-svg-dmg6k5CugOsij3Ax .doneCritText2,#mermaid-svg-dmg6k5CugOsij3Ax .doneCritText3{fill:#000 !important}#mermaid-svg-dmg6k5CugOsij3Ax .activeCritText0,#mermaid-svg-dmg6k5CugOsij3Ax .activeCritText1,#mermaid-svg-dmg6k5CugOsij3Ax .activeCritText2,#mermaid-svg-dmg6k5CugOsij3Ax .activeCritText3{fill:#000 !important}#mermaid-svg-dmg6k5CugOsij3Ax .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-dmg6k5CugOsij3Ax g.classGroup text .title{font-weight:bolder}#mermaid-svg-dmg6k5CugOsij3Ax g.clickable{cursor:pointer}#mermaid-svg-dmg6k5CugOsij3Ax g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-dmg6k5CugOsij3Ax g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-dmg6k5CugOsij3Ax .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-dmg6k5CugOsij3Ax .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-dmg6k5CugOsij3Ax .dashed-line{stroke-dasharray:3}#mermaid-svg-dmg6k5CugOsij3Ax #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax .commit-id,#mermaid-svg-dmg6k5CugOsij3Ax .commit-msg,#mermaid-svg-dmg6k5CugOsij3Ax .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-dmg6k5CugOsij3Ax g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-dmg6k5CugOsij3Ax g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-dmg6k5CugOsij3Ax g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-dmg6k5CugOsij3Ax .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-dmg6k5CugOsij3Ax .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-dmg6k5CugOsij3Ax .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-dmg6k5CugOsij3Ax .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-dmg6k5CugOsij3Ax .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-dmg6k5CugOsij3Ax .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-dmg6k5CugOsij3Ax .edgeLabel text{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-dmg6k5CugOsij3Ax .node circle.state-start{fill:black;stroke:black}#mermaid-svg-dmg6k5CugOsij3Ax .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-dmg6k5CugOsij3Ax #statediagram-barbEnd{fill:#9370db}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-state .divider{stroke:#9370db}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-dmg6k5CugOsij3Ax .note-edge{stroke-dasharray:5}#mermaid-svg-dmg6k5CugOsij3Ax .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-dmg6k5CugOsij3Ax .error-icon{fill:#522}#mermaid-svg-dmg6k5CugOsij3Ax .error-text{fill:#522;stroke:#522}#mermaid-svg-dmg6k5CugOsij3Ax .edge-thickness-normal{stroke-width:2px}#mermaid-svg-dmg6k5CugOsij3Ax .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-dmg6k5CugOsij3Ax .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-dmg6k5CugOsij3Ax .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-dmg6k5CugOsij3Ax .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-dmg6k5CugOsij3Ax .marker{fill:#333}#mermaid-svg-dmg6k5CugOsij3Ax .marker.cross{stroke:#333} :root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-dmg6k5CugOsij3Ax { color: rgba(0, 0, 0, 0.75); font: ; } Map集合的主要体系 HashMap集合 实现类 TreeMap集合 实现类 LinkedHashMap集合 实现类 HashTable集合 实现类 ConccurentHashMap集合 实现类

    提示: 有关Map中的方法可不止上面这些,其他方法可以自行查看API学习。 注意:这张图只是我们常用的集合有这些,不是说就只有这些集合。

    1.2 Map 常用API

    目标:Map集合的常用API(重点中的重点) key=value

    public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。public V get(Object key) 根据指定的键,在Map集合中获取对应的值。public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。public boolean containKey(Object key):判断该集合中是否有此键。public boolean containValue(Object value):判断该集合中是否有此值。 public static void main(String[] args) { Map<String , Integer> maps = new HashMap<>(); // 1.添加元素: 无序,不重复,无索引。 maps.put("iphoneX",10); maps.put("娃娃",30); maps.put("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素! maps.put("huawei",1000); maps.put("生活用品",10); maps.put("手表",10); // {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30} System.out.println(maps); // 2.清空集合 //maps.clear(); //System.out.println(maps); // 3.判断集合是否为空,为空返回true ,反之! System.out.println(maps.isEmpty()); // 4.根据键获取对应值。 Integer value = maps.get("娃娃"); System.out.println(value); // 5.根据键删除整个元素。(删除键会返回键的值) System.out.println(maps.remove("iphoneX")); System.out.println(maps); // 6.判断是否包含某个键 ,包含返回true ,反之 System.out.println(maps.containsKey("iphoneX")); // false System.out.println(maps.containsKey("生活用品")); // true // 7.判断是否包含某个值。 System.out.println(maps.containsValue(10)); System.out.println(maps.containsValue(30)); System.out.println(maps.containsValue(10000)); // 8.获取全部键的集合:public Set<K> keySet() // Map集合的键是无序不重复的,所以返回的是一个Set集合。 Set<String> keys = maps.keySet(); System.out.println(keys); // 9.获取全部值的集合:Collection<V> values(); // Map集合的值是不做要求的,可能重复,所以值要用Collection集合接收! Collection<Integer> values = maps.values(); System.out.println(values); // 10.集合的大小 System.out.println(maps.size()); // 11.合并其他Map集合。(拓展) Map<String,Integer> maps2 = new HashMap<>(); maps2.put("xiaoMi" , 1); maps2.put("🔨手机" , 10); maps2.put("手表" , 10000); maps.putAll(maps2); //把maps2的元素倒入到maps中 System.out.println(maps); }

    2 HashMap 遍历方式

    Map集合的遍历方式是全部集合都可以直接使用的,Map集合的遍历方式有:3种。 1)“键找值”的方式遍历:先获取Map集合全部的键,再根据遍历键找值。 2)“键值对”的方式遍历:难度较大。 3)JDK 1.8开始之后的新技术:Lambda表达式。(暂时了解)

    2.1 for循环键找值

    遍历方式:先提取Map集合全部键的Set集合,再遍历键的Set集合,然后通过键找值。

    public static void main(String[] args) { Map<String , Integer> maps = new HashMap<>(); // 1.添加元素: 无序,不重复,无索引。 maps.put("娃娃", 30); maps.put("iphoneX", 100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素! maps.put("huawei", 1000); maps.put("生活用品", 10); maps.put("手表", 10); System.out.println(maps); // maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30} /** // a.键找值方式遍历 // 1.获取当前Map集合的全部键的集合 。 Set<String> keys = maps.keySet(); // [huawei,手表,生活用品,iphoneX,娃娃] // 2.通过遍历键然后通过键取对应的值 for (String key : keys) { // 键找对应值返回Integer类型的值! Integer value = maps.get(key); System.out.println(key+ " ===> " + value); } */ Set<String> keys = maps.keySet(); for (String key : keys) { System.out.println(key + " = " + maps.get(key)); } }

    2.2 foreach遍历

    public static void main(String[] args) { Map<String , Integer> maps = new HashMap<>(); // 1.添加元素: 无序,不重复,无索引。 maps.put("娃娃",30); maps.put("iphoneX",100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素! maps.put("huawei",1000); maps.put("生活用品",10); maps.put("手表",10); System.out.println(maps); // maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30} /** “键值对”的方式遍历:更加面向对象的方式,代码复杂。 “键值对”想把键值对当成一个整体遍历,也就是直接使用foreac遍历: for(被遍历集合的元素类型 变量:集合名称){ } 发现Map集合的键值对数据直接是没有元素类型的,foreach无法直接遍历Map集合。 👇 把Map集合通过代码Set<Map.Entry<K, V>> entrySet()转换成Set集合。 👇 Set<Map.Entry<String,Integer>> entries = maps.entrySet(); 👇 entries = [(huawei=1000), (手表=10), (生活用品=10), (iphoneX=100), (娃娃=30) ] // entry 此时键值对元素才能作为一个整体就有了类型。类型是 Map.Entry<String,Integer>实体类型 */ /** // 1.把Map集合转换成Set集合 Set<Map.Entry<String,Integer>> entries = maps.entrySet(); // 2.此时键值对有了类型:Map.Entry<String,Integer>。可以遍历这个Set集合 for (Map.Entry<String, Integer> entry : entries) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + " ===> " + value); } */ Set<Map.Entry<String, Integer>> entries = maps.entrySet(); for (Map.Entry<String, Integer> entry : entries) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + "===>" + value); } }

    2.3 forEach 的Lambda表达式

    JDK 1.8开始之后的新技术Lambda表达式。

    public static void main(String[] args) { Map<String, Integer> maps = new HashMap<>(); // 1.添加元素: 无序,不重复,无索引。 maps.put("娃娃", 30); maps.put("iphoneX", 100);// Map集合后面重复的键对应的元素会覆盖前面重复的整个元素! maps.put("huawei", 1000); maps.put("生活用品", 10); maps.put("手表", 10); System.out.println(maps); // maps = {huawei=1000, 手表=10, 生活用品=10, iphoneX=100, 娃娃=30} // (k , v) // maps.forEach((k , v) -> { // System.out.println(k +"==>"+v); // }); maps.forEach((k, v) -> { System.out.println(k + "==>" + v); }); }

    2.4 map 自定义引用数据类型

    // map 自定义引用数据类型 // 如果希望Map集合认为自定义类型的键对象重复了,必须重写对象的hashCode()和equals()方法 public class Orange { private String name; private double weight; private String price; ...... } public static void main(String[] args) { /*Map<Orange,String> maps = new HashMap<>(); Orange o1 = new Orange("黄橘子",20.3 , "贼便宜!"); Orange o2 = new Orange("黑橘子",30.3 , "坏了"); Orange o3 = new Orange("青橘子",34.3 , "9.9包邮"); Orange o4 = new Orange("黄橘子",20.3 , "贼便宜!"); maps.put(o1 , "江西"); maps.put(o2 , "路上"); maps.put(o3 , "赣州"); maps.put(o4 , "广州"); System.out.println(maps);*/ Map<String, Orange> maps = new HashMap<>(); Orange o1 = new Orange("黄橘子", 20.2, "贼便宜"); Orange o2 = new Orange("黑橘子", 230.2, "贼便宜"); Orange o3 = new Orange("绿橘子", 20.2, "便宜"); Orange o4 = new Orange("臭橘子", 220.2, "贼便宜"); maps.put("广州 ", o1); maps.put("梅州 ", o2); maps.put("上海 ", o3); maps.put("深圳 ", o4); System.out.println(maps); }

    3 LinkedHashMap

    LinkedHashMap是HashMap的子类。 – 添加的元素按照键有序,不重复的。 HashSet集合相当于是HashMap集合的键都不带值。 LinkedHashSet集合相当于是LinkedHashMap集合的键都不带值。 底层原理完全一样,都是基于哈希表按照键存储数据的, 只是HashMap或者LinkedHashMap的键都多一个附属值。

    public static void main(String[] args) { /* Map<String , Integer> maps = new LinkedHashMap<>(); maps.put("iphoneX", 10); maps.put("娃娃", 30); maps.put("iphoneX", 100); // 依然是保留前面的位置,只是替换其值! maps.put("huawei", 1000); maps.put("生活用品", 10); maps.put("手表", 10); System.out.println(maps); */ Map<String, Integer> maps = new LinkedHashMap<>(); maps.put("inhone", 10); maps.put("娃娃", 100); maps.put("huawei", 1000); maps.put("生活用品", 10); maps.put("手表", 19); System.out.println(maps); }

    4 TreeHashMap

    TreeMap集合按照键是可排序不重复的键值对集合。(默认升序) TreeMap集合按照键排序的特点与TreeSet是完全一样的。 小结: TreeMap集合和TreeSet集合都是排序不重复集合 TreeSet集合的底层是基于TreeMap,只是键没有附属值而已。 所以TreeMap集合指定大小规则有2种方式:

    直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)直接为集合设置比较器Comparator对象,重写比较方法.优先使用集合自带比较器比较! // 跟TreeSet 排序方法差不多不想多写注释 public class Pig implements Comparable{ private String name; private double price; private double weight; ....... @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Pig pig = (Pig) o; return Double.compare(pig.price, price) == 0 && Double.compare(pig.weight, weight) == 0 && Objects.equals(name, pig.name); } @Override public int hashCode() { return Objects.hash(name, price, weight); } // 比较者:this // 被比较者:o @Override public int compareTo(Object o) { Pig p = (Pig) o; return Double.compare(this.weight , p.weight); } } public static void main(String[] args) { /** // 1.对于有值特性的!可以直接排序!! 排序不重复集合!! Map<Integer, String> maps = new TreeMap<>(); maps.put(1000000, "张三"); maps.put(100000, "张三1"); maps.put(10000, "李四"); maps.put(10, "王五"); maps.put(24244, "张麻子"); System.out.println(maps); */ Map<Integer, String> maps = new TreeMap<>(); maps.put(1000000, "张三"); maps.put(1000000, "张三1"); maps.put(10000, "李四"); maps.put(10, "王五"); maps.put(24244, "张麻子"); System.out.println(maps); /** // 2.对于自定义的引用数据类型,需要自定义比较规则:2种 // 方式一:在实体类中实现Comparable接口,重写比较规则! Map<Pig, String> pigs = new TreeMap<>(); pigs.put(new Pig("🐖佩奇", 99.5, 500.0), "荷兰"); pigs.put(new Pig("🐖乔治", 99.4, 605.0), "澳大利亚"); pigs.put(new Pig("🐗野猪", 199.4, 305.0), "山上"); pigs.put(new Pig("🐗野猪", 199.4, 305.0), "山上2"); System.out.println(pigs); */ Map<String,Pig> pigs = new TreeMap<>(); pigs.put("荷兰", new Pig("🐖佩奇", 99.5, 500.0)); pigs.put("澳大利亚", new Pig("🐖乔治", 99.4, 605.0)); pigs.put("山上", new Pig("🐗野猪", 199.4, 305.0)); pigs.put("山上2", new Pig("🐗野猪", 199.4, 305.0)); System.out.println(pigs); /** // 3.方式二:让TreeMap集合自带比较器 // public TreeMap(Comparator<? super K> comparator) Map<Pig, String> pigs1 = new TreeMap<>(new Comparator<Pig>() { @Override public int compare(Pig o1, Pig o2) { return Double.compare(o1.getPrice(), o2.getPrice()); } }); pigs1.put(new Pig("🐖佩奇", 99.5, 500.0), "荷兰"); pigs1.put(new Pig("🐖乔治", 99.4, 605.0), "澳大利亚"); pigs1.put(new Pig("🐗野猪", 199.4, 305.0), "山上"); pigs1.put(new Pig("🐗野猪", 199.4, 305.0), "山上2"); System.out.println(pigs1); */ Map<Pig, String> pigs2 = new TreeMap<>(new Comparator<Pig>() { @Override public int compare(Pig o1, Pig o2) { return Double.compare(o1.getPrice(), o2.getPrice()) != 0 ? Double.compare(o1.getPrice(), o2.getPrice()) : 1; } }); pigs2.put(new Pig("🐖佩奇", 99.5, 500.0), "荷兰1"); pigs2.put(new Pig("🐖乔治", 99.4, 605.0), "澳大利亚2"); pigs2.put(new Pig("🐗野猪", 199.4, 305.0), "山上3"); pigs2.put(new Pig("🐗野猪", 199.4, 305.0), "山上4"); System.out.println(pigs2); }

    5 HashTable

    线程安全性能低

    5 ConccurentHashMap

    线程安全性能高

    Processed: 0.018, SQL: 9