Map集合学习笔记一

4 篇文章 0 订阅
2 篇文章 0 订阅

1.Java很多技术底层通过Map来实现的。

2.HashMap:按Key-value方式存值,Key无序的,唯一单一对象,底层采用数组+链表(哈希表)结构存值

注意:hashMap的key的泛型数据类型一定要重写hashCode()和equals()
Key唯一性:通过重写hashCode()和equals()实现的
根据key调用hashCode()经过计算得到hash码,根据hash码和数组的长度计算出该key存储的位置index,如果index索引位置上没有值,将当前key-value键值对存在当前位置index上;如果位置index已经存在了键值对(节点),则用key调用equals()与index位置上原本的key进行比较,如果key相同,则当前key-value(新增的键值对)中的key不存value覆盖;如果key不相同,则将key-value键值对(新增的)接着存入到index的后面。

public class Student {
	public String sanme;
	public Integer sage;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}
	
	public Student(String sanme, Integer sage) {
		super();
		this.sanme = sanme;
		this.sage = sage;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((sage == null) ? 0 : sage.hashCode());
		result = prime * result + ((sanme == null) ? 0 : sanme.hashCode());
		return result;
	}

	@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 (sage == null) {
			if (other.sage != null)
				return false;
		} else if (!sage.equals(other.sage))
			return false;
		if (sanme == null) {
			if (other.sanme != null)
				return false;
		} else if (!sanme.equals(other.sanme))
			return false;
		return true;
	}
}
public static void main(String[] args) {
    //创建集合对象
    HashMap<Student, String> hmap1=new HashMap<>();
    //向集合中添加元素
    hmap1.put(new Student("kk3",11), "aa");
    hmap1.put(new Student("kk1",44), "ee");
    hmap1.put(new Student("kk4",22), "bb");
    hmap1.put(new Student("kk6",33), "ff");
    hmap1.put(new Student("kk3",11), "kk");
    
    /*遍历集合*/
    //将Key-value看作一个整体,将map转换为set集合
    Set<Entry<Student, String>> set1=hmap1.entrySet();
    //获得跌代器对象
    Iterator<Entry<Student, String>> it1=set1.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it1.hasNext()) {
        //获得每个跌代的元素
        Entry<Student, String> e=it1.next();
        System.out.println("键姓名属性为:"+e.getKey().sanme+",键年龄属性为:"+e.getKey().sage+",值为:"+e.getValue());
    }
    System.out.println("---------------------------------");
    
    //删除集合中元素对象
    hmap1.remove(new Student("kk6",33));
    
    /*遍历集合*/
    //获得map集合中所有Key的集合
    Set<Student> set2=hmap1.keySet();
    //遍历Key集合
    //获得跌代器对象
    Iterator<Student> it2=set2.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it2.hasNext()) {
        //获得每个跌代的元素
        Student k=it2.next();
        System.out.println("键姓名属性为:"+k.sanme+",键年龄属性为:"+k.sage+",值为:"+hmap1.get(k));
    }
}

3.匿名内部类:当一个类的方法中完整包含另一个类,这个类没有名字就叫匿名内部类

3.1:适用场景:当一个类一生只有一个对象,就可以用匿名内部类

3.2:一个Java类(普通类或内部类)对应一个.class字节码文件

/**
 * 自我介绍的接口
 */
public interface MySelf {
	/**
	 * 自我介绍的方法
	 */
	public void showMyself();
}
public static void main(String[] args) {
//		//创建对象
//		Student stu1=new Student();
//		//用对象调用方法
//		stu1.showMyself();
    
    /*第一种:创建匿名内部类的对象,调用方法*/
    //创建匿名内部类的一个对象,大括号就是匿名内部类,
    //new MySelf()用父接口或父抽象类作为数据类型,创建匿名内部类对象
    MySelf teacher= new MySelf() {
        @Override
        public void showMyself() {
            System.out.println("大家好,我叫渣渣辉");
        }
    };
    
    //用匿名内部类的对象调用方法
    teacher.showMyself();
    
    /*第二种:创建匿名内部类的对象的同时调用方法*/
    new MySelf() {
        @Override
        public void showMyself() {
            System.out.println("大家好,我叫蔡徐坤1");
        }
    }.showMyself();

}

4.TreeMap:按Key-value对方式存值,key无序可排序的唯一的单一对象.底层采用红黑二叉车树存值

注意:TreeMap一定要用排序器,重写排序方法
Key的可排序性:通过排序器的排序方法来排序,返回负数(-1)排在前面,返回正数(1)排在后面;
Key的唯一性:去重是通过排序器的排序方法返回0,Key重复不存,Value覆盖
将key-value键值对中的key拿出调用排序器的排序方法,与根节点相比较,如果当前是一棵空树(即没有根节点),将当前的键值对作为根节点;继续将下一对key-value键值对中的key拿出来调用排序器的排序方法与根节点开始依次向下的节点相比较,直到找到该key-value键值对所应该存放的位置为止,比较结果返回负数(-1)排在当前节点的左子节点,返回正数(1)排在当前节点的右子节点,若是返回0则说明是相同的节点,key不存(还是原来的key)value覆盖(新key-value中value)。

public static void main(String[] args) {
    //创建集合对象,默认Key用自然排序器,Key的泛型类型要实现自然排序器接口,重写排序方法
    TreeMap<Student3, String> tmap1=new TreeMap(new Comparator<Student3>() {
        
        /**
        * 重写排序器的排序方法
        * @param o1代表当前要添加对象
        * @param o2每个要比较的对象,从根节点开始比较
        * 排序规则:按姓名升序,姓名相同按年龄升序排序
        */
        @Override
        public int compare(Student3 o1, Student3 o2) {
            if (o1.sanme.compareTo(o2.sanme)!=0) {
                return o1.sanme.compareTo(o2.sanme);
            }else {//姓名相同按年龄升序排序
                return o1.sage.compareTo(o2.sage);
            }
        }
    });
    //向集合中添加元素
    tmap1.put(new Student3("aa", 22), "aa1");
    tmap1.put(new Student3("aa", 66), "ff1");
    tmap1.put(new Student3("dd", 44), "dd1");
    tmap1.put(new Student3("kk", 88), "kk1");
    tmap1.put(new Student3("aa", 22), "uu1");
    
    /*第一种:遍历Map集合*/
    //将Key-value看作一数据整体,将map集合转换为set集合
    Set<Entry<Student3, String>> set1=tmap1.entrySet();
    //获得集合的跌代器对象
    Iterator<Entry<Student3, String>> it1=set1.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it1.hasNext()) {
        //获得跌代器对象
        Entry<Student3, String> e1=it1.next();
        System.out.println("Key的姓名属性为:"+e1.getKey().sanme+",Key的年龄属性为:"+e1.getKey().sage+",值为:"+e1.getValue());
    }
    
    System.out.println("--------------------------");
    //删除集合中元素
    tmap1.remove(new Student3("aa", 22));
    
    /*第二种:遍历Map集合*/
    //获得map集合中所有的Key
    Set<Student3> set2=tmap1.keySet();
    //获得集合的跌代器对象
    Iterator<Student3> it2=set2.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it2.hasNext()) {
        //获得跌代器对象
        Student3 k=it2.next();
        System.out.println("Key的姓名属性为:"+k.sanme+",Key的年龄属性为:"+k.sage+",值为:"+tmap1.get(k));
    }
}

5.排序器:

5.1:自然排序器

/**
 * 学生类,实现自然排序器接口
 */
public class Student2 implements Comparable<Student2>{
	public String sanme;
	public Integer sage;
	
	public Student2() {
		// TODO Auto-generated constructor stub
	}
	
	public Student2(String sanme, Integer sage) {
		super();
		this.sanme = sanme;
		this.sage = sage;
	}

	/**
	 * 重写排序器的排序方法
	 * @param o 每个要比较的节点对象,从根节点开始
	 * 排序规则:先按姓名升序排序,姓名相同再按年龄降序
	 */
	@Override
	public int compareTo(Student2 o) {
        if (this.sanme.compareTo(o.sanme)!=0) {
            return this.sanme.compareTo(o.sanme);
        }else {//姓名相同再按年龄降序
            return -this.sage.compareTo(o.sage);
        }
	}
}
public static void main(String[] args) {
    //创建集合对象,默认Key用自然排序器,Key的泛型类型要实现自然排序器接口,重写排序方法
    TreeMap<Student2, String> tmap1=new TreeMap();
    //向集合中添加元素
    tmap1.put(new Student2("aa", 22), "aa1");
    tmap1.put(new Student2("aa", 66), "ff1");
    tmap1.put(new Student2("dd", 44), "dd1");
    tmap1.put(new Student2("kk", 88), "kk1");
    tmap1.put(new Student2("aa", 22), "uu1");
    
    /*第一种:遍历Map集合*/
    //将Key-value看作一数据整体,将map集合转换为set集合
    Set<Entry<Student2, String>> set1=tmap1.entrySet();
    //获得集合的跌代器对象
    Iterator<Entry<Student2, String>> it1=set1.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it1.hasNext()) {
        //获得跌代器对象
        Entry<Student2, String> e1=it1.next();
        System.out.println("Key的姓名属性为:"+e1.getKey().sanme+",Key的年龄属性为:"+e1.getKey().sage+",值为:"+e1.getValue());
    }
    
    System.out.println("--------------------------");
    //删除集合中元素
    tmap1.remove(new Student2("aa", 22));
    
    /*第二种:遍历Map集合*/
    //获得map集合中所有的Key
    Set<Student2> set2=tmap1.keySet();
    //获得集合的跌代器对象
    Iterator<Student2> it2=set2.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it2.hasNext()) {
        //获得跌代器对象
        Student2 k=it2.next();
        System.out.println("Key的姓名属性为:"+k.sanme+",Key的年龄属性为:"+k.sage+",值为:"+tmap1.get(k));
    }
}

5.2:自定义排序器

/**
 * 自定义排序器类
 */
public class MyComparator3 implements Comparator<Student3>{

	/**
	 * 重写排序器的排序方法
	 * @param o1代表当前要添加对象
	 * @param o2每个要比较的对象,从根节点开始比较
	 * 排序规则:按姓名升序,姓名相同按年龄升序排序
	 */
	@Override
	public int compare(Student3 o1, Student3 o2) {
        if (o1.sanme.compareTo(o2.sanme)!=0) {
            return o1.sanme.compareTo(o2.sanme);
        }else {//姓名相同按年龄升序排序
            return o1.sage.compareTo(o2.sage);
        }
	}
}
public static void main(String[] args) {
    //创建自定义排序器的对象
    MyComparator3 mc=new MyComparator3();
    //创建集合对象,默认Key用自然排序器,Key的泛型类型要实现自然排序器接口,重写排序方法
    TreeMap<Student3, String> tmap1=new TreeMap(mc);
    //向集合中添加元素
    tmap1.put(new Student3("aa", 22), "aa1");
    tmap1.put(new Student3("aa", 66), "ff1");
    tmap1.put(new Student3("dd", 44), "dd1");
    tmap1.put(new Student3("kk", 88), "kk1");
    tmap1.put(new Student3("aa", 22), "uu1");
    
    /*第一种:遍历Map集合*/
    //将Key-value看作一数据整体,将map集合转换为set集合
    Set<Entry<Student3, String>> set1=tmap1.entrySet();
    //获得集合的跌代器对象
    Iterator<Entry<Student3, String>> it1=set1.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it1.hasNext()) {
        //获得跌代器对象
        Entry<Student3, String> e1=it1.next();
        System.out.println("Key的姓名属性为:"+e1.getKey().sanme+",Key的年龄属性为:"+e1.getKey().sage+",值为:"+e1.getValue());
    }
    
    System.out.println("--------------------------");
    //删除集合中元素
    tmap1.remove(new Student3("aa", 22));
    
    /*第二种:遍历Map集合*/
    //获得map集合中所有的Key
    Set<Student3> set2=tmap1.keySet();
    //获得集合的跌代器对象
    Iterator<Student3> it2=set2.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it2.hasNext()) {
        //获得跌代器对象
        Student3 k=it2.next();
        System.out.println("Key的姓名属性为:"+k.sanme+",Key的年龄属性为:"+k.sage+",值为:"+tmap1.get(k));
    }
}

5.3:匿名自定义排序器

public static void main(String[] args) {
    //创建集合对象,默认Key用自然排序器,Key的泛型类型要实现自然排序器接口,重写排序方法
    TreeMap<Student3, String> tmap1=new TreeMap(new Comparator<Student3>() {
        
        /**
        * 重写排序器的排序方法
        * @param o1代表当前要添加对象
        * @param o2每个要比较的对象,从根节点开始比较
        * 排序规则:按姓名升序,姓名相同按年龄升序排序
        */
        @Override
        public int compare(Student3 o1, Student3 o2) {
            if (o1.sanme.compareTo(o2.sanme)!=0) {
               return o1.sanme.compareTo(o2.sanme);
            }else {//姓名相同按年龄升序排序
                return o1.sage.compareTo(o2.sage);
            }
        }
    });
    //向集合中添加元素
    tmap1.put(new Student3("aa", 22), "aa1");
    tmap1.put(new Student3("aa", 66), "ff1");
    tmap1.put(new Student3("dd", 44), "dd1");
    tmap1.put(new Student3("kk", 88), "kk1");
    tmap1.put(new Student3("aa", 22), "uu1");
    
    /*第一种:遍历Map集合*/
    //将Key-value看作一数据整体,将map集合转换为set集合
    Set<Entry<Student3, String>> set1=tmap1.entrySet();
    //获得集合的跌代器对象
    Iterator<Entry<Student3, String>> it1=set1.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it1.hasNext()) {
        //获得跌代器对象
        Entry<Student3, String> e1=it1.next();
        System.out.println("Key的姓名属性为:"+e1.getKey().sanme+",Key的年龄属性为:"+e1.getKey().sage+",值为:"+e1.getValue());
    }
    
    System.out.println("--------------------------");
    //删除集合中元素
    tmap1.remove(new Student3("aa", 22));
    
    /*第二种:遍历Map集合*/
    //获得map集合中所有的Key
    Set<Student3> set2=tmap1.keySet();
    //获得集合的跌代器对象
    Iterator<Student3> it2=set2.iterator();
    //判断跌代器对象后面是否有元素可跌代
    while (it2.hasNext()) {
        //获得跌代器对象
        Student3 k=it2.next();
        System.out.println("Key的姓名属性为:"+k.sanme+",Key的年龄属性为:"+k.sage+",值为:"+tmap1.get(k));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值