JavaSE进阶八 集合二 Map接口

2021-06-15  本文已影响0人  SimonLike

1,Map接口

1.1 java.util.Map接口中常用的方法:

    V put(K key, V value); // 向map集合中添加键值对
    V get(Object key); // 通过key获取value
    int size(); // 获取map集合中键值对的个数
    V remove(Object key); // 通过key删除键值对
    boolean containsKey(Object key); // 判断map中是否包含某个key
    boolean containsValue(Object value);// 判断map中是否包含某个value
    void clear(); // 清空map集合
    boolean isEmpty(); // 判断map集合中的元素个数是否为0
    Collection<V> values(); // 获取集合中所有的value
代码示例
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class MapTest01 {
    public static void main(String[] args) {
        // 创建map集合对象
        Map<Integer,String> map = new HashMap<>();
        // 向map集合中添加键值对
        map.put(1,"zhangshan");
        map.put(2,"lisi");
        map.put(3,"wangwu");

        // 通过key获取value
        String s = map.get(2);
        System.out.println(s);

        // 获取键值对的数量
        System.out.println("键值对的数量:" + map.size());

        // 通过key删除key-value
        map.remove(2);

        // 获取键值对的数量
        System.out.println("键值对的数量:" + map.size());

        // 判断是否包含某个key
        // contains方法底层调用的都是equals进行比对的,所以自定义的类型需要重新equals方法。
        System.out.println(map.containsKey(1)); // true

        // 判断是否包含某个value
        System.out.println(map.containsValue("wangwu")); // true

        // 获取集合中所有的value
        Collection<String> values = map.values();
        for (String ss : values){
            System.out.println(ss);
        }

        // 清空集合
        map.clear();
        System.out.println("键值对的数量:" + map.size());

        // 判断是否为空
        System.out.println(map.isEmpty());// true

    }
}

1.2 Map集合的遍历

  java.util.Map接口中常用的方法:
  Set<Map.Entry<K, V>> entrySet(); // 把Map集合直接全部转换成Set集合,Set集合中元素的类型是:Map,Entry。
  Set<K> keySet(); // 获取集合所有的key
代码示例
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest02 {
    public static void main(String[] args) {
        // 创建Map集合对象
        Map<Integer,String> map = new HashMap<>();

        // 添加元素
        map.put(1,"zhangsan");
        map.put(2,"lisi");
        map.put(3,"wangwu");
        map.put(4,"zhaosi");
        // 遍历Map集合
        System.out.println("=================================================");

        // 方式一:先获取所有的key,通过遍历所有的key,来遍历value
        Set<Integer> set = map.keySet();

        // 使用迭代器遍历
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            Integer key = it.next();
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }
        // 使用增强for循环遍历
        for (Integer key : set){
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }

        System.out.println("=================================================");

        // 方式一:使用 Set<Map.Entry<K, V>> entrySet();
        // 把集合直接全部转换成Set集合
        // Set集合中元素的类型是:Map.Entry
        Set<Map.Entry<Integer,String>> set1 =  map.entrySet();

        Iterator<Map.Entry<Integer,String>> it1 = set1.iterator();
        // 使用迭代器遍历
        while (it1.hasNext()){
            Map.Entry<Integer,String> entry = it1.next();
            System.out.println(entry);
            System.out.println("key:" + entry.getKey());
            System.out.println("value:" + entry.getValue());
        }

        // 使用增强for循环遍历
        for (Map.Entry<Integer,String> node : set1){
            System.out.println(node);
            System.out.println("key:" + node.getKey());
            System.out.println("value:" + node.getValue());
        }
    }
}

2,HashMap集合

代码示例
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapTest01 {
    public static void main(String[] args) {
        // 测试HashMap集合key部分元素的特点
        // Integer是key,hashCode()和equals()都重写了
        Map<Integer,String> map = new HashMap<>();
        map.put(11,"张三");
        map.put(12,"李四");
        map.put(13,"王二");
        map.put(14,"麻子");
        map.put(14,"小红"); // key值重复,value会自动覆盖

        System.out.println(map.size());

        // 遍历集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();

        for (Map.Entry<Integer,String> entry : set){
            System.out.println(entry);
            System.out.println("key:" + entry.getKey());
            System.out.println("value:" + entry.getValue());
        }

    }
}

3,HashSet集合

代码示例
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class HashMapTest02 {
    public static void main(String[] args) {
        Student s1 = new Student("zhangsan");
        Student s2 = new Student("zhangsan");

        System.out.println(s1.equals(s2));// 重写equals方法之前:false  之后:true

        System.out.println("s1的hashCode: " + s1.hashCode()); // 重写hashCode方法之前:2129789493  之后:-1432604525
        System.out.println("s2的hashCode: " + s2.hashCode()); // 重写hashCode方法之前:1313922862  之后:-1432604525

        //
        Set<Student> students = new HashSet<>();
        students.add(s1);
        students.add(s2);

        System.out.println(students.size()); // 重写hashCode方法之前:2  之后:1
    }
}

class Student{
    private String name;

    public Student() {
    }

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }
    // 重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

4,Hashtable集合

代码示例
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class HashMapTest03 {
    public static void main(String[] args) {
        Map map = new HashMap();
        // HashMap集合允许key为null
        map.put(null,null);
        System.out.println(map.size());// 1

        // key重复value被覆盖
        map.put(null,"abc");
        System.out.println(map.size());// 1

        // 通过key获取value
        System.out.println(map.get(null));// abc

        // ==========================================================
        Map map1 = new Hashtable();
        map1.put(null,null); // 运行时会报空指针异常

    }
}

5,了解Propertie属性对象

代码示例
import java.util.Properties;

public class PropertiesTest01 {
    public static void main(String[] args) {
        // 创建一个Properties对象
        Properties properties = new Properties();
        // 添加存储元素
        properties.setProperty("name","zhangsan");
        properties.setProperty("password","123");

        System.out.println(properties.size());

        // 通过key获取value
        System.out.println(properties.getProperty("name"));
        System.out.println(properties.getProperty("password"));

    }
}

6,TreeSet集合

代码示例
import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest01 {
    public static void main(String[] args) {
        // 创建一个TreeSet集合
        TreeSet<String> set = new TreeSet<>();
        set.add("a");
        set.add("d");
        set.add("c");
        set.add("e");
        set.add("c");
        set.add("b");

        System.out.println(set.size()); // 5  不可重复
        for (String s : set){
            System.out.println(s); // 输出会从小到大自动排序(升序)
        }
    }
}

6.1, 自平衡二叉树

7, TreeSet集合元素的排序

7.1,第一种排序方式(Comparable接口)

自定义类型使用TreeSet集合进行排序,需要实现java.lang.Comparable接口;以及重写compareTo方法,进行规则比较。

import java.util.TreeSet;

public class TreeSetTest02 {
    public static void main(String[] args) {
        // 自定义类型使用TreeSet集合进行排序,需要重写compareTo方法,进行规则比较。
        //
        Customer c1 = new Customer(23);
        Customer c2 = new Customer(20);
        Customer c3 = new Customer(28);
        Customer c4 = new Customer(25);

        // 创建TreeSet集合
        TreeSet<Customer> customers = new TreeSet<>();
        //添加元素
        customers.add(c1);
        customers.add(c2);
        customers.add(c3);
        customers.add(c4);

        // 遍历
        for (Customer c : customers){
            System.out.println(c);
        }
    }
}

// 放在TreeSet集合中的元素需要实现java.lang.Comparable接口
// 并且实现compareTo方法,equals可以不写。
class Customer implements Comparable<Customer> {
    int age;

    public Customer() {
    }

    public Customer(int age) {
        this.age = age;
    }

    /*
        重写compareTo方法
        需要在这个方法中编写比较逻辑,或者说比较规则,按照什么进行比较!
        k.compareTo(t.key)
        拿参数k和集合中的每一个k进行比较,返回值:>0 =0 <0
        比较规则由程序员指定:按年龄升序、降序等...
     */
    @Override
    public int compareTo(Customer o) {
        return this.age - o.age;
    }

    // 重写toString方法
    @Override
    public String toString() {
        return "Customer{" +
                "age=" + age +
                '}';
    }
}

7.2,第二种排序方式(Comparator接口)

自定义类型使用TreeSet集合进行排序,需要实现java.util.Comparator接口;在构造TreeSet或TreeMap集合的时候给它传一个比较器对象。
import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetTest03 {
    public static void main(String[] args) {
        // 创建TreeSet集合的时候,需要使用比较器
        // TreeSet<WuGui> treeSet = new TreeSet<>(); //这样创建没有通过构造方法传递一个比较器进去是不行的。

        // 使用匿名内部类实现比较器(类没有名字,直接new接口)
        // TreeSet<WuGui> treeSet = new TreeSet<>(new Comparator<WuGui>() {
        //     @Override
        //     public int compare(WuGui o1, WuGui o2) {
        //         return o1.age - o2.age;
        //     }
        // });

        TreeSet<WuGui> treeSet = new TreeSet<>(new WuGuiComparator());
        treeSet.add(new WuGui(1000));
        treeSet.add(new WuGui(600));
        treeSet.add(new WuGui(900));
        treeSet.add(new WuGui(2000));

        for (WuGui wg : treeSet){
            System.out.println(wg);
        }
    }
}

class WuGui{
    int age;

    public WuGui(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "WuGui{" +
                "age=" + age +
                '}';
    }
}
// 单独定义一个比较器
// 实现java.util.Comparator接口。

class WuGuiComparator implements Comparator<WuGui>{
    @Override
    public int compare(WuGui o1, WuGui o2) {
        // 比较规则:按年龄排序
        return o1.age - o2.age;
    }
}

上篇:JavaSE进阶八 集合一 Collection接口
下篇:JavaSE进阶九 IO流一

上一篇下一篇

猜你喜欢

热点阅读