Map
Map是一个接口,创建对象的时候,需要根据多态依靠它的实现类来创建
Map的特点是Map存储的对象是键值对,或者说Map是装键值对的容器
每一个键值对都是一个key对应一个Value;Key值是唯一,不能重复,但是value是可以重复的
基本上对Map对象的操作都是对key来操作的
如图所示:key和value就是一对键值对,但是要注意的是Map中的存储的键值对是无序的,没有顺序的.
下面我们来创建一个Map对象
//定义Map的时候,泛型中前面的K是指键值对中Key的数据类型,后面的V指的是键值对中value的数据类型
Map<String, Integer> map = new HashMap<>();//Map的实现类有很多,我们主要用HashMap和TreeMap
map.put("b", 15);//Map的添加元素的方法是put
map.put("d", 16);
map.put("c", 14);
map.put("a", 17);
map.put("a", 18);//这里的key值和上面的key重复了,因为map中key值是不能重复的,所以此时将原来key值对应的value给覆盖了,换成了新的
System.out.println(map);
输出的结果是
{a=18, b=15, c=14, d=16}
从输出结果我们看出,重复的key值并没有添加进来,但是对应的key值却改变了,是被新的值给覆盖了
下面我们我们来看看Map中的一些常用API,就用刚才我们创建的map来试一下
map.clear();//清空map
boolean containsKey = map.containsKey("a");//判断map中是否包含key为"a"的键值对
boolean containsValue = map.containsValue(18);//判断map中是否包含value为18的键值对
boolean isEmpty = map.isEmpty();//判断map是否为空
int value = map.get("a");//根据key值来取value
int size = map.size();//判断map中键值对的对数
Integer number = map.remove("a");//删除map中key值为a的键值对,返回值为删除的键值对中的value值
HashMap
HashMap是Map的实现类
HashMap其实和HashSet有很多相同处,这是因为HashSet的底层实现是依赖HashMap来实现的,所以hashSet和hashMap都会去除重复的,而且底层实现是一样的
下面我们来创建一个HashMap,里面的key值是一个非系统类,而是我们自己创建的一个Student类
public class Student
{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
//下面就是重写的hashCode和equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
//上面是我们 创建的student类
HashMap<Student, String> map = new HashMap<>();
map.put(new Student("zhangsan", 18), "beijing");
map.put(new Student("fanjunnan", 19), "henan");
map.put(new Student("lisi", 20),"shanghai");
map.put(new Student("fanjunnan", 19), "shanghai");
HashMap中去重是对Key操作的,因为Key是唯一的,不能重复
和HashSet类似,如果我们在添加键值对的时候,如果不重写hashCode和equals方法的话,因为Student类中的每一个对象在堆内存中的地址都不一样,所以系统会根据地址来判断没有重复的,所以我们要重写hashCode和equals方法.
因为Map也是一个容器,所以我们是可以对Map进行遍历的
对Map遍历的方法大致有这几种:
第一种:我们是根据KeySet()的对象方法,将Key值取出来放到一个集合中,然后对集合进行遍历,利用Key值得到所有的value值
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("b", 15);
hashMap.put("d", 16);
hashMap.put("c", 14);
hashMap.put("a", 17);
hashMap.put("a", 18);
Set<String> set = hashMap.keySet();//获得装着所有key的集合
for (String string : set) //增强for循环
{
String Key = string;
int value = hashMap.get(Key);//获得所有的value值
}
第二种:我们根据对象方法 entry Set()将map中所有的键值对装到一个集合中,entry类型的对象就是一个键值对
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("b", 15);
hashMap.put("d", 16);
hashMap.put("c", 14);
hashMap.put("a", 17);
hashMap.put("a", 18);
Set<Entry<String, Integer>> entrySet = hashMap.entrySet();//获得装着map所有键值对的集合set
for (Entry<String, Integer> entry : entrySet) //遍历集合
{
String key = entry.getKey();
int value = entry.getValue();
}
TreeMap
TreeMap也是Map的实现类,TreeMap和TreeSet也有很多的相似之处
TreeSet的底层实现就是依赖TreeMap来实现的,
所以TreeMap也会根据key来进行排序
这里面我们同样要注意的是,在key为非系统类的对象的时候,我们要重写comparable中的比较方法来规定排序的规则,或者我们为TreeMap构建一个比较器,来排序
例如:在Map中添加三名学生,根据学生的年龄排序
//我们向map中添加三个键值对,key为学生,同时给map构建一个比较器
TreeMap<Student, String> treeMap = new TreeMap<new StudentImpl()>();
treeMap.put(new Student("zhangsan",18), "shanghai");
treeMap.put(new Student("lisi",20), "beijing");
treeMap.put(new Student("zhangsan",16), "hunan");
//我们需要写一个类来实现comparator接口中的比较方法
public class studentImpl implements Comparator<Student>
{
public int compare(Student o1, Student o2) {
int number = o1.getAge() - o2.getAge();
int nameNumber = o1.getName().compareTo(o2.getName());
//这里当俩对象的年龄一样的时候,一定要返回一个非0的值,否则系统会 认为Key值重复,value就会覆盖掉以前的
return number == 0 ? nameNumber==0 ? 1: nameNumber :number ;
}
}