1.Map接口
Map接口存储一组键值对象类型的数据 k-v,提供key(键)和value(值)的映射.
k的特点:无序的,不可重复的 ---->所有的key的值就是一个set集合.
v的特点:无序的,可重复 ----->Collection的特点
一个key对象一个value值,如果想要对应多个,多个value值可以存在在一个数组|容器中,但当key相同时候,value会覆盖.
接下来我们看一下map容器的使用
public class MapDemo01 {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap();
//put(key,value) 添加
map.put("java33期", 23);
map.put("java32期", 20);
map.put("java32期", 21);
map.put("java31期", 40);
map.put("java30期", 35);
map.put("java29期", 20);
System.out.println(map);
//remove(key) 返回被移出的value值
map.remove("java32期");
System.out.println(map);
//包含
System.out.println(map.containsKey("java33期"));
System.out.println(map.containsValue(19));
//get(key)
System.out.println(map.get("java33期"));
System.out.println(map);
}
}
- map中添加数据使用put(key,value)的方式
- remove(key) 移除相应的(key,value)数据
- map.containsKey|map.containsValue 判断其key或者value是否存在于容器中.返回对应的true|false
- get(key) 根据key值返回对应的value值
下面我们来看看map容器下的遍历问题
- 方法一:keySet() 返回所有的key,组成一个set集合
Set<String> set=map.keySet();
for(String cl:set){
System.out.println(cl);
- 方法二:迭代器
Iterator<String> it=set.iterator();
while(it.hasNext()){
String key=it.next();
System.out.println(key+","+map.get(key));
- 方法三:获取所有的value值 values() 只能拿到value的值,无法获取key
Collection<Integer> col=map.values();
for(Integer in:col){
System.out.println(in);
}
- 方法四:直接获取键值对的形式,在通过其他方式进行遍历
Set<Map.Entry<String,Integer>> sets=map.entrySet();
for(Map.Entry<String,Integer> entry:sets){
System.out.println(entry.getKey()+"-->"+entry.getValue());
}
2.HashMap与TreeMap
HashMap 推荐使用 ,线程不安全增删,查询效率高 底层: 哈希表的结构
初始容量:16
加载因子: 0.75
扩容:原容量的2倍
- 如果HashMap的key是自定义的引用数据类型,需要对key的数据的类型重写hashCode()和equals()方法,实现去重,value会覆盖
- 如果key相同,value不覆盖-->先判断,如果key相同就不存储,key不相同,才存储
- 如果需求个根据value去重,需要自己手动定义判断 containsKey() containsValue()
public class HashMapDemo02 {
public static void main(String[] args) {
HashMap<Person,String> map=new HashMap();
map.put(new Person("胡歌",30,180), "上海");
map.put(new Person("杨洋",18,160), "北京");
map.put(new Person("霍比特人",60,100), "新西兰");
map.put(new Person("霍比特人",60,100), "荷兰");
System.out.println(map);
}
}
TreeMap 中的数据有按照指定规则进行排序,推荐使用TreeMap
定义容器TreeMap
-
1)存储key是基本数据类型|String ,value引用数据类型的数据-->去重,排序
-
2)存储key是自定义的应用数据类型,value是任意类型 -->去重,排序
-
去重和排序都按照比较规则进行操作 内部和外部比较器
public class TreeMap03 {
public static void main(String[] args) {
/*TreeMap<Person,Person> map=new TreeMap((p1,p2)->{
return ((Person)p1).getAge()-((Person)p2).getAge();
});*/
//匿名内部类 接口多态指向一个不知名的实现类对象
Comparator com=new Comparator(){
@Override
public int compare(Object o1, Object o2) {
return ((Person)o2).getAge()-((Person)o1).getAge();
}
};
TreeMap<Person,Person> map=new TreeMap(com);
map.put(new Person("胡歌",30,180),new Person("哈哈",100,100));
map.put(new Person("杨洋",18,160),new Person("哈哈",100,100));
map.put(new Person("霍比特人",60,100),new Person("哈哈",100,100));
map.put(new Person("霍比特人",60,100), new Person("哈哈",100,100));
System.out.println(map);
}
}
//Comparator 接口 抽象方法compare() 中可以定义比较规则
class Demo implements Comparator{
@Override
public int compare(Object o1, Object o2) {
return ((Person)o2).getAge()-((Person)o1).getAge();
}
}
Hashtable 相当于线程安全的HashMap