疯狂java笔记(七) - Java集合之Map
2014-12-29 14:56
260 查看
Map是以键值对(key-value)的形式来存储数据的。而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可以把value当前key的"附庸舞")。
注意:如果只管Map里边的key,并把所有的key都手机起来那就变成set了。Map与set是一一对应的。
1、Hashset底层是靠HashMap来实现的,HashMap用"hash"算法控制"一个萝卜一个坑"来进行快速存储;
2、TreeSet底层是靠TreeMap来实现的,TreeMap就是真正的"红黑树";
3、Hashtable线程是安全的(实现不好,性能低),HashMap是线程不安全的(但可以通过collections工具类来提升安全),HashMap性能要好些,除此之外Hashtable与HashMap几乎一样。
Map对key是有要求的:
1、HashMap对key的要求:
HashMap是根据key的hashCode()方法的返回值来计算key的存、取位置。
那HashMap怎样才算两个key重复呢?
①、通过eqauls()方法比较返回true;
②、两个key的hashCode()返回值相等。
2、TreeMap对key的要求:
TreeMap底层的红黑树只对key进行排序,并且要求key必须是可比较大小的。TreeMap和TreeSet一样同样有两 种排序方法:
①、自然排序:要求所有key实现Comparable接口/(自定义的必须手动实现、默认已实现(API)的直接调用即可);
②、定制排序:要求创建TreeMap时提供一个Comparator对象
那TreeMap怎样才算两个key重复呢?
通过Compare()方法比较大小返回0时,则表明两个元素是相等的。
查看/遍历Map方法:
遍历Map有以下三种方法:
遍历所有键值对: entrySet()
遍历所有key: keySet()
遍历所有value: values()
JDK1.7后基本都是用第二种方法进行遍历,因为第二种方法性能是最好的,下面链接文章进行了详细比较:
http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html
set和Map遍历的情况是一样的:都可以用for循环和迭代器进行遍历。
注意:如果只管Map里边的key,并把所有的key都手机起来那就变成set了。Map与set是一一对应的。
1、Hashset底层是靠HashMap来实现的,HashMap用"hash"算法控制"一个萝卜一个坑"来进行快速存储;
2、TreeSet底层是靠TreeMap来实现的,TreeMap就是真正的"红黑树";
3、Hashtable线程是安全的(实现不好,性能低),HashMap是线程不安全的(但可以通过collections工具类来提升安全),HashMap性能要好些,除此之外Hashtable与HashMap几乎一样。
Map对key是有要求的:
1、HashMap对key的要求:
HashMap是根据key的hashCode()方法的返回值来计算key的存、取位置。
那HashMap怎样才算两个key重复呢?
①、通过eqauls()方法比较返回true;
②、两个key的hashCode()返回值相等。
import java.util.*; public class HashMapTest{ public static void main(String[] args){ //HashMap只考虑key的存储,它对key的存储机制,几乎与HashSet的机制相同,add每放一次都仅一个值,put可放key-value对 //如果希望HashMap记住我们添加元素的顺序,应该考虑使用LinkedHashMap HashMap<String,double> test = new HashMap<>(); //对于Map而言,每次添加都要key-value对 test.put("语文",88.0); test.put("数学",99.0); test.put("英语",78.0); System.out.println(test.size()); System.out.println(test); } }
import java.util.*; class Person{ private String name; private double height; public Person(String name, double height){ this.name = name; this.height = height; } @Override public String toString(){ return "他/她是:" + name + "身高是:" + height; } @Override public boolean equals(Object obj){ if(this == obj){ return true; } //判断关键属性是否相等 if(obj != null && obj.getClass() == Person.class){ Person p = (Person)obj; return this.height = p.height && this.name.equals(p.name); } return false; } @Override public int hashCode(){ return name.hashCode() + 10*(int)height; } } public class TestHashMap{ public static void main(String[] args){ HashMap<Person,double> hs = new HashMap<>(); hs.put(new Person("James",180),77); hs.put(new Person("Polo",171),76); hs.put(new Person("James",180),77); System.out.println(hs); } }
2、TreeMap对key的要求:
TreeMap底层的红黑树只对key进行排序,并且要求key必须是可比较大小的。TreeMap和TreeSet一样同样有两 种排序方法:
①、自然排序:要求所有key实现Comparable接口/(自定义的必须手动实现、默认已实现(API)的直接调用即可);
②、定制排序:要求创建TreeMap时提供一个Comparator对象
那TreeMap怎样才算两个key重复呢?
通过Compare()方法比较大小返回0时,则表明两个元素是相等的。
public class TreeMapTest{ public static void main(String[] args){ //如果创建TreeMap时没有传入Comparator对象,说明用的是自然排序 //因为String已经实现了Comparable接口 TreeMap<String , Double> test = new TreeMap<>(); //对于Map而言,每次添加都要key-value对 test.put("aaa",88.0); test.put("abc",99.0); test.put("xyz",78.0); System.out.println(test); } }
查看/遍历Map方法:
遍历Map有以下三种方法:
遍历所有键值对: entrySet()
遍历所有key: keySet()
遍历所有value: values()
JDK1.7后基本都是用第二种方法进行遍历,因为第二种方法性能是最好的,下面链接文章进行了详细比较:
http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html
set和Map遍历的情况是一样的:都可以用for循环和迭代器进行遍历。
import java.util.*; class TestForMap { public static void main(String[] args){ HashMap<String, String> hp = new HashMap<String, String>(); hp.put("username","hp"); hp.put("password","12345"); hp.put("email","hp@hp.com"); hp.put("UserID","358"); //keySet()方式使用for循环遍历Map for(String key : hp.keySet()){ //循环遍历Map的key值 System.out.println(key); //循环遍历Map中key对应的value值 //System.out.println(hp.get(key)); } Iterator<String> it = hp.keySet().iterator(); while(it.hasNext()){ //循环遍历Map的key值 //System.out.println(it.next()); //循环遍历Map中key对应的value值 System.out.println(hp.get(it.next())); } } }
相关文章推荐
- 黑马程序员_JAVA笔记16——集合(Map)
- java笔记-集合框架-泛型、Map集合
- Java基础知识强化之集合框架笔记53:Map集合之Map集合的遍历 键值对对象找键和值
- Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例
- Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap<Student,String>)的案例
- Java学习笔记-----集合Map
- 黑马程序员----Java集合框架学习笔记2 Map-工具类-泛型
- Java基础知识强化之集合框架笔记54:Map集合之HashMap集合(HashMap<String,String>)的案例
- Java基础知识强化之集合框架笔记50:Map集合之Map集合的概述和特点
- Java基础知识强化之集合框架笔记60:Map集合之TreeMap(TreeMap<Student,String>)的案例
- 黑马程序员-java集合笔记之map
- 疯狂JAVA讲义---第七章(下):集合Map
- Android(java)学习笔记103:Map集合的获取功能
- Java基础知识强化之集合框架笔记55:Map集合之HashMap集合(HashMap<Integer,String>)的案例
- 黑马程序员________Java集合Map及其JDK1.5新特性泛型机制的学习笔记
- 疯狂JAVA讲义---第七章(下):集合Map(转)
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
- java笔记18 Map集合
- Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述
- Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap<String,Student>)的案例