一、Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。Map接口定义了如下常用的方法:
1、void clear():删除Map中所以键值对。
2、boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true。
3、boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
4、Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
5、Object get(Object key):返回指定key所对应的value,如Map中不包含key则返回null。
6、boolean isEmpty():查询Map是否为空,如果空则返回true。
7、Set keySet():返回该Map中所有key所组成的set集合。
8、Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
9、void putAll(Map m):将指定Map中的键值对复制到Map中。
10、Object remove(Object key):删除指定key所对应的键值对,返回可以所关联的value,如果key不存在,返回null。
11、int size():返回该Map里的键值对的个数。
12、Collection values():返回该Map里所有value组成的Collection。
Map中包含一个内部类:Entry。该类封装了一个键值对,它包含了三个方法:
1、Object getKey():返回该Entry里包含的key值。
2、Object getValeu():返回该Entry里包含的value值。
3、Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
二、HashMap和Hashtable实现类:
1、HashMap与HashTable的区别:
1) 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
2) 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因为它是同步的)
3、注意:
1)用作key的对象必须实现hashCode和equals方法。
2)不能保证其中的键值对的顺序
3)尽量不要使用可变对象作为它们的key值。
三、LinkedHashMap:
它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
四、TreeMap:
Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
2、Object firstKey():返回最小key,如果为空,则返回null。
3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
4、Object lastKey():返回最大key,如果为空,则返回null。
5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。
五、WeakHashMap:
WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。
六、IdentityHashMap类:
IdentityHashMap与HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null,但不保证键值对之间的顺序。
七、EnumMap类:
1、EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。
2、EnumMap根据key的自然顺序,即枚举值在枚举类中定义的顺序,来维护键值对的次序。
3、EnumMap不允许使用null作为key值,但value可以。
有以下区别: 1、表示对象不同 在泛型中,对象仅表示对象不能代表所有对象。 2、两种泛型的定义不同 前者是可以确定的通用类型,后者是无法确定的通用类型。 3、判定方式不同 因为这是两个不同的定义,所以判断方法有所不同。 泛型有两个主要定义: (1)有些类型在程序编码中包含类型参数,即通用参数只能表示类,而不能表示单个对象。 (2)某些类在程序代码中包含参数,它的参数可以表示类或对象,等等。无论使用哪种定义,都必须在实际使用泛型时指定其参数。 扩展资料: .NET Framework 的泛型: 泛型是带有占位符(类型参数)的类,结构,接口和方法。 这些占位符是由类,结构,接口和方法存储或使用的一种或多种类型的占位符。 通用集合类可以将类型参数用作其存储的对象类型的占位符; 类型参数显示为其字段的类型和方法的参数类型。 泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。 由于.NET Framework泛型的类型参数的实际类型不会在运行时消除,因此,由于减少了类型转换的次数,因此将加快运行速度。 参考资料来源: 百度百科-泛型
在升级QQ登录到OAuth2.0时,其返回的是一个json形式的字符串,将其转换成Map
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
或
Gson gson = new Gson();
String json 如下;
{ "ret":0, "msg":"", "nickname":"xxx", "figureurl":"http://qzapp.qlogo.cn/qzapp/100226195/C399C7B2880641627CED3EEF9DEB8E30/30", "figureurl_1":"http://qzapp.qlogo.cn/qzapp/100226195/C399C7B2880641627CED3EEF9DEB8E30/50", "figureurl_2":"http://qzapp.qlogo.cn/qzapp/100226195/C399C7B2880641627CED3EEF9DEB8E30/100", "gender":"xxx", "vip":"0", "level":"0", "is_yellow_year_vip":"0" }
Map infoMap = gson.fromJson(json, new TypeToken>(){}.getType());
把map转成json的步骤:
1、需要一些jar包:json-lib-2.4-jdk15.jar、ezmorph-1.0.6.jar、commons-logging.jar、commons-lang.jar、commons-collections.jar、commons-beanutils.jar。
2、把Map转换成json, 要使用jsonObject对象:
Map map = new HashMap();
map.put("userId", 1001);
map.put("userName", "张三");
map.put("userSex", "男");
JSONObject jsonObject = JSONObject.fromObject(map);
System.out.println(jsonObject);
package jsonToMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import net.sf.json.JSONArray;import net.sf.json.JSONObject;/** * 说明 json字符串 转成 Map/List */public class JsonToMap { public static void main(String[] args) { //JSONArray String jsonArrayData="[{\"a1\":\"12\",\"b1\":\"112\",\"c1\":\"132\",\"d1\":\"134\"},{\"a2\":\"12\",\"b2\":\"112\",\"c2\":\"132\",\"d2\":\"134\"},{\"a3\":\"12\",\"b3\":\"112\",\"c3\":\"132\",\"d3\":\"134\"}]"; JSONArray jsonArray = JSONArray.fromObject(jsonArrayData); List> mapListJson = (List)jsonArray; for (int i = 0; i obj=mapListJson.get(i); for(Entry entry : obj.entrySet()){ String strkey1 = entry.getKey(); Object strval1 = entry.getValue(); System.out.println("KEY:"+strkey1+" --> Value:"+strval1+"\n"); } } // JSONObject String jsonObjectData="{\"data1\":{\"a1\":\"12\",\"b1\":\"112\",\"c1\":\"132\",\"d1\":\"134\"},\"data2\":{\"a2\":\"12\",\"b2\":\"112\",\"c2\":\"132\",\"d2\":\"134\"},\"data3\":{\"a3\":\"12\",\"b3\":\"112\",\"c3\":\"132\",\"d3\":\"134\"}}"; JSONObject jsonObject = JSONObject.fromObject(jsonObjectData); Map mapJson = JSONObject.fromObject(jsonObject); for(Entry entry : mapJson.entrySet()){ Object strval1 = entry.getValue(); JSONObject jsonObjectStrval1 = JSONObject.fromObject(strval1); Map mapJsonObjectStrval1 = JSONObject.fromObject(jsonObjectStrval1); System.out.println("KEY:"+entry.getKey()+" --> Value:"+entry.getValue()+"\n"); for(Entry entry1:mapJsonObjectStrval1.entrySet()){ System.out.println("KEY:"+entry1.getKey()+" --> Value:"+entry1.getValue()+"\n"); } } }}
import java.util.HashMap;import java.util.Map; public class Test {private static final Map, Object> primitiveDefaults = new HashMap, Object>(); public static void main(String[] args) {primitiveDefaults.put("num".getClass(),"123");System.out.println(primitiveDefaults.get("num".getClass()));//输出123 }} java.lang.Class 类型参数: T - 由此Class 对象建模的类的类型。例如, String.class 的类型是Class。如果将被建模的类未知,则使用Class。
重写自定义对象的hashcode()方法,让内容相同的对象返回一样的hashcode..默认情况自定义对象是以内存地址为hashcode,你“重新创建一个一样的对象”,存在“重新创建”就会导致对象不一样...所以要重写覆盖hashcode方法才能获取到map值
另外,也可以低层一点,你的自定义对象上设一个int id属性. 而Map转为以id为键,比如Map。
Map> map=new HashMap>(); for (int i = 0; i mapchild=new HashMap(); mapchild.put("url", 1); mapchild.put("car_where", 2); mapchild.put("car_String", 3); mapchild.put("car_number", 4); map.put("map"+i, mapchild); } for (int i = 0; i < map.size(); i++) { //这里面data.add(map.get("map"+i)); System.out.println(map.get("map"+i).get("url")); }
for(Object object : list) {Map entry = (Map)object;值 = entry.get(‘字段名’);} 象(object),台湾译作物件,是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。定义一个嵌入的对象。请使用此元素向您的 XHTML 页面添加多媒体。 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
意思是你的Map对象的键是String类型的,而值因为被定义为最上层的java对象Object对象,而所有的下级对象都隶属于Object对象,所以可以传任何类型的值在里面,比如,你可以这样:
paramMap .put("userid","lianxue");
paramMap .put("age",23);
List list = new ArrayList();
list.add("xulili");
list.add("wanglili");
list.add("malili");
paramMap .put("girlfriends",list);
首先你要知道
你的第一行 已经告诉你了 obj=HashMap
那么说明 你的obj是一个Map类型了
Map 类型取值都是Map.get("Key")取值。
代码形势是:
Map obj=new HashMap();
obj.put("name","张三");//绑定key为name的名字 值是:张三
System.out.println(obj.get("name"));//获取key 为name的值 返回:张三
使用TreeMap 存放元素并排序,以下代码仅供参考: package com.kidd.test.zhidao;import java.net.MalformedURLException;import java.util.ArrayList;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.TreeMap;public class Test { public static void main(String[] args) throws ClassNotFoundException, MalformedURLException { List> list = null; list = instance(list); System.out.println(list); System.out.println(grouping(list, "a")); } private static Map grouping(List> list, String key) { // 使用TreeMap存放元素并排序 Map newMap = new TreeMap(new Comparator() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); list.stream().forEach(m -> { if (m.containsKey(key)) { List l = new ArrayList(); l.add(m); newMap.put(m.get(key).toString(), l); } }); ; return newMap; } private static List> instance(List> list) { list = new ArrayList() { { add(new HashMap() { { put("a", "1"); put("", "0"); } }); add(new HashMap() { { put("a", "a11"); put("b", "2"); } }); add(new HashMap() { { put("a", "111"); put("c", "3"); } }); add(new HashMap() { { put("b", "22"); } }); add(new HashMap() { { put("a", "1111"); put("b", "222"); } }); } }; return list; }}
//Map是一个键值对,就像数组一样,比如说Map map=new HashMap();/*创建一个map,因为map是接口,所以只能创建实现Map的子类*///上面的map中里的是Integer和String,那么map键只能是Integer类型,值是String类型map.put(123,"呵呵");//放入键和值,那么下面取出来System.out.print(map.get(123));//在控制台输出的就是“呵呵”.懂了吗
Of course you can. //=================================Map innerMap = new HashMap();innerMap.put("innerKey", 2014);Map> map = new HashMap>();map.put("outerKey", innerMap);Map targetMap = map.get("outerKey");if(targetMap == innerMap){ System.out.println("You got the inner Map, and it is saved in targetMap!!!");}//=================================
那要看你的json数据是什么要的格式,比如javabean实体中包含实体的转换
JSONObject jsonObject = JSONObject.fromObject("你的json数据");
Map classMap = new HashMap();
/*如:{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"otherMsg":"","loginCheck":"Y"},"messages":[],"validateMessages":{}}
*/
classMap.put("validateMessages", 你的Javabean实体.class);
classMap.put("data", "你的javabean实体名称.class");
\\ MessagesShow 实体包含 你的javabean实体
/*
public class MessagesShow {
private String validateMessagesShowId;
private boolean status;
private String httpstatus;
private List messages;
private ValidateMessages validateMessages;
private MessagesData data ;
//set 和 get 方法
}
*/
MessagesShow messages =(MessagesShow) JSONObject.toBean(jsonObject, MessagesShow.class, classMap);
一楼思路对的,不过我觉得interger可以直接放学号,如果学号没有超过int的范围的话。保险来说最好map本身是map 增加: students.put(s.getId(),s)删除: students.put(s.getId(),s)更新: Student oldStudent = students.get(s.getId());oldStudent.setName(s.getName());oldStudent.setAge(s.getAge());students.put(s.getId(),oldStudent); 遍历:这里一楼错了 Set keys = students.keySet();for(stuId:keys){ system.out.println(students.get(stuId)); //student类最好改写了toString(),否则打出的是地址}希望能给你帮助。 :)
因为看不懂,你的里面的map是代表什么意思,我就直接贴代码
for (Iterator iter = paramers.entrySet().iterator(); iter
.hasNext();) {
Map.Entry element = (Map.Entry) iter.next();
Object strKey = element.getKey();
String strObj = (String) element.getValue();
String vStrObj = strObj;
}
方法一 在for-each循环中使用entries来遍历
这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。
Map map = new HashMap();
for (Map.Entry entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
注意:for-each循环在java 5中被引入所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。
方法二 在for-each循环中遍历keys或values。
如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。
Map map = new HashMap();
//遍历map中的键
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//遍历map中的值
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
该方法比entrySet遍历在性能上稍好
方法三使用Iterator遍历
使用泛型:
Map map = new HashMap();
Iterator> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
不使用泛型:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
方法四、通过键找值遍历(效率低)
Map map = new HashMap();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
总结
如果仅需要键(keys)或值(values)使用方法二。
如果你使用的语言版本低于java 5,或是打算在遍历时删除entries,必须使用方法三。
否则使用方法一(键值都要)。
java中map集合用于存储键值对,即key-value,String字符串这里充当key键,List表这里是value值。 Java Map 集合类简介: Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(“键”和“值”),其中每个键映射到一个值。从概念上而言,可以将 List 看作是具有数值键的 Map。 查看 Map: 迭代 Map 中的元素不存在直接了当的方法。如果要查询某个 Map 以了解其哪些元素满足特定查询,或如果要迭代其所有元素(无论原因如何),则您首先需要获取该 Map 的“视图”。有三种可能的视图。 所有键值对 — 参见 entrySet() 所有键 — 参见 keySet() 有值 — 参见 values() 访问元素: Map 通常适合按键(而非按值)进行访问。Map 定义中没有规定这肯定是真的,但通常可以期望这是真的。例如,可以期望 containsKey() 方法与 get() 方法一样快。另一方面,containsValue() 方法很可能需要扫描 Map 中的值,因此它的速度可能比较慢。 前两个视图均返回 Set 对象,第三个视图返回 Collection 对象。就这两种情况而言,问题到这里并没有结束,这是因为无法直接迭代 Collection 对象或 Set 对象。要进行迭代,必须获得一个 Iterator 对象。因此,要迭代 Map 的元素,必须进行比较烦琐的编码