• 0014 Java学习笔记-集合-HashMap集合


    主要的方法

    + 构造方法:
    	* HashMap();
    		- 默认大小16,负载因子0.75
    	* HashMap(int initialCapacity);
    	* HashMap(int initialCapacity,float loadFactor);
    	* HashMap(Map<? extends K,? extends V> v);
    + 方法:
    	* void clear();
    		- 清除所有键值对
    	* boolean containsKey(Object key);
    	* boolean containsValue(Object value);
    	* Set<Map.Entry<K,V>> entrySet();
    	* void forEach(BiConsumer<? super K,?super V> action);
    	* V get(Object key);
    		- 根据key获得value,如果该key不存在,则返回null
    	* V getOrDefault(Object key,V defaultValue);
    		- 返回key对应的vlaue,如果不存在这个key,则返回defaultValue
    	* boolean isEmpty();
    	* Set <K> keySet();
    		- 返回所有key的Set集合
    	* V put(K key,V value);
    		- 添加键值对
    	* void putAll(Map<? extends K,? extends V> m);
    	* V remove(Object key);
    		- 如果存在该key,则删除该key的键值对,并返回被删除的value
    	* boolean remove(Object key,Object value);
    	* V replace(K key,V value);
    	* boolean replace(K key,V oldValue,V newValue);
    	* int size();
    	* Collection <V> values();
    

    HashMap的特点

    • HashMap中的元素根据hashCode()值,而存储在特定位置,存储的顺序跟添加的顺序无关
    • 线程不安全,在多线程访问时,得用Collections.synchronizedMap(Map<K,V> map)转为线程安全的
    • HashMap可以用null作为key或者value,但因为key不能重复,因此最多只能有一个key为null,但value可以重复,可以有多个value

    hashCode()、equals()与HashMap

    • hashCode()、equals()、compareTo()三个方法跟集合的关系都很紧密。

    • 比如要存入HashSet()中的对象的类都要重写hashCode()和equals()方法,并且要确保equals()返回true的两个对象的hashCode()值也要相等。

    • HashMap的key相等的判断标准:HashCode()值相等,并且equals()返回true

    • HashMap的value则只需要考虑equals()方法,equals()返回true,则说明两个value相等

    • 以上可见,HashMap的类的equals()、hashCode()的重写的原则,与HashSet一样

    不可修改HashMap中的元素的key

    • 元素被添加进HashMap中后,原则上就不要修改了,至少不能修改影响hashCode()和equals()方法的实例,否则可导致访问到错误的对象、有些对象访问不到等等奇怪的错误

    什么时候使用HashMap

    LinkedHashMap

    • HashSet-->LinkedHashSet
    • HashMap-->LinkedHashMap
    • LinkedHashMap使用双向链表来维护key的添加次序,迭代的输出与添加顺序一致
    • 性能略低于HashMap

    Properties

    • Java还有个古老的类:Hashtable,现在基本上被HashMap替代了,就不写了
    • 但它有个子类Properties却还得写
    • System类有个静态方法getProperties(),用来获取当前的系统属性,类型就是Properties
    • Properties的key和value都是String
    • 常见方法:
      • 构造方法:
        • Properties();
        • Properties(Properties defaults);
      • 方法:
        • String getProperty();
        • String getProperty(String key,String defaultValue);
        • Object setProperty(String key,String value);
        • void load(InputStream in);
        • void store(OutputStream out,String comments);
    • 示例:
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    public class T1{
    	public static void main(String[] args) throws IOException{
    		Properties prop1=System.getProperties();
    		FileOutputStream fos=new FileOutputStream("E:\Temp\prop.ini");
    		prop1.store(fos,"system properties");
    		
    		Properties prop2=new Properties();
    		prop2.load(new FileInputStream("E:\Temp\prop.ini"));
    		System.out.println(prop2);
    	}
    }
    

    WeakHashMap

    • WeakHashMap与HashMap的区别在于:
      • 前者对key是弱引用,而后者对key是强引用
      • 弱引用:如果没有别的强引用变量指向这些key对象,那么它们可能会被System.gc()回收
      • 强引用:即使没有别的引用变量指向这些key对象,它们也不会被System.gc()回收
    • 有哪些用途呢?
    • 参见:Java中关于WeakReference和WeakHashMap的理解
    • 示例代码:
    import java.util.WeakHashMap;
    
    public class T1{
    	public static void main(String[] args){
    		WeakHashMap whm=new WeakHashMap();
    		String en=new String("英语");
    		whm.put(new String("语文"),new String("优秀")); //匿名字符串,弱引用
    		whm.put(new String("数学"),new String("良好"));
    		whm.put(en,new String("及格"));                 //强引用
    		whm.put("Java",new String("优秀")); //字符串直接量,系统自动保留对其强引用
    		System.out.println(whm);            
    		System.gc();
    		System.runFinalization();
    		System.out.println(whm); //只输出"英语"和"Java"两个键值对
    	}
    }
    
    

    IdentityHashMap

    • 这个类也跟HashMap相似,只是它判断两个key相等的标准是obj1==obj2,也就是内存中的相同地址
    • 因此可以存入两个"看起来相同"的key
    • 示例代码:
    import java.util.IdentityHashMap;
    import java.util.WeakHashMap;
    
    public class T1{
    	public static void main(String[] args){
    		IdentityHashMap ihm=new IdentityHashMap();
    		System.out.println(ihm.put(new String("语文"),90));
    		System.out.println(ihm.put(new String("语文"),95)); //这两个"语文"位于堆内存中,地址不一样
    		System.out.println(ihm.put("java",99));
    		System.out.println(ihm.put("java",96)); //这两个"java"位于常量池中,是同一个对象,地址相同
    		System.out.println(ihm);
    	}
    }
    

    其他

    • HashMap有个内部类,暂不写
  • 相关阅读:
    java接口
    java抽象类的特点
    java中的继承
    java中的exception模块
    java中的抽象类abstract
    java多态的案例
    iPhone开发重构:固化条件判断【转】
    服务器负载分析及问题排查
    tidb数据库
    TIDB数据库下载
  • 原文地址:https://www.cnblogs.com/sonng/p/6064528.html
Copyright © 2020-2023  润新知