------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
黑马程序员映射
映射是一个存储关键字和值的关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对象。关键字必须是唯一的。但值可以是重复的。
1. Map接口映射唯一关键字到值。关键字是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。映射循环使用两个基本操作:get()和put()。使用put()方法可以将一个指定了关键字和值的值加入映射。为了得到值,可以通过将关键字作为参数来调用get()方法。映射不是类集,但可以获得映射的类集“视图”。为了实现这种功能,可以使用entrySet()方法,它返回了一个包含了映射中元素的集合(Set)。为了得到关键字的类集“视图”,可以使用keySet()方法,因为Map的键是不能重复的,该方法返回的类型是Set。为了得到值的类集“视图”,可以使用values()方法,因为Map的值可以重复,该方法返回的类型是Collection。类集“视图”是将映射集成到类集框架内的手段。
2. SortedMap接口继承Map,它确保了各项按关键字升序排序。排序映射允许对子映射进行高效的处理。使用headMap(),tailMap()或subMap()方法可以获得子映射。调用firstKey()方法可以获得集合的第一个关键字。而调用lastKey()方法可以获得集合的最后一个关键字。
3. HashMap类使用散列表实现Map接口,本身并没有增加任何新的方法。它允许一些基本操作如get()和put()的运行时间保持恒定,即使对大型集合,也是这样。HashMap底层维护一个数组,我们向HashMap中所放置的对象实际上是存储到该数组当中。当向HashMap中put一对键值时,它会根据Key的hahsCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找,如果此链上有对象的话,再去使用equals()方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。
4. TreeMap类通过使用树实现Map接口。TreeMap提供了按排序顺序存储关键字/值对的有效手段,同时允许快速检索。应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序。TreeMap实现SortedMap。而它本身并没有另外定义其他方法。
5. 迭代函数。通常希望循环访问类集中的元素。例如,可能会希望显示每一个元素。处理这个问题最简单的方法是使用iterator。它是一个实现Iterator或者ListIterator接口的对象。Iterator可以完成循环通过类集,从而获得或删除元素。ListIterator继承Iterator,允许双向遍历列表,并可以修改元素。在通过迭代函数访问类集之前,必须得到一个迭代函数。每一个Collection类都提供一个iterator()函数,该函数返回一个对类集头的迭代函数。通过使用这个迭代函数对象,可以访问类集中的每一个元素,一次一个元素。使用迭代函数循环通过类集的内容,步骤如下:
(1) 通过调用类集的iterator()方法获得对类集头的迭代函数。
(2) 建立一个调用hasNext()方法的循环,只要hasNext()返回true,就进行循环迭代。
(3) 在循环内部,通过调用next()方法来得到每一个元素。
6. 比较函数。TreeSet和TreeMap都按排序顺序存储元素。然而,精确定义采用何种“排序顺序”的是比较函数。通常在默认情况下,这些类通过使用被Java称之为“自然顺序”的顺序存储他们的元素,而这种顺序通常也是我们所需要的。如果需要不同的方法对元素进行排序,可以在构造集合或映射时,指定一个Comparator对象。这样做为我们提供了一种精确控制如何将元素存储到排序类集和映射中的能力。Comparator接口定义了两个方法:compare()和equals()。这里给出的compare()方法按顺序比较了两个元素:int compare(Object obj1,Object obj2)obj1与obj2是被比较的两个对象。当两个对象相等时,该方法返回0;当obj1大于obj2时,返回一个正值;否则,返回一个负值。boolean equals(Object obj)这个方法中,obj是被用来进行相等测试的对象。如果obj和调用对象都是Comparator的对象并且使用相同的排序。该方法返回true。否则返回false。还有一种方式也能自定义比较方法:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。当两种排序都存在时,以比较器为主。
package com.heima.exam;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
publicclass MapTest1
{
publicstaticvoid main(String[] args)
{
HashMap<String,String> map = new HashMap<String,String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
map.put("d", "dd");
map.put("e", "ee");
Set<String> set = map.keySet();
for(Iterator<String> iter = set.iterator(); iter.hasNext();)
{
String key = (String)iter.next();
String value = (String)map.get(key);
System.out.println(key + "=" + value);
}
}
}
package com.heima.exam;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
publicclass MapTest2
{
publicstaticvoid main(String[] args)
{
HashMap<String,String> map = new HashMap<String,String>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
map.put("d", "dd");
Set<Entry<String, String>> set = map.entrySet();
for(Iterator<Entry<String, String>> iter = set.iterator(); iter.hasNext();)
{
Map.Entry<String, String> entry = (Map.Entry<String,String>)iter.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
System.out.println(key + " : " + value);
}
}
}
package com.heima.exam;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
publicclass TreeMapTest {
publicstaticvoid main(String[] args)
{
TreeMap<String,String> map = new TreeMap<String,String>(new MyComparator());
map.put("C","cc");
map.put("A","aa");
map.put("B","bb");
map.put("E","ee");
map.put("a","aa");
map.put("F","ff");
map.put("D","dd");
Set<String> set = map.keySet();
for(Iterator<String> iter = set.iterator(); iter.hasNext();)
{
String value = (String)iter.next();
System.out.println(value);
}
}
}
class MyComparator implements Comparator
{
publicint compare(Object arg0, Object arg1)
{
String s1 = (String)arg0;
String s2 = (String)arg1;
return s2.compareTo(s1);
}
}