首页 > 编程知识 正文

java map初始化(java年终总结)

时间:2023-05-03 13:54:03 阅读:227 作者:4806

1、Map概述

1.1什么是地图?

Map是一个将键映射到键值的对象。映射不能包含重复的键;每个键最多只能映射到一个值。Map接口提供了三种集合视图,允许您以keySet()、values()或key-value映射关系集(entrySet())的形式查看映射的内容(即获取键值对的内容)。

映射顺序被定义为迭代器在映射的集合视图上返回其元素的顺序,即键、值和键值的集合集可以被映射,元素的顺序由获得的集合集决定。有些映射实现可以明确保证它们的顺序,比如TreeMap类;其他映射实现不保证顺序,比如HashMap类。

1.11.地图界面

MapK,V,一次添加一对元素(也称为键值对)。k是关键,V是数值。集合一次添加一个元素。地图集合也叫双栏集合,集合集合也叫单列集合。实际上,Map集中存储的是键值对,保证了密钥(k)的唯一性。

地图的常用子类:

1.Hashtable:的内部结构是哈希表,是同步的。键和值不支持Null。

2.HashMap:的内部结构是哈希表,不同步,支持null作为键值。

3.TreeMap:的内部结构是二叉树,不同步,支持null作为键值。

地图界面常用的方法如下:

1.增加

价值投放(关键,价值);//返回与键关联的前一个值,如果没有,则返回null。

2.删除

值移除(键);//根据指定的键删除这个键值对

void clear();//清除此地图集。3.法官

布尔containsKey(键);

布尔containsValue(值);

boolean isEmpty();//确定是否为空。4.得到

value get(key);//一个键被用来返回值,如果没有值,这个键将返回null。当然,您可以通过返回null来确定指定的键(k)是否包含在内。

int size();//获取键值对的数量1.12。地图界面是如何实例化的,它是如何遍历元素的?

下面是一个HashMap实例化的例子:

MapInteger,String map=new HashMapInteger,String();//实例化一个HashMap对象

注:问题:如何获取地图中的所有元素?

提取映射中元素的原理如下:通过keySet方法获取映射的Set集合中的所有键,然后通过集合的迭代器获取每个键。然后,对于每个键,通过映射集的get()方法获取其对应的值。

1.2地图和收藏的区别

1.Map以键值对的形式存储元素,具有唯一的键和重复的值。

2.集合存储单列元素,子接口Set元素唯一,子接口List元素可重复。

3.数据结构值为3。映射集对键有效,与值无关,而集合集的数据结构对元素有效。

java收藏框架中收藏可以在这里盖章的收藏实例分析

2、Map继承体系

常见地图集的继承体系及其特点如下。

3、Map泛型接口

Map特性:它由键值对组成,键不能重复,值可以重复。

它大致包括以下功能:

插入(放,放入()),删除(移出())

Get (entrySet(),Get(),keySet(),size(),values())

判断(containsKey()、containsValue()、equals()、isEmpty()、clear(())

更换(replace()后,更换(k键,v旧值,v新值)JDK 1.8,下面的例子会讲到它们)

清空()

或者,从此映射中删除所有映射关系。

布尔包含键(对象键)

如果此映射包含指定键的映射关系,则返回true。

布尔包含值(对象值)

如果此映射将一个或多个键映射到指定值,则返回true。

SetMap。EntryK,V entrySet()

返回此映射中包含的映射关系的集合视图。

布尔等于(对象0)

比较指定的对象是否等于此映射。

获取(对象键)

返回由指定键映射的值;如果此映射不包含键的映射关系,则返回null。

int hashCode()

返回此映射的哈希值。

布尔isEmpty()

如果该映射不包含键值映射关系

,则返回 true。 Set<K> keySet() 返回此映射中包含的键的 Set 视图。 V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。 V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 int size() 返回此映射中的键-值映射关系数。 Collection<V> values() 返回此映射中包含的值的 Collection 视图。

3.1、 Map集合遍历的常见方式

方式1、根据键获取值(key -> value)

1.获取所有键的集合 2.遍历键的集合,获取到每一个键 3.根据键找值

方式2、根据键值对对象获取键和值( entrySet -> key,value)

1.获取所有键值对对象的集合 2.遍历键值对对象的集合,获取到每一个键值对对象 3.根据键值对对象找键和值

3.11 Map使用示例

public class MapReview { public static void main(String[] args) { Map<String, String> map=new HashMap<String, String>(); map.put("000", "qqq"); map.put("003", "rrr"); map.put("001", "www"); map.put("002", "eee"); map.put("004", "sss"); // System.out.println(map); // 直接打印输出键值对 // 遍历1 : 通过键值对对象entrySet获取键与值 Set<Entry<String, String>> entrySet = map.entrySet(); for (Entry<String, String> entry : entrySet) { String key = entry.getKey(); String value = entry.getValue(); System.out.println("key="+key+" value="+value); } System.out.println("-------------------"); // 遍历2 : 通过键keySet获取值 Set<String> keySet = map.keySet(); // 得到键的集合 for (String key : keySet) { String value = map.get(key); System.out.println("key="+key+" value="+value); } System.out.println("-------------------"); // 获取Map值的集合 Collection<String> values = map.values(); System.out.println(values); // 判断是否存在键和值 System.out.println("containsKey="+map.containsKey("001")); System.out.println("containsKey="+map.containsValue("eee")); // 向Map集合添加元素时,若键存在,则返回之前与键对应的值 String put = map.put("000", "aaa"); System.out.println("put="+put); // output: qqq // default V replace(K key, V value) // 替换功能,将旧值替换成新值,并返回旧值(若有的话) String replace = map.replace("003", "666"); System.out.println("replace="+replace); System.out.println(map); // default boolean replace(K key, V oldValue, V newValue // 只有当键key存在,并且oldValue与newValue相等时,旧的值才会被替换成新的值,并且返回true boolean success = map.replace("004", "sss", "lll"); System.out.println("replace2="+success); // output : true } }

3.2、 HashMap

3.21.HashMap的特点

①键是哈希表结构,可以保证键的唯一性, ②当向已存在key的Map中添加元素时,会覆盖掉旧值,并将旧值返回。 ③它允许使用 null 值和 null 键,但不保证映射的顺序,特别是它不保证该顺序恒久不变(即不会保证存储的顺序与输出的顺序恒久不变)。 ④此实现不是同步的。

注意:

对于自定义对象,需重写其equals和hashCode方法才能保证其key的唯一性

3.22.HashMap与Hashtable的异同

除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同

3.23.HashMap的使用示例

public class HashMapReview { public static void main(String[] args) { test1(); test2(); } /** * 自定义类型做key, * 需重写其equals和hashCode方法才能保证其key的唯一性 */ private static void test2() { HashMap<Info, String> map=new HashMap<Info, String>(); map.put(new Info(0, "aaa"),"0000"); map.put(new Info(1, "bbb"),"1111"); map.put(new Info(3, "ddd"),"3333"); map.put(new Info(0, "aaa"),"4444"); map.put(new Info(2, "ccc"),"2222"); printMap(map); // output:// key=Info [id=3, adress=ddd] value=3333// key=Info [id=2, adress=ccc] value=2222// key=Info [id=0, adress=aaa] value=0000// key=Info [id=1, adress=bbb] value=1111// key=Info [id=0, adress=aaa] value=4444 // 当Info没有重写equals和hashCode方法时,key出现重复元素 } /** * String或基本数据类型的包装类做key,他们已重写了hashCode与equals方法 * 键唯一,重复添加会替换旧值成新值 */ private static void test1() { HashMap<String, String> map=new HashMap<String, String>(); map.put("aaa", "123"); map.put("bbb", "789"); map.put("aaa", "456"); map.put("ccc", "321"); System.out.println(map); // output:// {aaa=456, ccc=321, bbb=789} // 重复的键不会重新插入,只会替换旧值成新值 } private static void printMap(Map<Info, String> map) { Set<Entry<Info, String>> entrySet = map.entrySet(); for (Entry<Info, String> entry : entrySet) { System.out.println("key="+entry.getKey()+" value="+entry.getValue()); } } }

3.24 一个HashMap面试题

需求如下:

已知一个HashMap<Integer,Person>集合, Person有name(String)和age(int)属性。 请写一个方法实现对HashMap的排序功能。该方法接收HashMap<Integer,Person>为形参,返回类型为HashMap<Integer,Person>,要求对HashMap中的Person的age升序进行排序。排序时key=value键值对不得拆散。

分析:

HashMap本身是不保证元素的顺序不变的,要对其排序可使用LinkedHashMap,它是有序的并且还是HashMap的子类,我们可以使用它来完成排序的目的。最后返回它的实例即可满足要求 并且还符合多态的编程思想

示例代码

public class SortedHashMapDemo { public static void main(String[] args) { HashMap<Integer, Person> map = new LinkedHashMap<Integer, Person>(); map.put(0, new Person("健忘的石头", 20)); map.put(1, new Person("小二", 26)); map.put(2, new Person("小四", 19)); map.put(3, new Person("阿七", 33)); map.put(4, new Person("十四", 25)); map.put(4, new Person("俊秀的面包", 19)); System.out.println(map); HashMap<Integer, Person> sortedHashMap = SortedHashMap(map); System.out.println(sortedHashMap); } public static HashMap<Integer, Person> SortedHashMap( HashMap<Integer, Person> map) { // 获得键值对Set集合 Set<Entry<Integer, Person>> entrySet = map.entrySet(); // 将键值对Set集合转化为List以用Collections来排序 List<Entry<Integer, Person>> list = new ArrayList<Map.Entry<Integer, Person>>( entrySet); // 通过Collections来排序,添加比较器,比较年龄 Collections.sort(list, new Comparator<Entry<Integer, Person>>() { @Override public int compare(Entry<Integer, Person> o1, Entry<Integer, Person> o2) { int result = o2.getValue().age - o1.getValue().age; result = result == 0 ? o2.hashCode() - o1.hashCode() : result; return result; } }); // 创建LinkedHashMap来存储排好序的List元素 LinkedHashMap<Integer, Person> linkedHashMap = new LinkedHashMap<Integer, Person>(); // 遍历List,将元素添加到linkedHashMap中 for (Entry<Integer, Person> entry : list) { linkedHashMap.put(entry.getKey(), entry.getValue()); } return linkedHashMap; } } class Person { String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  • 相关阅读