本帖最后由 hansnowqiang 于 2015-11-28 21:45 编辑
我也是初学者刚刚看完了Map这块,这次写个总结和自己的理解希望能够有些帮助,同时也加深一下自己的印象:
Map集合:是由一系列的键值对组成的集合。键唯一,值可重复。
我们可以回想一下比较好理解的数组。数组是由java给定了键你只需要向里面填入值就可以了,而Map这需要你自己给定键。
例如:我可以定义一个String[] name ,将”唐伯虎“这个字符串放到里面那么 name[0]就能够得到”唐伯虎“。
同理。我们 Map<Integer,String>name = new Map<Integer,String>()
name.put(9527,”唐伯虎“)这样我们想得到”唐伯虎“时。(当然键和值都必须是引用类型,这里没加”“因为自动拆装箱)
String n = name.get(9527); 就可以了
Map下分为:HashMap、Hashtable、(此处不符合命名规则,这个是从JDK1.0就存在了,牵涉太多没办法修改了)TreeMap.
Map集合的数据结构仅仅针对键有效,与值无关。
HashMap:底层数据结构是哈希表。线程不安全,效率高。
以hashCode()和equals()方法保证元素唯一性。在比较自定义对象是需要重写自定义对象的hashCode()和equals()方法eclipse自动生成即可。
Hashtable: 底层数据结构是哈希表。线程安全,效率低.
其他与HashMap相同。
TreeMap:底层数据结构是红黑树。(是一种自平衡的二叉树) ,键是有序的。
键的有序是有两种形式的,一种是键所属于的类型本身就具有可比较排序的特性(即元素具有比较性),比如Integer本身就有compareTo方法。
另一种是我们为集合定义一个比较器Comparator(即集合具有比较性),针对键的值给出比较方法。
比较过程:>0放右边,<0放左边,=0剔除出去不要(保证键的唯一性)。
遍历:通过键获取值
Set<String> set = map.keySet();//通过keyset()方法返回一个键的Set集合
for (String key : set) { //使用增强for获取每一个set集合中的键
String value = map.get(key); //获取键对应的值
System.out.println(key + "---" + value);
}
获取键值对对象分别获得键和值:
Set<Map.Entry<String, String>> set1 = map.entrySet(); //Set<Map.Entry<K,V>> entrySet() 这个方法可以理解为返回了一个键和值成对的Set集合
for(Map.Entry<String, String> me:set1){ //这个键值对的元素类型为Map.Entry<String, String>
String key = me.getKey(); //Map.Entry<K,V>接口下有获取键和值得方法
String value = me.getValue();
System.out.println(key+"---"+value);
}
|