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-10-05 05:37:39