zoukankan      html  css  js  c++  java
  • 疯狂java笔记(七)

    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()返回值相等。

     1 import java.util.*;
     2 
     3 public class HashMapTest{
     4     public static void main(String[] args){
     5         //HashMap只考虑key的存储,它对key的存储机制,几乎与HashSet的机制相同,add每放一次都仅一个值,put可放key-value对
     6         //如果希望HashMap记住我们添加元素的顺序,应该考虑使用LinkedHashMap
     7         HashMap<String,double> test = new HashMap<>();
     8 
     9         //对于Map而言,每次添加都要key-value对
    10         test.put("语文",88.0);
    11         test.put("数学",99.0);
    12         test.put("英语",78.0);
    13         
    14         System.out.println(test.size());
    15         System.out.println(test);
    16     }
    17 }
     1 import java.util.*;
     2 
     3 class Person{
     4     private String name;
     5     private double height;
     6     public Person(String name, double height){
     7         this.name = name;
     8         this.height = height;
     9     }
    10 
    11     @Override
    12     public String toString(){
    13         return "他/她是:" + name + "身高是:" + height;
    14     }
    15 
    16     @Override
    17     public boolean equals(Object obj){
    18         if(this == obj){
    19             return true;
    20         }
    21         //判断关键属性是否相等
    22         if(obj != null && obj.getClass() == Person.class){
    23             Person p = (Person)obj;
    24             return this.height = p.height && this.name.equals(p.name);
    25         }
    26         return false;
    27     }
    28 
    29     @Override
    30     public int hashCode(){
    31         return name.hashCode() + 10*(int)height;
    32     }
    33 }
    34 
    35 public class TestHashMap{
    36     public static void main(String[] args){
    37         HashMap<Person,double> hs = new HashMap<>();
    38 
    39         hs.put(new Person("James",180),77);
    40         hs.put(new Person("Polo",171),76);
    41         hs.put(new Person("James",180),77);
    42 
    43         System.out.println(hs);
    44     }
    45 }

     2、TreeMap对key的要求:

      TreeMap底层的红黑树只对key进行排序,并且要求key必须是可比较大小的。TreeMap和TreeSet一样同样有两 种排序方法:

       ①、自然排序:要求所有key实现Comparable接口/(自定义的必须手动实现、默认已实现(API)的直接调用即可);

       ②、定制排序:要求创建TreeMap时提供一个Comparator对象

       那TreeMap怎样才算两个key重复呢?

        通过Compare()方法比较大小返回0时,则表明两个元素是相等的。

     1 public class TreeMapTest{
     2     public static void main(String[] args){
     3         //如果创建TreeMap时没有传入Comparator对象,说明用的是自然排序
     4         //因为String已经实现了Comparable接口
     5         TreeMap<String , Double> test = new TreeMap<>();
     6 
     7         //对于Map而言,每次添加都要key-value对
     8         test.put("aaa",88.0);
     9         test.put("abc",99.0);
    10         test.put("xyz",78.0);
    11         
    12         System.out.println(test);
    13     }
    14 }

    查看/遍历Map方法:

     遍历Map有以下三种方法:

      遍历所有键值对: entrySet()

      遍历所有key: keySet()

      遍历所有value: values()

    JDK1.7后基本都是用第二种方法进行遍历,因为第二种方法性能是最好的,下面链接文章进行了详细比较:

    http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html

     set和Map遍历的情况是一样的:都可以用for循环和迭代器进行遍历。

     1 import java.util.*;
     2 
     3 class TestForMap {
     4     public static void main(String[] args){
     5         HashMap<String, String> hp = new HashMap<String, String>();
     6         hp.put("username","hp");
     7         hp.put("password","12345");
     8         hp.put("email","hp@hp.com");
     9         hp.put("UserID","358");
    10 
    11         //keySet()方式使用for循环遍历Map
    12         for(String key : hp.keySet()){
    13             //循环遍历Map的key值
    14             System.out.println(key);
    15             //循环遍历Map中key对应的value值
    16             //System.out.println(hp.get(key));
    17         }
    18     
    19         Iterator<String> it = hp.keySet().iterator();
    20         while(it.hasNext()){
    21             //循环遍历Map的key值
    22             //System.out.println(it.next());
    23             //循环遍历Map中key对应的value值
    24             System.out.println(hp.get(it.next()));
    25         }
    26     }
    27 }
  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/dtest/p/4191676.html
Copyright © 2011-2022 走看看