Map接口
1.是集合框架中的另外一个父接口
2. Map存储的数据的特点: 一对一的关系映射, 称之为Key-Value-Pair.
3. Map接口最常用的两个子类,是HashMap和TreeMap.
- HashMap: 底层使用了Hash表和红黑树的数据结构(jdk1.8以前使用的是hash表+单向链表)
- TreeMap: 底层使用的二叉树。
4. Map的key不能重复,但是可以为null。value可以重复
5. Map的key可以理解为是value的索引,总能通过一个key找到一个具体的value。
6. Map里的元素也是无序的(在结构中的顺序和存入顺序无关)
public class MapDemo01 {
public static void main(String[] args) {
//创建一个map集合(散列表)
Map<String,Integer> map = new HashMap<>();
map.put("张三",100);
map.put("李四",98);
map.put("王五",97);
map.out("赵六",99);
//输出打印一下
System.out.println(map);
Integer score = map.get("张三");
System.out.println("张三的成绩:"+score);
map.put("张三",60);
System.out.println(map);
map.get("小八");
System.out.println("小八的成绩:"+s1);
//测试:key是否可以为null ,可以,只能有一个。
map.put(null,0);
map.put(null,10);
System.out.println(map);
Map的其他方法演示:
public class MapDemo02 {
public static void main(String[] args) {
HashMap<String,String> course = new HashMap<>();
course.put("王老师","语文");
course.put("王老师","数学");
course.put("张老师","化学");
course.put("赵老师","生物");
System.out.println(course);
/**
* 1. boolean isEmpty()
*/
System.out.println("是否包含张老师这个key:"+course.containkey("张老师"));
/**
* 3. containsValue(Object o)
*/
System.out.println("是否包含数学这个value:"+course.containkey("数学"));
/**
* 4. V remove(K k): 移除一个键值对
*/
course.remove("赵老师");
System.out.println(course);
/**
* 5. int size()
*/
System.out.println(course.size());
/**
* 6. void clear(): 清空所有的键值对
*/
course.clear();
System.out.println(course.size());
System.out.println(course);
}
}
Map集合的遍历
public class MapDemo03 {
public static void main(String[] args) {
Map<String,Integer> scores = new HashMap<>();
scores.put("michael",100);
scores.put("lucy",98);
scores.put("tom",97);
scores.put("John",99);
/**
* 第一种方式: 使用 keySet(): 返回所有的key的set集合形式
*/
Set<String> keys = scores.KeySet();
for(String key:keys){
Integer value = scores.get(key);
System.out.println(key+"="+value);
}
/**
* 第二种方式: 使用 entrySet(): 返回entry对象的Set集合
* Entry: 是Map的内部类,Entry对象就是封装了一个键值对。
*/
Set<Map.Entry<String,Integer>> es = scores.entrySet();
for(Map.Entry<String,Integer> entry : es){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(Key+"="+value);
}
System.out.println("-----------------------");
/**
* 第三种方式: 使用values(): 返回所有的value的Collection
*/
Collection<Integer> values = scores.values();
for(Integer value:values){
System.out.println(value);
}
}
}
LinkedHashMap
1.是HashMap的子类型
2.使用链表维护了元素的插入排序
public class MapDemo04_LinkedHashMap {
public static void main(String[] args) {
Map<String,String> map = new LinkHashHash<>();
map.put("张三", "北京");
map.put("李四", "上海");
map.put("王五", "北京");
map.put("赵六", "长春");
System.out.println(map);
}
}
TreeMap
1. 使用二叉树对key进行排序,来维护整个集合的KV对的顺序 2. 默认是升序。 可以通过比较器进行自定义排序
public class MapDemo05_TreeMap {
public static void main(String[] args) {
Comparator c1 = new Comparator<String>(){
public int compare(String 01,String 02){
return -o1.comparaTo(o2);
}
};
Map<String,Integer> map = new TreeMap<>(c1);
map.put("A",100);
map.put("a", 90);
map.put("b", 80);
map.put("C", 90);
String.out.println(map);
}
}
ProperTies:
1. 是HashTable的子类型,比较常用,一般用于加载配置文件里的KEY和VALUE 2. 因为配置文件里都是字符串,因此Properties里的KEY和VALUE也都是String类型。 3. 该对象的key和value都不可以为null
public class MapDemo06_Properties {
public static void main(String[] args) {
//创建一个配置文件属性对象
Properties prop = new Properties();
//添加key和value
prop.setProperty("url","jdbc:mysql://localhost:3306/mydb");
prop.setProperty("username","root");
prop.setProperty("password","root");
prop.setProperty("driver","com.mysql.jdbc.Driver");
System.out.println(prop);
System.out.println(prop.size());
/**
* Properties的遍历
*/
for(Map.Entry<Object,Object> entry : prop.entrySet()){
System.out.println(entry.getKey() +"="+entry.getValue());
}
/**
* 通过指定的key,获取对应的value, 如果key不存在,返回null.
*/
String url = prop.getProperty("url");
System.out.println("url的值是: " + url);
/**
* getProperty(String key,String defaultValue)
* 逻辑: 通过指定的key,获取对应的value值,如果该key不存在,就返回默认值。
*/
String p1 = prop.getProperty("school","哈尔滨工业大学");
System.out.println(p1);
}
}