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

时间:2023-01-07 09:16:49

主要的方法

+ 构造方法:
* 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集合的更多相关文章

  1. Java学习笔记27(集合框架一:ArrayList回顾、Collection接口方法)

    集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组的区别: 1.数组的长度是固定的,集合的长度是可变的 2.集合中存储的元素必须是引用类型数据 对ArrayList集合的回顾 示例 ...

  2. 【Java学习笔记】Map集合的keySet,entrySet,values的用法例子

    import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  3. Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)

    规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ...

  4. Java学习笔记32(集合框架六:Map接口)

    Map接口与Collection不同: Collection中的集合元素是孤立的,可理解为单身,是一个一个存进去的,称为单列集合 Map中的集合元素是成对存在的,可理解为夫妻,是一对一对存进去的,称为 ...

  5. Java 学习笔记 两大集合框架Map和Collection

    两大框架图解 Collection接口 由第一张图,我们可以知道,Collection接口的子接口有三种,分别是List接口,Set接口和Queue接口 List接口 允许有重复的元素,元素按照添加的 ...

  6. Java学习笔记33(集合框架七:Collections工具类)

    数组有工具类,方面操作数组 集合也有工具类:Collections 常用方法示例: package demo; import java.util.ArrayList; import java.util ...

  7. Java学习笔记31(集合框架五:set接口、哈希表的介绍)

    set接口的特点: 1.不包含重复元素 2.set集合没有索引,只能用迭代器或增强for循环遍历 3.set的底层是map集合 方法和Collection的方法基本一样 set接口的实现类HashSe ...

  8. Java学习笔记30(集合框架四:List接口)

    List接口继承自Collection接口 具有重要的三大特点: 1.有序集合:存入和取出的顺序一致 2.此接口的用户可以对列表中每个元素插入位置精确的控制:可以通过索引操作 3.可以存储重复元素 L ...

  9. Java学习笔记29(集合框架三:泛型)

    泛型的概念: 简单地讲,就是同一个方法(类),可以接受不同的数据类型并运行得到相对应的结果,不会出现安全问题 上一篇有一段这样的代码: 没有定义集合类型.迭代器类型 package demo; imp ...

随机推荐

  1. php 批量删除

    <body><form action="shanchu.php" method="post"><table width=&quot ...

  2. JavaScript学习07 内置对象

    JavaScript内置对象 图像对象 导航对象 窗口对象 屏幕对象 事件对象 历史对象 文件对象(重要) 锚点对象 链接对象 框架对象 表单对象(重要) 位置对象 JS Window 窗口对象:ht ...

  3. pip安装使用详解

    pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载   1 # wget "https://py ...

  4. 使用xml方式定义补间动画

    在res下创建一个目录 anim目录 public class MainActivity extends Activity { private ImageView iv; @Override prot ...

  5. &lbrack;kuangbin带你飞&rsqb;专题七 线段树

            ID Origin Title 228 / 440 Problem A HDU 1166 敌兵布阵   207 / 438 Problem B HDU 1754 I Hate It   ...

  6. AOP及专有名词通俗解答

    AOP面向切面编程,是一种编程思想,并不是Spring专有,Spring是封装代理模式完成,之前的博客中也写到了关于AOP的文章,Filter和代理,请见<以此之长,补彼之短----AOP(Fi ...

  7. Hadoop完全分布式安装

    一.软件版本 Hadoop版本号:hadoop-2.6.0.tar: VMWare版本号:VMware-workstation-full-11.0.0-2305329 Ubuntu版本号:ubuntu ...

  8. T-SQL LIKE子句 模糊查询

    MS SQL Server LIKE子句用于使用通配符运算符将值与类似值进行比较. 有两个通配符与LIKE运算符结合使用: 百分号(%) 下划线(_) 百分号表示零个,一个或多个字符. 下划线表示单个 ...

  9. python之dict与set实现原理之hash算法

    理解不透彻,下回分解 http://www.cnblogs.com/pengsixiong/p/5326893.html https://blog.csdn.net/zhao_crystal/arti ...

  10. TodoMVC:帮助你选择一个MV&ast;框架

    开发者现在有很多的MV*框架选择来组织开发web应用程序.Backbone. Ember.AngularJS.Spine… 新的稳定解决方案列表持续增长,但你如何决定在海量的框架中选择哪个使用? 为了 ...