- Map接口定义的集合又称查找表,用于存储所谓“Key-Value”映射对。Key可以看成是Value的索引,作为Key的对象在集合中不可以重复。
- 根据内部数据结构不同,Map接口有多种实现类,其中常用的有内部为hash表实现的HashMap和内部为排序二叉树实现的TreeMap。Map接口中常用的方法为get和put:
方法(其中V、K代表泛型) |
解释 |
V put(K key,V value) |
将Key-Value对存入Map,如果在集合中已经包含该Key,则操作将替换该Key对应的Value,返回值为该Key原来所对应的Value(如果没有则返回null)。 |
V get(Object key) |
返回与参数Key所对应的Value对象,如果不存在则返回null。 |
import java.awt.Point;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Map数据结构
* 存放数据以key-value的形式成对保存
* Map保存的数据可以重复,但是key不可以!
* 若重复保存相同的key的value时,实际的操作是替换value操作。
*
* 同样这样的数据结构在存放数据是也不建议存放两种以上的数据类型,
* 所有通常我们在使用Map时也要使用泛型约束存储内容的类型
*/
public class MapTest {
public static void main(String[] args) {
/**
* 创建Map时使用泛型。这里要约束两个类型,一个是key的
* 类型,一个是value的类型
*
* 创建一个key为字符串value为Point的Map
*/
Map<String,Point> map = new HashMap<String,Point>();
map.put("1,2",new Point(1,2));
map.put("3,4",new Point(3,4));
System.out.println(map);//{1,2=java.awt.Point[x=1,y=2], 3,4=java.awt.Point[x=3,y=4]}
/**
* 注意,因为map中已经存在了key为"1,2"的元素。若再次以
* 该key存放数据,那么Point(5,6)会替换之前的Point(1,2)!
*/
map.put("1,2",new Point(5,6));
System.out.println(map);//{1,2=java.awt.Point[x=5,y=6], 3,4=java.awt.Point[x=3,y=4]}
/**
* 获取map中的元素使用get方法
* V get(K key):传入对应的key获取其对应的Value
*/
Point p = map.get("1,2");
System.out.println(p);//java.awt.Point[x=5,y=6]
/**
* 若给定key在map中不存在则返回null!
* 所有,原则上在map中获取元素时要先判断是否有该元素,
* 要有在使用,避免空指针异常的出现。
*
* Map在获取元素时非常有针对性。
* 集合想获取元素需要遍历集合内容。而Map不需要。你只要给
* 它特定的key就可以获取该元素。
*
* 计算机中有这样一句话:
* 越灵活的程序性能越差,顾及的多了。
*/
p = map.get("haha");
//System.out.println(p.getX()+","+p.getY());//java.lang.NullPointerException
/**
* Map的其它方法
* boolean containsKey(K key):当前map中是否包含给定的key
* boolean containsValue(V value):当前map中是否包含给定的value
*/
System.out.println(map.containsKey("123"));//false
System.out.println(map.containsValue(new Point(3,4)));//true
/**
* 遍历HashMap
* 方法1:获取所有的key并根据key获取value从而达到遍历的效果
* HashMap获取所有key的方法:keySet()
* 该方法可以获取保存在该map下所有的key并以Set集合的形式返回
*/
/**
* 获取当前map中所以key
* 因为key在HashMap的泛型中规定了类型为String
* 所有返回的Set中的元素也应是String,为了更好的使用
* 我们定义Set类型变量时也应该加上泛型
*/
Set<String> keyset = map.keySet();
/**
* 遍历所有的key,根据key去map中获取对应的value
*/
for (String key:keyset){
System.out.println(map.get(key));//根据key获取value
}
//普通for循环,不建议用,建议用上面这种循环
for (Iterator<String> it = keyset.iterator(); it.hasNext();){
String key = it.next();
System.out.println(map.get(key));//根据key获取value
}
/**
* LinkedHashMap:和HashMap使用上完全一致,内部维护着一个链表,
* 可以使其存放元素时的顺序与迭代时一致。
* 只是存放和取出的顺序是一致的,这点和HashMap无序是不一致的。
*/
/**
* 迭代map的方式2
* 以”键值对“的形式迭代
* map支持另一个方法entrySet()
* 该方法返回一个Set集合,里面的元素是map中每一组键值对,
* map以Entry类的实例来描述每一个键值对
*
* Entry描述一个键值对
* 其中两个方法:
* getKey():获取key值
* getValue():获取value值
*
* Entry所在位置:java.util.Map.Entry
* Entry也需要泛型的约束。其约束的泛型应该和Map相同!
* 因为一个Entry实例保存这个Map中的一组键值对。
*/
Set<Map.Entry<String, Point>> entries = map.entrySet();
for (Map.Entry<String, Point> entry:entries){
//获取key
String key = entry.getKey();
//获取value
Point value = entry.getValue();
System.out.println(key+":"+value);
}
}
}
网友评论