1.为什么学习Map集合:很多源码的底层用的是Map集合,有助力我们学习源码。
2.Map集合:存储Key-Value对,Key唯一的。
3.HashMap:存储Key-value对,Key唯一的。底层采用数组+链表结构存值。
Key的唯一性:通过hashCode()和equals()实现的。
注意:hashMap的键的数据类型一定要重新hashCode()和equals()才能键的唯一性。
eg:public static void main(String[] args) {
//创建集合对象
Map<String, String> hmap1=new HashMap<>();
//向集合中添加元素
hmap1.put("a", "aa");
hmap1.put("c", "rr");
hmap1.put("b", "ee");
hmap1.put("k", "aa");
hmap1.put("a", "kk");
//将map集合中Key-value当作一个整体entry,将整个Map转换为Set集合
Set<Entry<String, String>> set1= hmap1.entrySet();
//获得集合的迭代器
Iterator<Entry<String, String>> it1=set1.iterator();
//遍历集合
while (it1.hasNext()) {
Entry<String, String> e1=it1.next();
System.out.println("键为:"+e1.getKey()+",值为:"+e1.getValue());
}
System.out.println("-----------------------------------");
//删除集合中元素
hmap1.remove(44);
//将map集合中所有的键存到set集合中
Set<String> keySet=hmap1.keySet();
//遍历键的集合
for (String k : keySet) {
//通过Map集合的Key获得值
System.out.println("键为:"+k+",值为:"+hmap1.get(k));
}
System.out.println("*****************************");
//清空集合
hmap1.clear();
}
4.LinkedHashMap:存储Key-value对,key有序,唯一的。底层采用双重链接列表。
eg:public static void main(String[] args) {
//创建集合对象
Map<String, String> hmap1=new LinkedHashMap<>();
//向集合中添加元素
hmap1.put("a", "aa");
hmap1.put("c", "rr");
hmap1.put("b", "ee");
hmap1.put("k", "aa");
hmap1.put("a", "kk");
//将map集合中Key-value当作一个整体entry,将整个Map转换为Set集合
Set<Entry<String, String>> set1= hmap1.entrySet();
//获得集合的迭代器
Iterator<Entry<String, String>> it1=set1.iterator();
//遍历集合
while (it1.hasNext()) {
Entry<String, String> e1=it1.next();
System.out.println("键为:"+e1.getKey()+",值为:"+e1.getValue());
}
System.out.println("-----------------------------------");
//删除集合中元素
hmap1.remove("c");
//将map集合中所有的键存到set集合中
Set<String> keySet=hmap1.keySet();
//遍历键的集合
for (String k : keySet) {
//通过Map集合的Key获得值
System.out.println("键为:"+k+",值为:"+hmap1.get(k));
}
System.out.println("*****************************");
//清空集合
hmap1.clear();
}
5.TreeMap:存储key-value对,key无序,可排序,唯一的。底层采用二叉树。
Key的排序性:通过排序器实现,排序器的排序方法返回正数存在右边,返回负数存在左边。
key的唯一性:通过排序器返回0实现去重。
注意:TreeMap一定要用排序器,第一种TreeMap的Key的数据类型实现自然排序器,重写排序方法;
第二种声明一个自定义排序器类实现自定义排序器接口,重写排序方法,创建自定义排序 器类的对象,作为TreeMap构造方法的参数传递。
eg:案例一:Key用自然排序器
/**
* 学生类,实现自然排序器接口,重写排序方法
* @author sx
* @version 1.0 2019年7月3日
*/
public class Student2 implements Comparable<Student2>{
public String sname;
public Integer sage;
public Student2() {
}
public Student2(String sname, Integer sage) {
super();
this.sname = sname;
this.sage = sage;
}
/**
* 排序方法
* 排序规则:先按年龄从小到大,年龄相同再姓名的字典的降序
*/
@Override
public int compareTo(Student2 o) {
if (this.sage>o.sage) {
return 1;
}else if (this.sage<o.sage) {
return -1;
}else {//年龄相同
if (this.sname.compareTo(o.sname)>0) {
return -1;
}else if (this.sname.compareTo(o.sname)<0) {
return 1;
}else {//年龄相同,姓名相同
return 0;
}
}
}
}
public static void main(String[] args) {
//创建一个集合对象
TreeMap<Student2, String> tmap1=new TreeMap<>();
//向集合中添加元素
tmap1.put(new Student2("c", 28), "程资源");
tmap1.put(new Student2("j", 18), "蒋学志");
tmap1.put(new Student2("y", 38), "杨旭");
tmap1.put(new Student2("l", 48), "林俊杰");
tmap1.put(new Student2("c", 28), "杨嗣森");
//将map集合中key-value当作entry整合,将map集合集合转换为set集合
Set<Entry<Student2, String>> set2=tmap1.entrySet();
//获得集合的迭代器
Iterator<Entry<Student2, String>> it2=set2.iterator();
//遍历集合
while (it2.hasNext()) {
Entry<Student2, String> e2=it2.next();
System.out.println("键的姓名属性为:"+e2.getKey().sname+",值为:"+e2.getValue());
}
System.out.println("-------------------------------");
//删除集合中的元素
tmap1.remove(new Student2("j", 18));
//将map集合中所有键存入set集合
Set<Student2> keySet2=tmap1.keySet();
//遍历键的集合
for (Student2 k : keySet2) {
//根据Key获得value
System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
}
System.out.println("******************************");
//清空集合
tmap1.clear();
}
案例二:Key用自定义排序器
/**
* 自定义排序器类
* @author sx
* @version 1.0 2019年7月3日
*/
public class MyComparator3 implements Comparator<Student3>{
/**
* 排序方法
* 排序规则:先按年龄从小到大
*/
@Override
public int compare(Student3 o1, Student3 o2) {
if (o1.sage>o2.sage) {
return 1;
}else if (o1.sage<o2.sage) {
return -1;
}else {
return 0;
}
}
}
public static void main(String[] args) {
//创建一个集合对象,将自定义排序器类的对象作构造参数传入
TreeMap<Student3, String> tmap1=new TreeMap<>(new MyComparator3());
//向集合中添加元素
tmap1.put(new Student3("c", 28), "程资源");
tmap1.put(new Student3("j", 18), "蒋学志");
tmap1.put(new Student3("y", 28), "杨旭");
tmap1.put(new Student3("l", 48), "林俊杰");
tmap1.put(new Student3("c", 3), "杨嗣森");
//将map集合中key-value当作entry整合,将map集合集合转换为set集合
Set<Entry<Student3, String>> set2=tmap1.entrySet();
//获得集合的迭代器
Iterator<Entry<Student3, String>> it2=set2.iterator();
//遍历集合
while (it2.hasNext()) {
Entry<Student3, String> e2=it2.next();
System.out.println("键的姓名属性为:"+e2.getKey().sname+",值为:"+e2.getValue());
}
System.out.println("-------------------------------");
//删除集合中的元素
tmap1.remove(new Student3("j", 18));
//将map集合中所有键存入set集合
Set<Student3> keySet2=tmap1.keySet();
//遍历键的集合
for (Student3 k : keySet2) {
//根据Key获得value
System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
}
System.out.println("******************************");
//清空集合
tmap1.clear();
}
案例三:Key用匿名内部类自定义排序器
public static void main(String[] args) {
//创建一个集合对象,将匿名内部类的自定义排序器类的对象作构造参数传入
TreeMap<Student3, String> tmap1=new TreeMap<>(new Comparator<Student3>() {
/**
* 排序方法
* 排序规则:先按姓名升序,姓名相同,按年龄降序
*/
@Override
public int compare(Student3 o1, Student3 o2) {
if (o1.sname.compareTo(o2.sname)>0) {
return 1;
}else if (o1.sname.compareTo(o2.sname)<0) {
return -1;
}else {//姓名相同
if (o1.sage>o2.sage) {
return -1;
}else if (o1.sage<o2.sage) {
return 1;
}else {
return 0;
}
}
}
});
//向集合中添加元素
tmap1.put(new Student3("c", 28), "程资源");
tmap1.put(new Student3("j", 18), "蒋学志");
tmap1.put(new Student3("y", 28), "杨旭");
tmap1.put(new Student3("l", 48), "林俊杰");
tmap1.put(new Student3("c", 3), "杨嗣森");
//将map集合中key-value当作entry整合,将map集合集合转换为set集合
Set<Entry<Student3, String>> set2=tmap1.entrySet();
//获得集合的迭代器
Iterator<Entry<Student3, String>> it2=set2.iterator();
//遍历集合
while (it2.hasNext()) {
Entry<Student3, String> e2=it2.next();
System.out.println("键的姓名属性为:"+e2.getKey().sname+"键的年龄属性为"+e2.getKey().sage+",值为:"+e2.getValue());
}
System.out.println("-------------------------------");
//删除集合中的元素
tmap1.remove(new Student3("j", 18));
//将map集合中所有键存入set集合
Set<Student3> keySet2=tmap1.keySet();
//遍历键的集合
for (Student3 k : keySet2) {
//根据Key获得value
System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
}
System.out.println("******************************");
//清空集合
tmap1.clear();
}