Java Map集合

1.HashMap与HashSet联系
1)底层都是利用Hash算法
2)HashSet底层依赖HashMap实现的
3)都有去重功能,无序的
TreeMap :有排序的功能,根据键
一、HashMap例题
1.Map集合中添加了两个相同的元素(键一样,值不一样)的时候,后加入的会覆盖掉前面的值(put的添加方法返回的是你覆盖了集合里面的元素)

HashMap<String,Integer>map = new HashMap<>();
Integer i1 = map.put("a",12);
Integer i2 = map.put("b",13);
Integer i3 = map.put("c",14);
Integer i4 = map.put("d",15);
Integer i5 = map.put("a",16);
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
System.out.println(i5);
system.out.println(map);
null
null
null
null
12
{a=16,b=13,c=14,d=15}
2.
1)使用map中的containsKey方法输入键,查看里面是否存在这个键
2)使用map中的containsValue方法输入值,查看值里面是否存在这个值
HashMap<String,Integer> map = new HashMap<>();
     Integer i1 = map.put("振北", 19);
     Integer i2 = map.put("振西", 20);
     Integer i3 = map.put("振南", 32);
     Integer i4 = map.put("振东", 13);
     boolean containsKey = map.containsKey("振南");
        boolean containsValue = map.containsValue(19);
        System.out.println(containsKey);
        System.out.println(containsValue);
true
false
3.HashMap<String,Integer> map = new HashMap<>();
     Integer i1 = map.put("振北", 19);
     Integer i2 = map.put("振西", 20);
     Integer i3 = map.put("振南", 32);
     Integer i4 = map.put("振东", 13);
1)使用get方法,输入键获取对应的value值,没有,则输出null
         Integer integer = map.get("振北");
         Integer integer2 = map.get("振中");
        System.out.println(integer);
        System.out.println(integer2);
       19
       null
2)使用Map中的keySet方法,获取所有key对应的集合
 Set<String>keySet = map.keySet();
 System.out.println(keySet);

   [振东, 振北, 振南, 振西]

3)使用values方法,获取所有value对应的集合
   Collection<Integer>values = map.values();
   System.out.println(values);

   [13, 19, 32, 20]

4)使用remove方法,输入键值,删除整个键值对,不存在,打印null,存在删除,对应的键值对
    Integer remove = map.remove("振东");
    System.out.println(remove);
    Integer remove1 = map.remove("振中");
    System.out.println(remove1);
    {振北=19, 振南=32, 振西=20}
    null
5)使用clear方法,清除整个集合
   map.clear();
   System.out.println(map);
   {}
4.键是引用数据类型的题
在我们创建以引用数据类型为键值类型的时候,我们需要,去自定义对象的类中去重写hashCode和equals方法,这样我们才能保持键的唯一性
 创建一个map,key保存学生,value是户籍
    HashMap<Student, String> map = new HashMap<>();
        map.put(new Student("鹏鹏", 21), "安徽");
        map.put(new Student("振北", 23), "河南");
        map.put(new Student("振北", 23), "河西");
        map.put(new Student("轩轩", 23), "江苏");
        System.out.println(map);

  {[name=轩轩, age=23]=江苏, [name=振北, age=23]=河西, [name=鹏鹏, age=21]=安徽}

 Student类
 package com.lanou3g.map;

public class Student  {
  private String name;
  private int age ;
public Student(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
public Student() {
    super();
    // TODO Auto-generated constructor stub
}

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 "[name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + age;
    result = prime * result + ((name == null) ? 0 : name.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 (age != other.age)
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}

}

5.遍历
HashMap<String, Integer> map = new HashMap<>();
         map.put("振北", 20);
         map.put("振西", 20);
         map.put("振南", 21);
         map.put("振东", 22);
1)通过keySet遍历
   Set<String> keySet = map.keySet();
   System.out.println(keySet);
    [振东, 振北, 振南, 振西]
  Iterator<String>iterator = keySet.iterator;
  while(iterator.hasNext()){
      String key = iterator.next();
      Integer integer = map.get(key);
      System.out.println(integer);
22
20
21
20

2)使用增强for循环遍历Map集合
HashMap<String, Integer> map = new HashMap<>();
             map.put("振北", 20);
             map.put("振西", 20);
             map.put("振南", 21);
             map.put("振东", 22);
    Set<String>keySet = map.keySet();
    for(String key : keySet){
        Integer value = map.get(key);
        System.out.print(value);
    }
            }
    }

22
20
21
20

3)获取键值对的对象的set集合,进行遍历
HashMap<String, Integer> map = new HashMap<>();
         map.put("振北", 20);
         map.put("振西", 20);
         map.put("振南", 21);
         map.put("振东", 22);
 Set<Entry<String,Integer>> entrySet = map.entrySet();
 Iterator<Map.Entry<String,integer>>iterator = entrySet.iterator();
 while(iterator.hasNext()){
    Entry<String,Integer> entry = iteator.next();
    Integer value  = entry.getValue();
    System.out.println(value);
 }
22
20
21
20

4)增强for循环遍历
HashMap<String, Integer> map = new HashMap<>();
         map.put("振北", 20);
         map.put("振西", 20);
         map.put("振南", 21);
         map.put("振东", 22);
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> entry :entrySet){
    Integer value =  entry.getValue();
    System.out.println(value);
}
22
20
21
20
6.例题
从键盘输入字符串并统计字符串中每个字符出现的次数 比如:asdadadsasdasdasdasd  使用map完成

System.out.println("输入字符串");
    Scanner scanner = new Scanner(System.in);
    String string = scanner.nextLine();
    HashMap<Character,Integer>map = new HashMap<>();
    char[] charArray = string.toCharArray();
    int num = 1;
    for(int i= 0;i< charArray.length;i++){
        char key = charArray[i];
        if(!map.containsKey(key)){
            map.put(key,1);
        }else{
          Integer value =  map.get(key);
          value = value +1;
         map.put(key,value);
        }
    }
    System.out.println(map);

输入字符串
asdadadsasdasdasdasd
{a=7, s=6, d=7}

二、LinkedHashMap和TreeMap

1.使用LinkedHashMap创建集合
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
          map.put("丁鹏", 11);
          map.put("水水", 11);
          map.put("茜茜", 11);
          map.put("忠忠", 11);

     System.out.println(map);
}
{丁鹏=11, 水水=11, 茜茜=11, 忠忠=11}

2.使用TreeMap创建集合
创建一个TreeMap,key保存学生value保护户籍,按年龄排序
我们这里如果想要排序,就需要去键值类中去实现Comparable接口中的,comparTo方法,去重新编写比较规则,而传入键值如果是系统类类型,就不需要了,因为该系统类中已经实现过了这个接口,而我们自己所定义的类,就要去实现。
TreeMap<Student,String> map = new TreeMap<>();
        map.put(new Student("丁鹏", 11), "安徽");
        map.put(new Student("水水", 11), "浙江");
        map.put(new Student("振北", 11), "河南");
        map.put(new Student("轩轩", 11), "江苏");
        System.out.println(map);

{[name=丁鹏, age=11]=安徽, [name=水水, age=11]=浙江, [name=振北, age=11]=河南, [name=轩轩, age=11]=江苏}

Student类
     package com.lanou3g.map;

public class Student implements Comparable<Student> {
  private String name;
  private int age ;
public Student(String name, int age) {
    super();
    this.name = name;
    this.age = age;
}
public Student() {
    super();
    // TODO Auto-generated constructor stub
}

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 "[name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + age;
    result = prime * result + ((name == null) ? 0 : name.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 (age != other.age)
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    return true;
}
//排序,这里编写根据年龄比较排序的规则

@Override
public int compareTo(Student o) {
    int num = this.age - o.getAge();
    return num ==0 ? 1:num ;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值