HashMap、TreeMap、Hashtable
来源:互联网 发布:php教材推荐 编辑:程序博客网 时间:2024/06/11 06:05
双列集合:
-------------| Map 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。
----------------| HashMap 底层也是基于哈希表实现 的。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
元素在哈希表中的存储位置。
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
----------------| TreeMap
----------------| TreeMap TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
在创建TreeMap对象的时候传入比较器。
需求: 定义一个TreeMap,键存储的是书对象,值存储的是字符串。 根据书的出版日期排序。
Hashtable(了解 jdk1.0) 底层也是依赖了哈希表来实现的,也就是实现方式与hashmap一致,但是hashTable是线程安全的,操作效率低,已经被hashmap(jdk1.2)取代了
-------------| 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
- HashTable,HashMap和TreeMap
- HashTable HashMap TreeMap 区别
- HashMap,HashTable,LinkedMap,TreeMap
- HashMap,HashTable,LinkedMap,TreeMap
- HASHTABLE, HashMap,TreeMap区别
- hashmap,treemap,hashtable
- HashMap Hashtable LinkedHashMap TreeMap
- HASHTABLE, HashMap,TreeMap区别
- Hashtable、HashMap、TreeMap
- HashMap 、TreeMap、Hashtable、LinkedHashMap
- HashMap TreeMap LinkedMap HashTable
- HashTable、HashMap、TreeMap梳理
- HashMap、TreeMap、Hashtable
- HashMap HashTable LinkedHashMap TreeMap
- HashMap,HashTable,LinkedHashMap,TreeMap
- HashMap HashTable TreeMap区别
- hashMap,hashTable,linkedHashMap,TreeMap
- HashMap、TreeMap、HashTable区别
- 三岁小孩最爱用的操作系统--汉澳sinox2016安装图解教程
- javascript 树形数据转化维数组
- [未解决]The connection pool for database has been unable to grant a connection to thread 1304
- 浅析B-树
- [linux] signal 0 for running process test
- HashMap、TreeMap、Hashtable
- 计算机视觉
- Dijkstra 算法 -单源最短路
- 并查集(Union-Find) 应用举例 --- 基础篇
- Android自定义View的三种实现方式
- 约瑟夫环报数问题
- 关于a标签默认颜色的改变(锋利的jQuery)
- json格式转数据换为.xls .mdb.csv格式文件
- DOM Events 模型