1、Map集合

Collection集合的特点是每次进行单个对象的保存,若要对一对对象来进行保存就只能用Map集合来保存。即Map集合中一次可以保存两个对象,且这两个对象的关系是key = value结构。这种结构最大的好处就是可以利用已知的key值找到对应的value值。

Map接口的定义:public interface Map<K,V>

常用方法:

向Map中追加元素: V put(K key, V value)

根据指定的key值取得对应的value若没有返回null:V get(Object key)

取得所有key信息,key不能重复:Set<K> keySet()

取得所有value信息,value可重复:Collection<V> values()

将Map集合变为Set集合:Set<Map.Entry<K, V>> entrySet()

Map和Collection一样本身就是一个接口,需要使用子类来进行实例化,Map常用的子类有:HashMap、HashTable、TreeMap、ConcurrentHashMap。

(1)HashMap

HashMap是Map中的常用子类。

HashMap中Key值不允许重复,若重复则会把对应的value值进行更新;Key和value都允许为空,key为空有且只能有一个。

基本操作:


  1. /*
  2. * HashMap
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Map<Integer,String> map = new HashMap<>();
  7. map.put(1, "num1");
  8. map.put(2, "num2");
  9. map.put(3, "num3");
  10. System.out.println("无重复值时:"+map);
  11. //重复的key值
  12. map.put(1, "num4");
  13. System.out.println("有重复值时:"+map);
  14. //重复的为null的key值
  15. map.put(null, null);
  16. map.put(null, "haha");
  17. System.out.println("有重复key = null"+map);
  18. //重复的为null的value值
  19. map.put(5, null);
  20. System.out.println("有重复value = null" +map);
  21. //获得key为2对应的value值
  22. System.out.println(map.get(2));
  23. //取得所有的key值
  24. System.out.println(map.keySet());
  25. //取得所有的value值
  26. System.out.println(map.values());
  27. }
  28. }

HashMap的原理:在数据量小的时候(jdk1.8后阈值为8)按照HashMap是按照链式存储,当数据量变大时为了快速查找,会将链表变为红黑树(均衡二叉树)来进行数据保存,用hash码作为数据定位。

(2)HashTable(最早实现二次偶对象存储)

在HashTale中key和value均不允许为null。当两者任意一个为null时,会报出如下异常:java.lang.NullPointerException。


  1. /*
  2. * HashTable
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Map<Integer, String> map = new Hashtable<>();
  7. map.put(1, "key");
  8. map.put(2, "value");
  9. //重复的key值
  10. map.put(1, "value");
  11. //key值为null
  12. //map.put(null,"haha");
  13. //value值为null
  14. //map.put(3, null);
  15. System.out.println(map);
  16. }
  17. }

当key值或者value值为空时:

HashMap和HashTable的区别:

1.版本上:HashTable是jdk1.0推出的;而HashMap是jdk1.2推出的。

2.性能上:HashTable属于同步处理,性能较低;而HashMap属于异步处理,性能较高

3.安全性方面:HashTable是线程安全的;而HashMap是非线程安全的。

4.null操作上:在HashTable中key和value都不允许为null,否则有NullPointException异常抛出;而HashMap允许key和value为null,且可key为null有且只有一个。

(3)ConcurrentHashMap

ConcurrrentHashMap具有HashTable的线程安全性同时也具有HashMap的高性能。且在ConcurrentHashMap中和HashTable一样都不想允许key和value为null。


  1. /*
  2. * ConcurrentHashMap
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Map<Integer, String> map = new ConcurrentHashMap<>();
  7. map.put(1, "key");
  8. //重复key值
  9. map.put(1, "value");
  10. map.put(2, "value");
  11. System.out.println(map);
  12. }
  13. }

其使用也和之前的HashTable和HashMap类似,因为他们都是Map的子类。

其高性能主要表现在:

a. 数据更新时,只能对特定的区域进行上锁,而其他区域不受影响。

b. 在锁的区域使用读写锁,读异步而写同步,即便在同一个桶中,数据的读取仍然不受影响。

(4)TreeMap

TreeMap是Map集合中唯一一个可用于排序的集合,是按照key值进行排序的。


  1. /*
  2. * TreeMap
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Map<Integer, String> map = new TreeMap<>();
  7. map.put(4, "key");
  8. //重复key值
  9. map.put(3, "value");
  10. map.put(2, "value");
  11. System.out.println(map);
  12. }
  13. }

实则排序的类必须实现Comparable接口,即实现CompareTo()方法,所以在上例中Integer类一定实现了Comparable接口。

(5)Map使用Iterator进行集合输出

Map和Collection的接口不同,在Collection接口中提供有iterator()方法,使我们可以很方便的取到Iterator对象来进行输出,而在Map集合中并没有提供该方法,首先我们观察Collection和Map接口数据保存的区别:

在Map中提供有一个重要的方法将Map集合转换成Set集合:

Set<Map.Entry<K, V>> entrySet()

Map要想调用Iterator进行输出,走的是一个间接使用的模式。


  1. /*
  2. * Map的Iterator输出
  3. * */
  4. public class Test{
  5. public static void main(String[] args) {
  6. Map<Integer, String> map = new HashMap<>();
  7. map.put(4, "key");
  8. //重复key值
  9. map.put(3, "value");
  10. map.put(2, "value");
  11. //将Map集合转换成Set集合
  12. Set<Map.Entry<Integer, String>> set = map.entrySet();
  13. //取得Iterator对象
  14. Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
  15. while(iterator.hasNext()) {
  16. //取得每一个Map.Entry的对象
  17. Map.Entry<Integer, String> entry =iterator.next();
  18. //取得key和value
  19. System.out.println("key = "+entry.getKey()+",value = "+entry.getValue());
  20. }
  21. }
  22. }

(6)关于Map中key的说明

在之前我们使用Map集合时都笼统的使用系统类作为key(Intreger、String),实则我们也可以使用自定义类来作为Map的key,此时一定要覆写Object类的hashCode()和equals()两个方法。

2、Properties属性文件操作

在Java中有一种属性文件(资源文件)的定义:.*properties文件,在这种文件中其内容的保存形式是“key = value”通过ResourceBundle类读取的时候只可以读取到内容,而若要对其内容进行编辑则需要Properties类来实现,这个类是专门做属性处理的。

Properties类定义:

public class Properties extends Hashtable<Object,Object>

常用方法:

设置属性:public synchronized Object setProperty(String key, String value)

返回指定key对应的value值,若没有找到返回null:

public String getProperty(String key)

返回指定key对应的value值,若没有对应的value则给个默认值(指的是返回给当前的默认值,并不会写入文件中):

public String getProperty(String key, String defaultValue)

向对应输出流保存属性: public void store(OutputStream out, String comments) throws IOException

将属性从文件中读出:public synchronized void load(InputStream inStream) throws IOException


  1. /*
  2. * Properties属性文件操作
  3. * */
  4. public class Test{
  5. public static void main(String[] args) throws FileNotFoundException, IOException {
  6. Properties properties = new Properties();
  7. //设置属性
  8. properties.setProperty("XN", "xi an");
  9. properties.setProperty("BJ", "bei jing");
  10. File file = new File("C:\\Users\\lenovo\\Desktop\\test.properties");
  11. //向对应输出流中保存属性
  12. properties.store(new FileOutputStream(file), "test_properties");
  13. //在文件中读出属性
  14. properties.load(new FileInputStream(file));
  15. //返回key对应的value,不存在返回null
  16. System.out.println(properties.getProperty("XN"));
  17. System.out.println(properties.getProperty("SX"));
  18. //返回key对应的value,若没有找到对应的value则给出默认值,不会写入到资源文件中
  19. System.out.println(properties.getOrDefault("SX", "shanxi"));
  20. }
  21. }

Properties只能操作String,它可以进行远程属性内容的加载。

集合类——Map集合、Properties属性文件操作的更多相关文章

  1. java下properties属性文件操作

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  2. 使用JAVA读写Properties属性文件

     使用JAVA读写Properties属性文件 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数 ...

  3. Code片段 : .properties属性文件操作工具类 & JSON工具类

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...

  4. 解决读写properties属性文件

    package com.kzkj.wx.utils; import java.io.BufferedReader; import java.io.File; import java.io.FileIn ...

  5. Java学习笔记——JDBC读取properties属性文件

    Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...

  6. java:Properties属性文件概念

    java:Properties属性文件概念 在java之前的国际化程序中提出了一个属性文件的概念,属性文件的后缀是:*.properties,那么在java中提供了意个属性文件的专门操作类,Prope ...

  7. Java - 得到项目中properties属性文件中定义的属性值

    public static String getPropertiesValue(String fileName, String key) {   return ResourceBundle.getBu ...

  8. Java读取利用java.util类Properties读取resource下的properties属性文件

    说明:upload.properties属性文件在resources下 import java.io.IOException;import java.io.InputStream;import jav ...

  9. 属性文件操作之Properties与ResourceBundle

    1.Properties与ResourceBundle 两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单. 2.Propertie ...

随机推荐

  1. java实现rsa加密算法【5min快速应用教程】

    该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的rsa加密算法的,可以百度找到更多原理.深度分析的文章. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一 ...

  2. Oracle 扩容表空间

    system用户登陆oracle https://blog.csdn.net/zyingpei/article/details/88870693 首先查看表空间对应的数据文件位置以及大小 select ...

  3. 【java+selenium3】多窗口window切换及句柄handle获取(四)

    一 .页面准备 1.html <html> <head> <title>主页面 1</title> </head> <body> ...

  4. SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作

    有这么一个业务场景:当用户注册后,发送邮件到其邮箱提示用户进行账号激活,且注册成功的同时需要赠送新人用户体验卡券. 业务有了,那么问题也就来了. What? 问题....问题?我听说你有问题? 来拔刀 ...

  5. 后台管理系统:vue&node&MongoDB(一)

    后台管理系统 使用工具: Vue    Node     Mongodb   Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...

  6. [Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处

    前言 如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 -- 组合式API.相信会有不少同志会陷入迷茫,因为我第一次听到新的名词 ...

  7. redis集群安装搭建

    vi redis-6379.conf   #包含通用配置 include "/usr/local/redis/conf/redis-common.conf" pidfile &qu ...

  8. @Inject注解

    在看eureka的源码看到了这个注解,百度一下说这个和autowored差不多, import javax.inject.Inject;import javax.inject.Singleton; @ ...

  9. BehaviorTree.CPP行为树BT的选择节点(四)

    Fallback 该节点家族在其他框架中被称为"选择器Selector"或"优先级Priority". 他们的目的是尝试不同的策略,直到找到可行的策略. 它们具 ...

  10. 洛谷 P4931 - [MtOI2018]情侣?给我烧了!(加强版)(组合数学)

    洛谷题面传送门 A 了这道题+发这篇题解,就当过了这个七夕节吧 奇怪的过节方式又增加了 首先看到此题第一眼我们可以想到二项式反演,不过这个 \(T\) 组数据加上 \(5\times 10^6\) 的 ...