黑马程序员 集合学习笔记二
来源:互联网 发布:网络赚钱棋牌游戏 编辑:程序博客网 时间:2024/06/05 17:27
----------android培训、java培训、java学习型技术博客、期待与您交流!----------
Map<K,V>:Map接口声明从关键字K到值V的映射,实现Map接口的类主要有Hashtable、HashMap和TreeMap,Set集合底层通过Map实现的,其中方法
Collection<
V>
values()
返回映射中包含的值的Collection
视图。特殊之处是方法put(K key, V value)返回不是boolean值,而是V类型的value值,若键重复,则返回的是前一个键对应的value,且用后续的value覆盖之前的value如:
map.put(1,
"w01");
System.out.println(map.put(2, "w02"));//打印结果为w01
因为该方法的特性,所以一个很常见的应用是利用TreeMap集合判断字符串中某个字母出现的次数
1、Hashtable:通过hash表结构实现Map,该实现是同步的。Hashtable中不可以存入null键和null值。
2、HashMap:通过hash表结构实现Map,该实现不是同步的。HashMap中可以存入null键和null值。通过键的publicint hashCode()及public Boolean equals(Object obj)方法保证键的唯一性。HashMap通过hash码对其内部的映射关系进行快速的查找,HashMap类实现的Map集合对于添加和删除操作效率较TreeMap的更高。
3、TreeMap:通过二叉树结构实现Map,该实现不是同步的。该映射根据其键的自然顺序进行排序,通过元素实现Comparable接口的int compareTo(T o)方法使键具有可比性,也可以构造比较器进行特殊比较。TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的映射值也存在一定的顺序,应该使用TreeMap实现Map集合。
4、Map集合中元素的获取,通过查看API发现Map集合没有提供直接的迭代器,但是提供了以下方法:
Set<
K>
keySet()
返回此映射中包含的键的Set
视图。
V
get(
Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null
。
Set
<Map.Entry<
K
,
V
>>
entrySet
()
返回此映射中包含的映射关系的
Set
视图。
所以可以采取以下两种方式获取集合的元素
(1)、通过keySet方法获取键的Set集合,而Set集合提供了迭代器,那么可以通过迭代器迭代Map集合的键,再通过get(
Object key)
方法获取键所对应的的值。一个简单的示例:
import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class MapGetElements {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("w001", "aaa");map.put("w002", "bbb");map.put("w003", "ccc");map.put("w004", "ddd");Set<String> keySet = map.keySet();Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();String value = map.get(key);System.out.println(key+"="+value);}}}
(2)、
import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class MapGetElements {public static void main(String[] args) {Map<String,String> map = new HashMap<String,String>();map.put("w001", "aaa");map.put("w002", "bbb");map.put("w003", "ccc");map.put("w004", "ddd");Set<Map.Entry<String, String>> entrySet = map.entrySet();Iterator<Entry<String, String>> it = entrySet.iterator();while(it.hasNext()){Entry<String, String> element = it.next();String key = element.getKey();String value = element.getValue();System.out.println(key+"="+value);}}}
这里,while循环的遍历也可以采用for的增强形式进行遍历,此时便不需要迭代器
for (Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
public interface Map<K,V> {// 查询int size();boolean isEmpty();boolean containsKey(Object key);boolean containsValue(Object value);V get(Object key);// 修改V put(K key, V value);V remove(Object key);// 块操作void putAll(Map<? extends K, ? extends V> m);void clear();// 视图Set<K> keySet();// 因为key值不允许重复,所以用SetCollection<V> values();// 而value值是允许重复的,所以用CollectionSet<Map.Entry<K, V>> entrySet();// Map 的 entrySet() 方法返回一个实现 Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。interface Entry<K,V> {//详细介绍:http://zhidao.baidu.com/question/32679780.htmlK getKey();V getValue();V setValue(V value);boolean equals(Object o);int hashCode(); }// 比较 希哈boolean equals(Object o);int hashCode();}
对于Map接口,在“集合框架”中也有两个常规实现类,和Set接口类似,他们是:
HashMap类
更适合在Map
中插入、删除和定位元素。
使用HashMap
要求添加的键类明确定义了hashCode()
实现。
TreeMap类
适合按顺序遍历键。
有了TreeMap
实现,添加到映射的元素一定是可排序的。
实例:
public class Demo { public static void main(String[] args) throws Exception { String[] arg={"zhang","jin","yu","is","zhang","yun","yuan's","borather","and","is","wang","qi's","husband"}; Map map=new HashMap<>(); Integer ONE=new Integer(1); for(int i=0, n=arg.length; i<n; i++){ String key=arg[i]; Integer frequency=(Integer)map.get(key); if(frequency==null){ frequency=ONE; }else{ int value=frequency.intValue(); frequency=new Integer(value+1); } map.put(key, frequency); } System.out.println(map); Map sorted_map=new TreeMap(map); System.out.println(sorted_map); }}运行结果:{jin=1, is=2, yu=1, qi's=1, yuan's=1, zhang=2, yun=1, borather=1, husband=1, wang=1, and=1}{and=1, borather=1, husband=1, is=2, jin=1, qi's=1, wang=1, yu=1, yuan's=1, yun=1, zhang=2}结果分析:<span style="color:#FF0000;">当map中已经有一个Key为“zhang”时,再往其中添加Key值为“zhang”的key-value对会覆盖之前的。</span>
为了优化HashMap
空间的使用,可以调优初始容量和负载因子。这个TreeMap
没有调优选项,因为该树总处于平衡状态(和Set中一样)。
AbstractMap类(抽象类)
AbstrctMap类也覆盖了equals()
和hashCode()
方法,以确保两个相等映射返回相同的散列码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。按定义,映射的散列码是映射元素散列码的总和,其中每个元素是Map.Entry
接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的散列码。
总结:使用HashMap
要求添加的键类明确定义了hashCode()
实现。
----------android培训、java培训、java学习型技术博客、期待与您交流!----------
- 黑马程序员 集合学习笔记二
- 黑马程序员——集合学习笔记(二)
- 黑马程序员—Java学习笔记之集合框架(二)
- 黑马程序员-学习笔记-集合
- 黑马程序员-----集合框架笔记二
- 黑马程序员 java集合框架笔记(二)
- 黑马程序员 java集合笔记(二)
- 黑马程序员---Map集合 学习笔记
- 黑马程序员_java集合学习笔记
- 黑马程序员-java集合 学习笔记
- 黑马程序员java学习笔记,集合
- 黑马程序员-java基础-集合学习笔记
- 黑马程序员------java学习笔记之集合
- 黑马程序员_Set集合学习笔记
- 黑马程序员_ArrayList集合学习笔记
- 黑马程序员_Map集合学习笔记
- 黑马程序员 集合学习笔记三
- 黑马程序员 集合学习笔记一
- Quotient Polynomial
- 编程原则
- Android 之 下拉框(Spinner)的使用
- VB.net学习笔记(十五)继承与多接口练习
- (2/3/4)-D Sqr/Rects/Cubes/Boxes?
- 黑马程序员 集合学习笔记二
- 几种古典密码学算法
- Factstone Benchmark
- (WEB开发者)50个必备的实用jQuery代码段
- 1、NSUserDefaults的用法(20130820学习笔记);
- 单例模式
- 数据结构之排序算法之O(nlogn)
- Spring学习笔记(1)
- hdu 题目1385 Minimum Transport Cost (最短路径,路径保存及筛选)