Map
Map接口是和Collection同等级的根接口
1.特点
- 存储的是(K-V)键值对
- 无序
- key唯一,Value可以重复
2.实现类
- HashMap:底层 数组、链表、红黑树
- LinkedHashMap:有序的map
- TreeMap:排序的map
- HashTable:和HashMap的区别为——HashTable线程安全。不常用
3.常用方法
//创建HashMap对象
HashMap<String, Integer> map = new HashMap<>();
System.out.println(map.size());//0
//put(Key,Value)-->return Value;返回对应Key的Value,如果是新键,返回null,否则返回对应Value
map.put("java", 12);
map.put("c",13);
map.put("php",14);
map.put("c++",15);
map.put("c++", 17);
//键唯一,所以只有一个c++,但是Value即15被17被覆盖了
System.out.println(map);//{c++=17, java=12, c=13, php=14}
//isEmpty()
System.out.println(map.isEmpty());//false
//containsKey(Key)是否包含指定Key
System.out.println(map.containsKey("c"));//true
System.out.println(map.containsKey("JS"));//false
//containsValue(Value)
System.out.println(map.containsValue(12));//true
//get(Key)--->return Value;
System.out.println(map.get("java"));//12
//putAll(map)-->void
HashMap<String, Integer> map2 = new HashMap<>();
map2.putAll(map);
System.out.println(map2);//{php=14, c++=17, java=12, c=13}
//clear()
map2.clear();
System.out.println(map2);//{}
//keySet()-->return <Keys>返回Key的集合
System.out.println(map.keySet());//[c++, java, c, php]
//values()-->return <Values>返回Value的集合
System.out.println(map.values());//[17, 12, 13, 14]
// forEach()
// map.forEach((Key,Value)->{
// System.out.println("Key:"+Key+" Value:"+Value);
// //Key:c++ Value:17
// //Key:java Value:12
// //Key:c Value:13
// //Key:php Value:14
// });
map.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String s, Integer integer) {
System.out.println("Key:"+s+" Value:"+integer);
}
});
//remove(Key)-->return Value返回对应的Value:根据Key删除
System.out.println(map.remove("c"));//13
System.out.println(map);//{c++=17, java=12, php=14}
//remove(Key,Value)-->return boolean
System.out.println(map.remove("c++", 17));//true
System.out.println(map);//{java=12, php=14}
//replace(Key, oldValue, newValue)-->return boolean;
System.out.println(map.replace("java", 12, 10));//true
System.out.println(map);//{java=10, php=14}
//replace(Key, newValue)-->return oldValue;:根据Key设置新Value,返回旧Value
System.out.println(map.replace("php", 90));//14
System.out.println(map);//{java=10, php=90}
//entrySet()
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String,Integer> entry : entries) {
System.out.println(entry);
System.out.println(entry.getValue());
System.out.println(entry.getKey());
}
//java=10
//10
//java
//php=90
//90
//php
4.原理
- 初始化
1.构造方法中没有做任何的数组初始化
2.负载因子:相当于一个阈值
- 默认:0.75f
- 元素的数量 xx.size()/capacity,是一个最优解,为了增强HashMap性能
3.最大容量:默认2^30
4.put的原理:HashMap的存储原理
- put方法会初始化位桶Node数组的初始大小,默认位16
- put方法存值时,会先计算Key的hashCode方法返回的int值,根据hash算法 确定当前元素key在位桶中的位置
- 如果该位置无元素,则直接放入数组中
- 如果该位置上有元素,则产生了hash冲突(哈希碰撞)
- 产生hash冲突后,根据key的equals方法判断key是否相等,如果相等,则将key所对应的v覆盖
- 如果key的equals方法不相等,则采用尾插法将元素插入链表的尾部
- 当链表长度大于等于7时,链表转为红黑树进行存储
- 当位桶Node数组大于指定容量(指结合负载因子所计算出来的容量)时,扩容
- 扩容为原容量的2倍
建议为每个实体类都增加hashCode和Equals方法
Exception
异常处理机制 ———— 如何处理异常
1.抛
方法的后面加throws 抛出异常抛出一个或多个。 测试时用,为了代码的整洁/可读性
2.抓
try{可能出现异常的代码} catch(抓取的异常对象){对异常处理的代码}
try{} catch(){} finally{无论异常发生或者不发生都会执行的代码}
3.处理异常,如果有多个异常可以直接处理起父类
4.通过异常对象可以输出以下常用信息
消息、原因、堆栈信息
5.自定义异常
- 继承Exception类,重写其对应的方法
File
表文件抽象路径名对象
1.路径问题:
1.绝对路径:从磁盘根目录开始
*2.相对路径
技巧:所有的相对路径如果忘了,从绝对路径开始依次删除前面的文件,直到测试结果值正确为止
3.在main函数下,相对路径与父工程src平级,即与module平级
public class TestFile {
public static void main(String[] args) {
File file = new File("wyp");
System.out.println(file);//不管有没有这个文件,都生成了对应的对象
System.out.println(file.exists());//false
//测试相对路径
file = new File("src\\com\\hqyj\\map");
System.out.println(file.exists());//true
file = new File("src/com/hqyj/map");
System.out.println(file.exists());//true
}
}
2.常用方法
public class FileTest {
public static void main(String[] args) throws IOException {
File file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/FT.java");
//测试应用程序是否可以读取此抽象路径名表示的文件
System.out.println(file.canRead());//true
//测试此抽象路径名表示的文件或目录是否存在
System.out.println(file.exists());//true
//测试此抽象路径名表示的文件是否是一个标准文件
System.out.println(file.isFile());//true
//返回此抽象路径名表示的文件最后一次被修改的时间
System.out.println(file.lastModified());//1970 年 1 月 1 日 0:00 以来的毫秒数
//返回由此抽象路径名表示的文件或目录的名称
System.out.println(file.getName());//FT.java
//测试应用程序是否可以修改此抽象路径名表示的文件
System.out.println(file.canWrite());//true
//测试此抽象路径名表示的文件是否是一个目录
System.out.println(file.isDirectory());//false
//测试此抽象路径名指定的文件是否是一个隐藏文件
System.out.println(file.isHidden());//false
//返回由此抽象路径名表示的文件的长度
System.out.println(file.length());//52
//将此抽象路径名转换为一个路径名字符串。
System.out.println(file.getPath());
//E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\FT.java
//当且仅当不存在具有此抽象路径名指定的名称的文件时,
// 原子地创建由此抽象路径名指定的一个新的空文件
file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/s");
System.out.println(file.createNewFile());//true
System.out.println(file.getPath());
//E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\s
//删除此抽象路径名表示的文件或目录
System.out.println(file.delete());//true
System.out.println(file.exists());//false
//创建此抽象路径名指定的目录
file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdir_test");
System.out.println(file.mkdir());//true
System.out.println(file.getPath());
//E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdir_test
//创建此抽象路径名指定的目录,包括创建必需但不存在的父目录
file = new File("E:/Shixun/huaqingWorkspace/Day_13_test_api/src/com/hqyj/homework/mkdirs_test");
System.out.println(file.mkdirs());//true
System.out.println(file.getPath());
//E:\Shixun\huaqingWorkspace\Day_13_test_api\src\com\hqyj\homework\mkdirs_test\child
}
}
4.面试题
问:\\ 和 / 表示路径有什么区别?
答:兼容性问题。
\\ 是windows独有的
/ 在任何操作系统下都识别 建议使用 /