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);
    }
}
时间: 2024-08-03 08:09:58

Java 集合类学习之HashMap的相关文章

Java 集合类学习之Map

package com.fish.map; import java.util.HashMap; import java.util.Map; /* 在现实生活中有些数据是以映射关系存在的,也就是成对存在的,比如:  民政局 : 键         值 老公        老婆 ***      人 一把要锁     锁 双列集合: -------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复. ----------

Java集合类学习总结

Java的集合类分为两个类型,Collection和Map,Collection又分为Set和List. 1. 集合类中元素是否相同 HashSet使用equals和HashCode两个函数共同决定 TreeSet使用comparable接口中的compareTo,或者comparator中的compare函数 ArrayList使用equals函数 HashMap中的key和HashSet相同,value使用equals函数 TreeMap中的key和TreeSet相同,value使用equa

Java 集合类学习之Vector

package com.fish.list; import java.util.Enumeration; import java.util.Vector; /* 集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复.  -------------------| ArrayList  ArrayList 底层是维护了一个Object数组实现的. 特点:查询速度快

Java 集合类学习之HashSet

package com.fish.set; import java.util.HashSet; import java.util.Set; /* 集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List  如果是实现了List接口的集合类,具备的特点: 有序,可重复.  -------------------| ArrayList  ArrayList 底层是维护了一个Object数组实现的. 特点: 查询速度快,增删慢.

Java 集合类学习之ArrayList

1.ArrayList的常用方法和原理 package com.fish.list; import java.util.ArrayList; /* 集合的体系: ----------| Collection 单列集合的根接口 ----------------| List 如果实现了List接口的集合类,具备的特点:有序,可重复. --------------------| ArrayList  ArrayList底层是维护了一个Object数组实现的,特点:查询速度快,增删慢. 什么时候使用Ar

Java 集合类学习之LinkedList

1.linkedList的方法和原理 package com.fish.list; import java.util.Iterator; import java.util.LinkedList; /* 集合的体系: ----------| Collection  单列集合的根接口 ----------------| List 如果实现了List接口的集合类,具备的特点: 有序,可重复. --------------------| ArrayList   ArrayList 底层是维护了一个Obj

Java集合类学习记录

被标记为transient的属性在对象被序列化的时候不会被保存int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, new_length);//Arrays是数组的工具类//ArrayList的转化为静态数组的toArray方法就是这个原理//ArrayList的扩容原理也是Arrays.copyOf()方法//新建了一个数组定义一个数组int[] a={3,1,4,2,5}; int[] b=a; 数组b只是对数组a的又一

Java集合类学习(一)

1. List接口的常用方法 List接口继承了Collection接口,因此包含Collection中的所有方法.又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法. 1.1. 示例代码1 import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class CollectionDemo { publi

java集合类学习小记

[List接口]:可变数组,允许保存所有类型元素,包括null,元素可重复,按添加顺序保存[常用实现类]:建议用ArrayListArrayList:索引访问速度快(但插入和删除节点较慢)LinkedList:链表结构,插入删除节点很快(但随机访问节点对象效率低)[常用方法]:boolean add(E e)boolean remove(Object o)int size() E get(int index)E set(int index,E) [Set接口]:不按特定方式排序,元素不能重复[常