Map

引言:为什么需要Map?
在Java编程中,我们经常需要处理具有映射关系的数据。比如存储学生的姓名和成绩、存储商品的编号和价格、存储用户的ID和用户信息等。这些数据都具有"键-值对"(Key-Value Pair)的特点,一个键对应一个值。Java集合框架中的Map接口正是为处理这种映射关系而设计的,它提供了一种高效存储和检索数据的方式。
Map是Java集合框架中一个非常重要的组成部分,与Collection接口并列存在。如果说Collection是存储单个元素的集合,那么Map就是存储键值对的集合。在实际开发中,Map的使用频率非常高,理解其原理和特性对于编写高效、健壮的Java程序至关重要。
Map接口特点

*k与v存于Node中,操作中将Node向上转型为Entry。 存在EntrySet(实现Collection接口,可使用迭代器遍历)分别指向存放在Node中的数据,便于管理
常用方法

遍历

两种方法 keyset与entryset,取key与value。使用迭代器
HashMap
底层机制

扩容机制
- 扩容:
Hashtable
扩容机制
二者对比

Properties
- 说明:工作后XXX.properties文件通常作为配置文件,这个知识点在IO流学习
- 文章:https://www.cnblogs.com/xudong-bupt/p/3758136.html
主要方法
load(InputStream inStream) 这个方法可以从.properties属性文件对应的文件输入流中,加载属性列表到Properties类对象。如下面的代码:
Properties pro = new Properties();
FileInputStream in = new FileInputStream("a.properties");
pro.load(in);
in.close();
store(OutputStream out, String comments) 这个方法将Properties类对象的属性列表保存到输出流中。如下面的代码:
FileOutputStream oFile = new FileOutputStream(file, "a.properties");
pro.store(oFile, "Comment");
oFile.close();
如果comments不为空,保存后的属性文件第一行会是#comments,表示注释信息;如果为空则没有注释信息。 注释信息后面是属性文件的当前保存时间信息。
getProperty/setProperty 这两个方法分别是获取和设置属性信息。
代码实例
属性文件a.properties如下:
name=root
pass=liu
key=value
读取a.properties属性列表,与生成属性文件b.properties。代码如下:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
public class PropertyTest {
public static void main(String[] args) {
Properties prop = new Properties();
try{
//读取属性文件a.properties
InputStream in = new BufferedInputStream(new FileInputStream("a.properties"));
prop.load(in); //加载属性列表
Iterator<String> it=prop.stringPropertyNames().iterator();
while(it.hasNext()){
String key=it.next();
System.out.println(key+":"+prop.getProperty(key));
}
in.close();
//保存属性到b.properties文件
FileOutputStream oFile = new FileOutputStream("b.properties", true);//true表示追加打开
prop.setProperty("phone", "10086");
prop.store(oFile, "The New properties file");
oFile.close();
}
catch(Exception e){
System.out.println(e);
}
}
}
TreeMap
同TreeSet
开发中的选择
- 一组对象:Collection接口
- 允许重复:List
- 增删多:LinkedList[底层维护了一个双向链表]
- 改查多:ArrayList[底层维护Object类型的可变数组]
- 不允许重复:Set
- 无序:HashSet[底层是HashMap,维护了一个哈希表即(数组+链表+红黑树)]
- 排序:TreeSet
- 插入和取出顺序一致:LinkedHashSet(维护数组+双向链表)
- 允许重复:List
- 一组键值对:Map
- 键无序:HashMap[底层是:哈希表 jdk7:数组+链表,jdk8:数组+链表+红黑树]
- 键排序:TreeMap
- 键插入和取出顺序一致:LinkedHashMap
- 读取文件:Properties



