1 Map (双列,映射)
将键映射到值的对象,不能包含重复的键,一个键最多映射一个值,而一个值可以被多个键映射。
格式:
public interface Map <K(键类型) , V(值类型)>
1.1 Map的接口的基本使用
put(K key, V value) | 将指定的值与该映射中的指定键相关联(可选操作)。 |
---|---|
boolean | isEmpty() 如果此地图不包含键值映射,则返回 true 。 |
Set<K> | keySet() 返回此地图中包含的键的[Set ]视图。 |
V | get(Object key) 返回到指定键所映射的值,或 null 如果此映射包含该键的映射。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。 |
boolean | containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。 |
Set<Map.Entry<K,V>> | entrySet() 返回此地图中包含的映射的Set 视图。 |
default V | replace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。 |
int | size() 返回此地图中键值映射的数量。 |
Collection<V> | values() 返回此地图中包含的值的[Collection ]视图。 |
键用 Set 值用 Collection 的原因:键不可以重复,值可以重复
1.2 Map集合的遍历方式
方式一:获取键集,遍历键集,在遍历下用 get()获取值集
方式二:用 Map.Entry()方法获取键值对集合,获取键和值,遍历输出
1.3 HashMap
HashMap 是Map接口使用频率最高的实现类
允许存储 null 键和 null 值,与HashSet 一样,不保证映射顺序
键集是 Set 集合,无序,不可重复,如果键是自定义对象,则需要重写 hashCode 和 equals 方法
值集是 Collection 集合,无序,可重复
键值对集由一个键和一个值组成,是 Set 集合,无序,不可重复
HashMap 中判断键是否唯一和HashSet 中判断元素是否唯一方法相同
1.4 HashMap的存储结构
基于Hash表实现
JDK1.7前用数组+链表实现
JDK1.8后用数组+链表+红黑树实现
HashMap 中的重要常量:
DEFAULT_INITIAL_CAPACITY = 1 << 4 Map默认容量 2的4次方16
MAXIMUM_CAPACITY = 1 << 30 Map最大容量2的30次方
DEFAULT_LOAD_FACTOR = 0.75f 默认加载因子
TREEIFY_THRESHOLD = 8 链表转化为红黑树的最大长度
UNTREEIFY_THRESHOLD = 6 红黑树的最小长度,小于等于则转化为链表
Map 中的键和值可为任意类型,当使用自定义类作为键时,需要重写hashCode 和equlas 方法
1.5 HashTable
与 HashMap 类似
HashMap 不同步但允许 null,HashTable 同步但不允许 null
1.6 TreeMap
- 基于红黑树实现,可对元素进行自然排序和定制排序
- 此实现不同步
排序实现:
对于存入 TreeMap 的键,如果是自定义类必须要实现 Comparable 接口,重写 compareTo 方法(自然排序)
在创建 TreeMap 对象时传入比较器对象,重写 compare 方法(定制排序)
2 集合的工具类
Collections 作用:针对集合操作的工具类
static <T extends Comparable<? super T>>void | sort(List<T> list) 根据其元素的[natural ordering]对指定的列表进行排序。 |
---|---|
static void | reverse(List<?> list) 反转指定列表中元素的顺序。 |
static void | shuffle(List<?> list) 使用默认的随机源随机排列指定的 |
3 IO
IO:输入/输出( input / output)
主要针对系统中的文件或目录进行相应操作
所有与 io 操作相关的类都位于 java.io 包下
3.1 File
- 文件和目录路径名的抽象表示
- 文件和目录可以通过 File 封装成一个对象
- 对 File 而言,封装的并不是一个真正存在的文件,而是是一个路径,这个路径可以存在,也可以不存在
3.1.1 构造方法
File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File 实例。 |
---|
File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File 实例。 |
File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File 实例。 |
3.1.2 File的创建方法
boolean | createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
---|---|
boolean | mkdir() 创建由此抽象路径名命名的目录。 |
boolean | mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
3.1.3 File类的判断和获取功能
判断
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
---|---|
boolean | isAbsolute() 测试这个抽象路径名是否是绝对的。 |
boolean | isDirectory() 测试此抽象路径名表示的文件是否为目录。 |
boolean | isFile() 测试此抽象路径名表示的文件是否为普通文件。 |
boolean | isHidden() 测试此抽象路径名命名的文件是否为隐藏文件。 |
获取
String | getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
---|---|
String | getName() 返回由此抽象路径名表示的文件或目录的名称。 |
String | getParent() 返回此抽象路径名的父 null 的路径名字符串,如果此路径名未命名为父目录,则返回null。 |
File | getParentFile() 返回此抽象路径名的父,或抽象路径名 null 如果此路径名没有指定父目录。 |
String | getPath() 将此抽象路径名转换为路径名字符串。 |
String[] | list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
String[] | list(FilenameFilter filter) 返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] | listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
File[] | listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
File[] | listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 |
3.1.4 File类的删除功能
方法:
boolean | delete() 删除由此抽象路径名表示的文件或目录。 |
---|
- 删除功能只能删除文件或空目录,如果目录不为空,则删除失败
- 该方法删除的文件和目录不会进入回收站
3.2 绝对路径和相对路径
绝对路径:完整的路径名,不需要其他信息就可以直接定位到文件的所在位置或位置,在Windows系统中以盘符开头,linux系统中以“/”
相对路径:必须使用取自其他领的信息进行解释,才能定位文件或目录
3.4 重命名
boolean | renameTo(File dest) 重命名由此抽象路径名表示的文件。 |
---|
重命名时更改抽象路径名可以对文件进行移动
4 IO流
流:是一个抽象的概念,是对数据传输的总称,本质为输出传输
IO流用于处理设备间数据的传输问题
常见应用:文件的复制、上传、下载
input:指外部存储设备(磁盘、硬盘等)的文件读入到内存
output:值内存的数据输出到外部存储设备
4.1 IO流分类
按流向:
- 输入流 读数据
- 输出流 写数据
按数据类型
字节流 字节输入流(InputStream) 字节输出流(OutputStream)
字符流 字符输入流(Reader) 字符输出流(Writer)
IO流的使用场景
- 纯文本文件(txt类型等)优先使用字符流
- 二进制文件(图片、视频、音频等)优先使用字节流
- 不确定类型的文件 推荐用字节流,字节是万能
4.2 字节流的使用
字节流抽象基类:
InputStream 该抽象类表示字节输入流的所有父类
OutputStream 该抽象类表示字节输出流的所有父类
所有子类都以 InputStream/OutputStream 结尾
常用的子类 FileInputStream(读数据)、FileOutputStream(写数据)
字节流创建方法
输入流:
FileInputStream(File file) 通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File 对象 file 命名。 |
---|
FileInputStream(String name) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name 命名。 |
输出流:
FileOutputStream(File file) 创建文件输出流以写入由指定的 File 对象表示的文件。 |
---|
FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File 对象表示的文件。 |
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件。 |
FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。 |
4.2.1 字节流写数据
方法
void | write(byte[] b) 将 b.length 个字节从指定的字节数组写入此文件输出流。 |
---|---|
void | write(byte[] b, int off, int len) 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流。 |
void | write(int b) 将指定的字节写入此文件输出流。 |
void | close() 关闭此文件输出流并释放与此流相关联的任何系统资源。 |
---|
使用字节输出流写数据的步骤
- 创建输入流对象
- 调用输入流方法,向文件写入数据
- 调用 close 方法,释放资源
实现换行写:
windows:\r\n
mac:\n
linux:\r
实现追加写:
令输入流对象的第二个参数为 true
不实现追加写时,每次都会创建一个新文件进行输入
字节流写输出的异常处理 :与其他异常处理相同都是抓抛模型
4.2.2 字节流读数据
4.2.2.1 每次读取一个整数
int | read() 从该输入流读取一个字节的数据。 |
---|
步骤:
- 创建字节输入流
- 调用字节流读数据的方法
- 调用 close()方法释放资源
4.2.2.2 每次读取一个字节数组
int | read(byte[] b) 从该输入流读取最多 b.length 个字节的数据为字节数组。 |
---|---|
int | read(byte[] b, int off, int len) 从该输入流读取最多 len 字节的数据为字节数组。 |
在输入流进行读取文件时,输出流在其他位置同时输出文件实现复制
文件复制时,最好用第二种方法