HashMap和File与IO
1、Collection
(1)体系结构Iterator Collection 子接口 List 实现类ArrayList、Vector、LinkedList Set HashSet…
Map 实现类 HashMap
(2)常用方法
(3)迭代器
- 使用增强for,底层就是迭代器 for(类型 变量:要遍历集合或者数组) { }
- 迭代器原理
- 首先创建迭代器对象,判断是否有下一个元素,指向下一个元素,获取出来
2、List集合
(1)List特点:有序的,可以重复元素,底层结构数组、链表…
(2)List常用方法:add get size…
(3)List遍历四种方式:普通for、增强for、迭代器、List迭代器
(4)实现类存储结构和扩容机制:ArrayList、Vector、LinkedList
3、Set集合
(1)set特点:没有重复,无序
(2)实现类和方法
(3)Set集合遍历:增强for、迭代器
4、Map集合
(1)Map特点:键值对 key-value
(2)Map集合方法和遍历
- 添加 put
- 删除(取出) remove
- 清空 clear
- 所有key ketSet
- 所有value values
一、HashMap底层结构和原理
(1)创建HashMap对象时候,初始化几个值,
- 主要:table代表数组默认null,负载因子默认0.75,边界值0
(2)第一次向HashMap添加元素 - 根据添加数据key计算hash值
- 判断当前table数组是否为空,第一次肯定是空,数组进行初始化
– 数组容量 16 ,临界值 12 - 根据数组初始长度和hash值得到数组某个位置,在位置添加元素(第一次加不存在重复问题)
(3)容量不超过临界值12时候,再次添加数据
- 根据添加数据key计算hash值
- 根据数组长度和hash值得到数组某个位置,在位置添加元素
– 判断数组这个位置上面是否存在元素,如果不存在,添加
– 如果位置存在元素,
— 判断位置元素key是否一样,如果key相同,替换,如果key不一样,链表存储
(4)容量超过临界值12,添加数据
- 根据添加数据key计算hash值
- 根据数组长度和hash值得到数组某个位置,在位置添加元素
– 判断数组这个位置上面是否存在元素,如果不存在,添加
– 如果位置存在元素,
— 判断位置元素key是否一样,如果key相同,替换,如果key不一样,链表存储
– 判断数组容量是否超过临界值,如果超过进行扩容
— 把数组大小2倍,临界值2倍
— 把数组元素重新编排
(5)在jdk1.8优化
- 如果数组容量64,链表节点8,把链表转换树形结构
二、Map集合补充
1、Hashtable解决线程安全问题,任何非 null 对象都可以用作键或值。
HashMap是线程不安全的,并允许使用 null 值和 null 键。
2、LinkedHashMap是HashMap子类
3、TreeMap
三、File文件操作
1、什么是File
File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,
File类能新建、删除、重命名文件和目录。
2、常用方法
public class FileDemo1 {
public static void main(String[] args) throws IOException {
// 文件路径名
// String pathname = "D:\\aaa.txt";
// File file1 = new File(pathname);
// 文件路径名
String pathname2 = "E:\\0224\\bbb.txt";
File file = new File(pathname2);
//1 查看是否存在文件
boolean exists = file.exists();
//System.out.println(exists);
//2 获取文件路径和文件名称
// System.out.println("文件构造路径:"+file.getPath());
// System.out.println("文件名称:"+file.getName());
//3 public boolean isDirectory()` :此File表示的是否为目录。
//- `public boolean isFile()` :此File表示的是否为文件。
// System.out.println(file.isDirectory());
// System.out.println(file.isFile());
//相对路径
// ./ 当前目录下
// ../ 上层目录 ../../
//- public boolean createNewFile()` :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
//- `public boolean delete()` :删除由此File表示的文件或目录。 只能删除空目录。
//- `public boolean mkdir()` :创建由此File表示的目录。单层目录
//- `public boolean mkdirs()` :创建由此File表示的目录,包括任何必需但不存在的父目录。 多层目录
File f = new File("E:\\aaa.txt");
// System.out.println(f.exists());
boolean newFile = f.createNewFile();
// System.out.println(newFile);
// System.out.println(f.exists());
File f1 = new File("E:\\atguigu0224");
// System.out.println(f1.exists());
boolean mkdir = f1.mkdir();
// System.out.println(mkdir);
// System.out.println(f1.exists());
File f2 = new File("E:\\wwww\\abcd");
boolean mkdir1 = f2.mkdir();
// System.out.println(mkdir1);
boolean mkdirs = f2.mkdirs();
// System.out.println(mkdirs);
boolean f1delete = f1.delete();
// System.out.println(f1delete);
boolean f2delete = f2.delete();
// System.out.println(f2delete);
File dir = new File("E:\\wwww");
//获取当前目录下的文件以及文件夹的名称。