- 1、map集合的理解:
- 2、map集合的存放值方式
- 3、根据迭代器取值
- 5、map接口的实现类
- 4、小结一下:map集合的特点
1、map集合的理解:
map是一个集合接口但他不像List,Set集合一样继承Collection接口,map中储存值的方式为key到value的映射,每一个key值映射一个value值,并且map中的key值不能重复,如果键位key值重复的话,则map集合的处理方式为覆盖,不为过滤;map集合包括map接口,及常用的实现类。
2、map集合的存放值方式
①:存值(注意在添加值的时候map集合的键位key以及值位value的类型,键值的类型只能为引用数据类型)
public static void main(String[] args) {
//定义map集合
Map<String, Object> map=new HashMap<String, Object>();
//添加值
map.put("zs","18");
}
②:取值(如果需要用map集合里面的值要注意这个值位的类型)
public static void main(String[] args) {
//定义map集合
Map<String, Object> map=new HashMap<String, Object>();
//添加值
map.put("zs","18");
//根据键位key值取到value值
System.out.println(map.get("zs"));
}
3、根据迭代器取值
①:迭代所有的键位
②:迭代所以的值位
③:迭代所有的值位及键位
下面是依次取值方式的代码
//①:迭代所有的键位
public static void main(String[] args) {
Map<String, Object> map=new HashMap<String, Object>();
map.put("zs","18");
map.put("ls","19");
map.put("ww","20");
map.put("zl","21");
//得到键位key的集合
Set<String> keySet = map.keySet();
//迭代
Iterator<String> it = keySet.iterator();
//迭代取值
while(it.hasNext()) {
System.out.println(it.next());
}
}
输出显示的结果为
ww
zl
ls
zs
//②:迭代所有的值位
public static void main(String[] args) {
Map<String, Object> map=new HashMap<String, Object>();
map.put("zs","18");
map.put("ls","19");
map.put("ww","20");
map.put("zl","21");
//得到值位value的集合
Collection<Object> values = map.values();
//迭代
Iterator<Object> it = values.iterator();
//迭代取值
while(it.hasNext()) {
System.out.println(it.next());
}
}
输出显示的结果为
20
21
19
18s
//③:迭代所有的键值位
public static void main(String[] args) {
Map<String, Object> map=new HashMap<String, Object>();
map.put("zs","18");
map.put("ls","19");
map.put("ww","20");
map.put("zl","21");
//得到所有的键值位
Set<Entry<String, Object>> entrySet = map.entrySet();
//迭代
Iterator<Entry<String, Object>> it = entrySet.iterator();
//使用foreach取值
for (Entry<String, Object> entry : entrySet) {
System.out.print("姓名:"+entry.getKey());
System.out.println("\t年龄:"+entry.getValue());
}
}
输出显示的结果为
姓名:ww 年龄:20
姓名:zl 年龄:21
姓名:ls 年龄:19
姓名:zs 年龄:18
5、map接口的实现类
①HashMap:HashMap是map接口最常用的实现类,它是根据键位key值的HashCode存储数据的,大多数情况下能直接定位到它的值,HashMap的遍历顺序是无序的,没有默认的排序方式,并且它能放入null值;HashMap为非线程安全,即在同一时候允许多个线程写HashMap方法,这个主要是因为HashMap的方法没有继承synchronized,所以它的查询速度是较快的,但不太安全,如果需要满足线程的安全又要查询速度加快的话则可以使用ConcurrentHashMap。HashMap的使用实在jdk1.2之后出来的操作,所以HashTable的功能HashMap差不多都有。
②HashTable:HashTable是在jdk1.0的时候出来的,所以在jdk1.2的时候出来的HashMap中类中差不多都包含了HashTable的方法;HashTable所有的方法都有synchronized,以至于它的查询的速度是慢的,但它是最安全的,任一时间只有一个线程能写HashTable,在不需要考虑线程安全的情况下建议使用HashMap。需要注意的是HashTable不能放入null值,否则它会报java.lang.NullPointerException类型的异常。
③TreeMap:TreeMap是实现Sorted接口的,它在保存值的时候是根据自己默认的排序保存,在取出值的时候也会按照一定的顺序取出,默认的排序应该是根据加入键值的ASCII 码的大小来确定顺序的;在使用TreeMap时,键位key值的类必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,否则会在运行时抛出java.lang.ClassCastException类型的异常。
④LinkedHashMap:LinkedHashMap继承于HashMap这个类,有一个HashMap没有的特点就是,LinkedHashMap会根据保存数据的顺序将这些值保存在集合中,但遍历的顺序较慢。
4、小结一下:map集合的特点
(1)、键位不允许重复,值位允许重复(如果键位允许重复,则为覆盖)
(2)、无序的,但是还会有自然排序
(3)、它没有继承Collection接口