集合类——Map集合、Properties属性文件操作
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为空有且只能有一个。
基本操作:
-
/*
-
* HashMap
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Map<Integer,String> map = new HashMap<>();
-
map.put(1, "num1");
-
map.put(2, "num2");
-
map.put(3, "num3");
-
System.out.println("无重复值时:"+map);
-
//重复的key值
-
map.put(1, "num4");
-
System.out.println("有重复值时:"+map);
-
//重复的为null的key值
-
map.put(null, null);
-
map.put(null, "haha");
-
System.out.println("有重复key = null"+map);
-
//重复的为null的value值
-
map.put(5, null);
-
System.out.println("有重复value = null" +map);
-
//获得key为2对应的value值
-
System.out.println(map.get(2));
-
//取得所有的key值
-
System.out.println(map.keySet());
-
//取得所有的value值
-
System.out.println(map.values());
-
}
-
}
HashMap的原理:在数据量小的时候(jdk1.8后阈值为8)按照HashMap是按照链式存储,当数据量变大时为了快速查找,会将链表变为红黑树(均衡二叉树)来进行数据保存,用hash码作为数据定位。
(2)HashTable(最早实现二次偶对象存储)
在HashTale中key和value均不允许为null。当两者任意一个为null时,会报出如下异常:java.lang.NullPointerException。
-
/*
-
* HashTable
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Map<Integer, String> map = new Hashtable<>();
-
map.put(1, "key");
-
map.put(2, "value");
-
//重复的key值
-
map.put(1, "value");
-
//key值为null
-
//map.put(null,"haha");
-
//value值为null
-
//map.put(3, null);
-
System.out.println(map);
-
}
-
}
当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。
-
/*
-
* ConcurrentHashMap
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Map<Integer, String> map = new ConcurrentHashMap<>();
-
map.put(1, "key");
-
//重复key值
-
map.put(1, "value");
-
map.put(2, "value");
-
System.out.println(map);
-
}
-
}
其使用也和之前的HashTable和HashMap类似,因为他们都是Map的子类。
其高性能主要表现在:
a. 数据更新时,只能对特定的区域进行上锁,而其他区域不受影响。
b. 在锁的区域使用读写锁,读异步而写同步,即便在同一个桶中,数据的读取仍然不受影响。
(4)TreeMap
TreeMap是Map集合中唯一一个可用于排序的集合,是按照key值进行排序的。
-
/*
-
* TreeMap
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Map<Integer, String> map = new TreeMap<>();
-
map.put(4, "key");
-
//重复key值
-
map.put(3, "value");
-
map.put(2, "value");
-
System.out.println(map);
-
}
-
}
实则排序的类必须实现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进行输出,走的是一个间接使用的模式。
-
/*
-
* Map的Iterator输出
-
* */
-
public class Test{
-
public static void main(String[] args) {
-
Map<Integer, String> map = new HashMap<>();
-
map.put(4, "key");
-
//重复key值
-
map.put(3, "value");
-
map.put(2, "value");
-
//将Map集合转换成Set集合
-
Set<Map.Entry<Integer, String>> set = map.entrySet();
-
//取得Iterator对象
-
Iterator<Map.Entry<Integer,String>> iterator = set.iterator();
-
while(iterator.hasNext()) {
-
//取得每一个Map.Entry的对象
-
Map.Entry<Integer, String> entry =iterator.next();
-
//取得key和value
-
System.out.println("key = "+entry.getKey()+",value = "+entry.getValue());
-
}
-
}
-
}
(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 |
-
/*
-
* Properties属性文件操作
-
* */
-
public class Test{
-
public static void main(String[] args) throws FileNotFoundException, IOException {
-
Properties properties = new Properties();
-
//设置属性
-
properties.setProperty("XN", "xi an");
-
properties.setProperty("BJ", "bei jing");
-
File file = new File("C:\\Users\\lenovo\\Desktop\\test.properties");
-
//向对应输出流中保存属性
-
properties.store(new FileOutputStream(file), "test_properties");
-
//在文件中读出属性
-
properties.load(new FileInputStream(file));
-
//返回key对应的value,不存在返回null
-
System.out.println(properties.getProperty("XN"));
-
System.out.println(properties.getProperty("SX"));
-
//返回key对应的value,若没有找到对应的value则给出默认值,不会写入到资源文件中
-
System.out.println(properties.getOrDefault("SX", "shanxi"));
-
}
-
}
Properties只能操作String,它可以进行远程属性内容的加载。
集合类——Map集合、Properties属性文件操作的更多相关文章
- java下properties属性文件操作
package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- 使用JAVA读写Properties属性文件
使用JAVA读写Properties属性文件 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数 ...
- Code片段 : .properties属性文件操作工具类 & JSON工具类
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...
- 解决读写properties属性文件
package com.kzkj.wx.utils; import java.io.BufferedReader; import java.io.File; import java.io.FileIn ...
- Java学习笔记——JDBC读取properties属性文件
Java 中的 properties 文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件. 文件的内容是格式是"键=值"(key-valu ...
- java:Properties属性文件概念
java:Properties属性文件概念 在java之前的国际化程序中提出了一个属性文件的概念,属性文件的后缀是:*.properties,那么在java中提供了意个属性文件的专门操作类,Prope ...
- Java - 得到项目中properties属性文件中定义的属性值
public static String getPropertiesValue(String fileName, String key) { return ResourceBundle.getBu ...
- Java读取利用java.util类Properties读取resource下的properties属性文件
说明:upload.properties属性文件在resources下 import java.io.IOException;import java.io.InputStream;import jav ...
- 属性文件操作之Properties与ResourceBundle
1.Properties与ResourceBundle 两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单. 2.Propertie ...
随机推荐
- javac 不是内部或外部命令 和 错误 找不到或无法加载主类 的解决方法
使用package语句与import语句. 实验要求:按实验要求使用package语句,并用import语句使用Java平台提供的包中的类以及自定义包中的类.掌握一些重要的操作步骤. 代码: 模板1: ...
- 使用silky脚手架构建微服务应用
目录 模板简介 构建独立应用的模板Silky.App.Template 构建模块化应用的模板Silky.Module.Template 开源地址 在线文档 模板简介 使用 dotnet new 命令可 ...
- c++学习笔记2(const关键词的用法)
定义常量指针 优势(便于类型检查,define无类型检查(目前不是很理解)) (函数参数为常量指针时,可避免函数内部不小心改变参数指针所指的地方,如有出现此类语句,编译则会报错) strcpy:复制字 ...
- idea创建maven项目时一直在 Process Running
解决方案: 1.设置maven的配置 File--->Settings(Ctrl+Alt+S)--->Build--->Build Tools--->Maven--->R ...
- Java是“值传递”还是“引用传递”?
本文是根据stackoverflow网站上的一道题目整理出来的. Java一直是"值传递"而不是引用传递.看一个例子: public class Main{ public stat ...
- Arduino uno r3 使用 ESP8266 UART-WiFi 透传模块
一.所需硬件材料 1.ESP8266:01s某宝上3.5块钱 2.杜邦线:某宝几块钱一组40P,这里只需要三根,用于连接 树莓派与继电器 3.烧录器 二.ESP8266 AT固件烧录 ESP8266主 ...
- react之路由
功能:让用户从一个视图(组件)导航到另一个视图(组件) 前端路由是一套映射规则,在React中,是URL路径与组件的对应关系 使用React路由简单来说,就是配置路径和组件 路由的使用 1.安装路由 ...
- [loj3342]制作菜品
当$n-1\le m$,不妨令$d_{1}\le d_{2}\le...\le d_{n}$,则$(n-1)k\le mk=\sum_{i=1}^{n}d_{i}\le d_{1}+(n-1)d_{n ...
- Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析
前言 前面进行了可以传输,那么写一个简单的C程序来交叉编译并传入运行. 虚拟机 上一篇搭建的虚拟机环境,包含了sftp传递文件,网络能ping通,基于上一篇的虚拟机继续搭建. 海思交叉 ...
- vue指令v-for报错:Elements in iteration expect to have 'v-bind:key' directives.eslint-plugin-vue
文件–>首选项–>设置–>在搜索框中输入:vetur.validation.template,取消勾选.