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 }
  • 相关阅读:
    阅读提问
    阅读笔记
    结对需求分析
    分工
    对软件工程课程的期望
    JAVAWEB-Spring Boot学习
    团队编程-项目作业6-程序维护
    团队-吃货之家-项目总结
    团队编程项目作业5-小组评分
    安装Vue.js之Node.js,NMP环境搭建
  • 原文地址:https://www.cnblogs.com/dtest/p/4191676.html
Copyright © 2011-2022 走看看