0014 Java学习笔记-集合-HashMap集合
2016-11-15 09:48
483 查看
主要的方法
+ 构造方法: * 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 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-->LinkedHashSetHashMap-->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 集合学习笔记4-HashMap TreeMap
- Java集合源码学习笔记(四)HashMap分析
- Java集合源码学习笔记(五)ArrayList,LinkedList,Vector和Hashtable,HashMap的比较
- JAVA学习笔记(二十二)- 集合HashMap与Hashtable
- 集合Map,HashMap、TreeMap+JAVA学习笔记-DAY18
- Java学习笔记之集合(八):HashMap的存储原理
- 0017 Java学习笔记-集合-集合一般:HashSet和HashMap
- Java集合学习笔记
- Java学习笔记之HashMap
- 黑马程序员________Java集合Map及其JDK1.5新特性泛型机制的学习笔记
- 深入Java集合学习系列:HashMap的实现原理
- java学习笔记:集合框架之TreeSet
- java学习笔记:集合框架之TreeSet
- java学习笔记—自定义实现linkedList集合
- 深入Java集合学习系列:HashMap的实现原理
- 【java web 学习笔记】java的集合对象
- java学习笔记-集合框架-黑马
- 【Java 学习笔记】 Hashmap
- 深入Java集合学习系列:HashMap的实现原理
- 深入Java集合学习系列:HashMap的实现原理