Java 集合类学习之HashMap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 集合类学习之HashMap相关的知识,希望对你有一定的参考价值。

package com.fish.map;
import java.util.HashMap;
/*
双列集合:
-------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。
----------------| HashMap  底层也是基于哈希表实现 的。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
元素在哈希表中的存储位置。 
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
重复元素,不允存储。
----------------| TreeMap
----------------| Hashtable 

*/
class Person{
    int id;
    String name;
    
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return  "[编号:"+this.id+" 姓名:"+ this.name+"]";
    }
    @Override
    public int hashCode() {
        return this.id;
    }
    
    @Override
    public boolean equals(Object obj) {
        Person p = (Person) obj;
        return this.id== p.id;
        }
}
public class Demo5 {
    public static void main(String[] args) {
        HashMap<Person, String> map = new HashMap<Person, String>();
        map.put(new Person(110,"张无忌"), "001");
        map.put(new Person(220,"张三丰"), "002");
        map.put(new Person(330,"谢逊"), "003");
        map.put(new Person(110,"张翠山"), "007");  //如果出现了相同键,那么后添加的数据的值会取代之前 的值。
        System.out.println("集合的元素:"+ map);
    }
}


package com.fish.map;
import java.util.Comparator;
import java.util.TreeMap;
/*
双列集合:
-------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。
----------------| HashMap  底层也是基于哈希表实现 的。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
元素在哈希表中的存储位置。 
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
重复元素,不允存储。
----------------| TreeMap   TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1.  往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2.  往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
在创建TreeMap对象的时候传入比较器。
----------------| Hashtable(了解) 底层也是依赖了哈希表实现的,也就是实现方式和HashMap是一致的,但是HashTable是线程安全的,操作效率低
*/
class Emp {//implements Comparable<Emp>{
    String name;
    int salary;
    
    public Emp(String name, int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    
    @Override
        public String toString() {
        return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
    }
    
    /*
    @Override
    public int compareTo(Emp o) {
        return this.salary - o.salary;
    }*/
}

//自定义一个比较器
class MyComparator implements Comparator<Emp>{
    @Override
    public int compare(Emp o1, Emp o2) {
    return o1.salary - o2.salary;
    }
}

public class Demo6 {
    public static void main(String[] args) {
        /*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
        tree.put(‘c‘,10);
        tree.put(‘b‘,2);
        tree.put(‘a‘,5);
        tree.put(‘h‘,12);
        System.out.println(tree);*/
        
        //创建一个自定义比较器
        MyComparator comparator = new MyComparator();
        
        TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);
        tree.put(new Emp("张三丰", 2000),"001");
        tree.put(new Emp("张无忌", 1000),"002");
        tree.put(new Emp("谢逊", 3000),"003");
        tree.put(new Emp("宋青书", 5000),"005");
        tree.put(new Emp("玄冥二老", 5000),"008");//因为compare返回的是0,认为key是相同的,所以new Emp("宋青书", 5000)这个key对应的value会被更新为008
        
        System.out.println(tree);
    }
}
package com.fish.map;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;
/*
 需求: 定义一个TreeMap,键存储的是书对象,值存储的是字符串。 根据书的出版出版日期排序。
 */
class Book implements Comparable<Book> {

String name;
String date; // 出版日期


public Book(String name, String date) {
    super();
    this.name = name;
    this.date = date;
}

/*
//利用字符串的CompareTo方法进行排序
@Override
public int compareTo(Book o) {
    return this.date.compareTo(o.date);
}
*/

@Override
public String toString() {
    return "[书名:" + this.name + "  出版日期:" + this.date + "]";
}
    
//先把字符串的日期转换Date对象,然后在使用Date对象进行比较
@Override
public int compareTo(Book o) {
    //日期格式化类
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date1  = null;
    Date date2  = null;
    try {
         date1 = dateFormat.parse(this.date);
         date2 = dateFormat.parse(o.date);
        } catch (ParseException e) {
        e.printStackTrace();
    }
    return date1.compareTo(date2);
}

}
public class Demo7 {
    public static void main(String[] args) {
        TreeMap<Book, String> map = new TreeMap<Book, String>(); // 值存储书名
        map.put(new Book("红楼梦", "1990-12-03"), "001");
        map.put(new Book("西游记", "1993-08-13"), "002");
        map.put(new Book("水浒传", "1989-04-03"), "003");
        map.put(new Book("三国演义", "1997-10-04"), "004");
        System.out.println(map);
    }
}


本文出自 “小鱼的博客” 博客,谢绝转载!

以上是关于Java 集合类学习之HashMap的主要内容,如果未能解决你的问题,请参考以下文章

Java 集合类学习之Vector

Java 集合类学习之ArrayList

Java 集合类学习之HashSet

Java 集合类学习之LinkedList

JUC学习之线程安全集合类

Java集合类之HashMap