Map集合
目录
1 Map父接口
特点:存储一对数据(Key-Value),无序、无下标,键不可重复,值可重复。
定义:public interface Map<K,V>
方法:
int size();//集合大小
boolean isEmpty();//是否为空
boolean containsKey(Object key);//是否包含key
boolean containsValue(Object value);//是否包含value
V put(K key,V value) //将对象存入到集合中,关联键值。key重复则覆盖原值。
Object get(Object key) //根据键获取对应的值
V remove(Object key); //删除key 返回对应的值
void clear(); //清空集合
Set<K> keySet() //返回所有的key
Collection<V> values() //返回包含所有值的Collection
Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。
2 HashMap
2.1 HashMap的定义
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 --jdk1.6 api
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
2.2 HashMap使用
/**
* Map集合的使用
* 特点:存储键值对;键不可以重复,值可以重复;无序
* HashMap:
* jdk1.2版本,线程不安全,运行效率快;允许用null作为key或是value
*/
public class Map1 {
public static void main(String[] args) {
//创建集合
Map<String,String> map = new HashMap<>();
//添加元素
map.put("cn","中国");
map.put("uk","英国");
map.put("usa","美国");
map.put("cn","zhongguo");//已经存在键为"cn"的值了,会把原来的值覆盖掉
map.put(null,"日本");//存放null键值
map.put("ckk",null);
System.out.println(map);
//判断
System.out.println(map.containsKey("cn"));//判断是否存在key
System.out.println(map.containsValue("中国"));//判断是否存在value
//删除元素
// String usa = map.remove("usa");//会返回删除key所对应的value,key不存在返回null
// System.out.println("删除了:"+usa);
// boolean removed = map.remove("uk", "英国");//会返回是否删除成功
// System.out.println("删除成功:"+removed);
//遍历
//方法一 获取key的set集合,使用迭代器
// Set<String> keySet = map.keySet();
// Iterator<String> keyIterator = keySet.iterator();
// while (keyIterator.hasNext()){
// String key = keyIterator.next();
// String value = map.get(key);
// System.out.println(key+"---"+value);
// }
//方法二 获取key的set集合,使用增强for
// Set<String> keySet = map.keySet();
// for (String key : keySet) {
// System.out.println(key+"---"+map.get(key));
// }
//方法三 获取map的Entry组成的Set集合,然后使用迭代器遍历
// Set<Map2.Entry<String, String>> entrySet = map.entrySet();
// Iterator<Map2.Entry<String, String>> entryIterator = entrySet.iterator();
// while (entryIterator.hasNext()){
// Map2.Entry<String, String> entry = entryIterator.next();
// String key = entry.getKey();
// String value = entry.getValue();
// System.out.println(key+"---"+value);
// }
//方法四 获取map的Entry组成的Set集合,然后使用迭代器遍历
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"---"+value);
}
}
}
运行结果
{usa=美国, uk=英国, cn=zhongguo}
true
false
usa---美国
uk---英国
cn---zhongguo
HashMap判断重复的方式和HashSet是一样的,都是判断元素(key)的hashCode
和equals
是否相同。存入HashMap的key要重写这两个方法。
3 Hashtable(不使用)
jdk1.0版本,线程安全,运行效率慢;不允许null作为key或是value
4 Properties
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
5 TreeMap
实现了SortedMap接口(是Map的子接口),可以对key自动排序。
TreeMap的key要实现Comparable接口,为了排序。
/**
* TreeMap的使用
* 存储结构:红黑树
*/
public class Map2 {
public static void main(String[] args) {
//创建集合
Map<Student,String> stringMap = new TreeMap<>();
//添加元素
Student s1 = new Student("王二",100);
Student s2 = new Student("张三",101);
Student s3 = new Student("李四",102);
stringMap.put(s1,"北京");
stringMap.put(s2,"上海");
stringMap.put(s3,"天津");
stringMap.put(s3,"aa");
System.out.println(stringMap);
}
}
Student类
public class Student implements Comparable<Student>{
private String name;
private int stuNo;
//getter、setter、构造器、toString
@Override
public int compareTo(Student o) {
return this.stuNo-o.stuNo;
}
}
运行结果
{Student{name='王二', stuNo=100}=北京, Student{name='张三', stuNo=101}=上海, Student{name='李四', stuNo=102}=aa}
HashMap HashTable TreeMap区别
HashMap | HashTable | TreeMap | |
---|---|---|---|
同步 | √ | ||
key有序 | √ | ||
null | key只能有一个null value可以多个null |
都不能为null | key不能为null value可以多个null |
---------------
我每一次回头,都感觉自己不够努力,所以我不再回头。
---------------