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有个内部类,暂不写
0014 Java学习笔记-集合-HashMap集合的更多相关文章
- Java学习笔记27(集合框架一:ArrayList回顾、Collection接口方法)
		集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组的区别: 1.数组的长度是固定的,集合的长度是可变的 2.集合中存储的元素必须是引用类型数据 对ArrayList集合的回顾 示例 ... 
- Java学习笔记-基础语法Ⅶ-集合
		集合 集合类特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 这里需要回顾一下,因为数组和字符串一旦创建,就不可改变,需要区分一下 import java.util.ArrayLi ... 
- 【Java学习笔记】Map集合的keySet,entrySet,values的用法例子
		import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.M ... 
- Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)
		规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ... 
- Java学习笔记32(集合框架六:Map接口)
		Map接口与Collection不同: Collection中的集合元素是孤立的,可理解为单身,是一个一个存进去的,称为单列集合 Map中的集合元素是成对存在的,可理解为夫妻,是一对一对存进去的,称为 ... 
- Java 学习笔记 两大集合框架Map和Collection
		两大框架图解 Collection接口 由第一张图,我们可以知道,Collection接口的子接口有三种,分别是List接口,Set接口和Queue接口 List接口 允许有重复的元素,元素按照添加的 ... 
- Java学习笔记33(集合框架七:Collections工具类)
		数组有工具类,方面操作数组 集合也有工具类:Collections 常用方法示例: package demo; import java.util.ArrayList; import java.util ... 
- Java学习笔记31(集合框架五:set接口、哈希表的介绍)
		set接口的特点: 1.不包含重复元素 2.set集合没有索引,只能用迭代器或增强for循环遍历 3.set的底层是map集合 方法和Collection的方法基本一样 set接口的实现类HashSe ... 
- Java学习笔记30(集合框架四:List接口)
		List接口继承自Collection接口 具有重要的三大特点: 1.有序集合:存入和取出的顺序一致 2.此接口的用户可以对列表中每个元素插入位置精确的控制:可以通过索引操作 3.可以存储重复元素 L ... 
随机推荐
- jquery简单原则器(匹配索引为指定值的元素)
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ... 
- Oracle数据库建表并用SQL编程分等级
			--创建学生表create table XS_543 ( XH char(6) not null , XM varchar2(20) not null, ZYM varchar2(10), XB ch ... 
- form表单及其中元素
			<form method=get/post action="提交路径"> 单行文本域:<input type="text" name=&quo ... 
- 第 24 章 CSS3 变形效果[下]
			学习要点: 1.3D 变形简介 2.transform-style 3.perspective 4.3D 变形属性 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 的变形效果,主要接着上节课 ... 
- 历史疑团之EJB
			在学习Sping框架的过程中,看到过很多次关于EJB的批判.使用了SpringMVC但是并没有真性情般体会到它的优点,所以有必要对传统的Java Bean和EJB来做一些了解,无奈百度搜了很多知识,还 ... 
- selenium + python自动化测试环境搭建
			selenium的在python平台的搭建: 搭建平台windows 准备工具如下: --------------------------------------------------------- ... 
- TestNG官方文档中文版(4)-运行TestNG
			4 - 运行TestNG TestNG可以以不同的方式调用: * Command line * ant * Eclipse * IntelliJ's IDEA 1) 命令行 假 ... 
- WindowsForm如何实现类似微软project软件的甘特图?
			在管理软件研发过程中,特别是涉及项目管理或者生产计划方面,都需要一款类似微软project的控件对项目下的分解任务进行图形展示(甘特图).下面介绍一下在WindowsForm下如何实现类似微软proj ... 
- Swiper – 经典的移动触摸滑块插件【免费】
			Swiper 是移动 Web 开发中最常用的滑块插件,是一款免费的,最现代化的移动触摸滑块,支持硬件加速的转换和惊人的原生表现.它的目的是在移动网站,移动 Web 应用程序和 Hygrid 混合应用程 ... 
- about reg
			var getR=function(str,reg){ return str.match(reg).join(""); } var a=getR("138888" ... 
