HashMap、TreeMap、Hashtable

来源:互联网 发布:php教材推荐 编辑:程序博客网 时间:2024/06/11 06:05
双列集合:
-------------| 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;}@Overridepublic String toString() {return  "[编号:"+this.id+" 姓名:"+ this.name+"]";}@Overridepublic int hashCode() {return this.id;}@Overridepublic 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);}}

----------------| TreeMap   TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1.  往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2.  往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
在创建TreeMap对象的时候传入比较器。

class Emp {//implements Comparable<Emp>{String name;int salary;public Emp(String name, int salary) {super();this.name = name;this.salary = salary;}@Overridepublic String toString() {return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";}/*@Overridepublic int compareTo(Emp o) {return this.salary - o.salary;}*/}//自定义一个比较器class MyComparator implements Comparator<Emp>{@Overridepublic 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");  //留下的是克强 但值变成了008  如果出现了相同键,那么后添加的数据的值会取代之前 的值。System.out.println(tree);}}

需求: 定义一个TreeMap,键存储的是书对象,值存储的是字符串。 根据书的出版日期排序。

package 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;}@Overridepublic String toString() {return "Book [name=" + name + ", date=" + date + "]";}//先把字符串的日期转换成Date对象,然后再使用Date对象进行比较@Overridepublic int compareTo(Book o) {//使用日期格式化类 把字符串的类型日期转换成Date对象//1.创建日期格式化类SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd");//2.使用日期格式化类把字符串转换成date对象Date date1 = null;Date date2 = null;try {date1 = dataFormat.parse(this.date);  //date2 = dataFormat.parse(o.date);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}//date类也实现了compareTo方法:return date1.compareTo(date2);/*//获取两个日期的毫秒值相减return (int) (date1.getTime() - date2.getTime());  //会导致精度丢失*/}/*//利用字符串的compareTo方法进行排序@Overridepublic int compareTo(Book o) {  //String类已经实现了Comparable接口了,所以String类有一个compareTo方法 返回一个int类型数据//所以可以用字符串的比较规则来比较日期return this.date.compareTo(o.date);}*/}public class Demo3 {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-12-03"), "003");map.put(new Book("三国演义","1997-12-03"), "004");//map.put(new Book("水浒传","1990-12-03"), "001");System.out.println(map);}}
从键盘输入一个字母组成字符串,分别统计每个字母出现的次数(10分)

要求输出的效果按照字母的顺序输出  a(7)b(5)...

public class Demo16 {public static void main(String[] args) {System.out.println("请输入一段字符串:");Scanner  scanner = new Scanner(System.in);String line = scanner.next();char[] arr = line.toCharArray();//先把字符串转换成字符数组。TreeMap<Character, Integer> map = new TreeMap<Character, Integer>(); for(char c : arr){if(map.containsKey(c)){ //map集合已经包含了该字符int count = map.get(c);map.put(c, count+1);}else{  //没有包含map.put(c, 1);}}System.out.println(map);}}

Hashtable(了解 jdk1.0) 底层也是依赖了哈希表来实现的,也就是实现方式与hashmap一致,但是hashTable是线程安全的,操作效率低,已经被hashmap(jdk1.2)取代了


0 0
原创粉丝点击