# 前言
List:
a. Vector:底层依靠数组来存储数据,默认初始容量是10,每次扩容是增加一倍。线程安全
b. Stack:遵循后进先出的原则。继承了Vector,所以在最底层依然是依靠数组来存储数据
Queue:队列。遵循先进先出的原则
Set:
a. 元素是唯一的。如果放入重复的元素,则会被舍弃
b. HashSet:底层依靠HashMap来完成存储
c. TreeSet:底层依靠二叉树结构来存储数据。要求元素之间大小可以比较,因此元素所对应的类必须实现Comparable接口
迭代器:
a. 在底层是依靠指针的指向和挪动来获取数据
b. 最早的迭代器是Enumeration,后来被Iterator取代
c. 增强for循环本质上是一种迭代遍历
泛型:
a. 参数化类型,接口是ParameterizedType
b. 是JDK1.5的特性之一
c. 泛型的擦除:用具体类型来替换泛型的过程。发生在编译期
d. 泛型的上限: ? extends 类/接口
泛型的下限: ? super 类/接口
# Map - 映射
一、概述
将键映射到值,每一个键必须对应一个值
键是唯一的
如果存放重复的键,那么对应的值会被覆盖
映射的顶级接口Map。Map就是一个存储键值对的容器
Map不是集合,但是Map是Java集合框架的成员
Java集合框架 - Java CollectionsFramework包含了数组、集合、映射相关的类以及接口:Collection、Map、Arrays、Collections、Iterator、Comparator、Comparable
二、遍历映射
}先获取所有的键,再根据键获取值
直接获取所有的键值对。代表键值对的接口Entry,Entry是Map的内部接口
三、实现类
HashMap:
a. 底层依靠数组+链表结构来存储数据
b. 默认数组的初始容量是16,默认加载因子是0.75f
c. JDK1.8中,如果单个桶中的节点个数超过8个会将链表扭转成一棵红黑树;当节点个数不足7个时候,会扭转会链表
d. 如果指定了初始容量n,那么2x < n <= 2x+1,实际容量就是2x+1
e. 当已用桶的数量/桶的总数量>加载因子的时候,会进行扩容。每次增加一倍
f. 在扩容的时候,要将所有的元素进行重新的分布 - rehash
g. HashMap在存储元素的时候,先计算键的哈希码,然后针对哈希码进行二次运算,使结果落在某个桶上
h. 键值对在往桶中放的时候,会先和桶中的所有的键值对的键进行比较;如果键一致,则对应的值覆盖;如果键不一致,则插入到链表的头部
i. 允许null键和null值
j. 异步式线程不安全
Hashtable - 仅作为了解:
a. Hashtable是java中最早的映射
b. 不允许键和值为null
c. 底层也是依靠数组+链表结构
d. 默认初始容量是11,默认加载因子是0.75f
e. 给定的初始容量是多少,那么就是多少
f. 同步式线程安全
# File
一、概述
代表文件或者目录(文件夹)的类
在Windows中,用\\间隔目录;在Linux或者是Unix中,是用/间隔目录, java中为了屏蔽不同操作系统的差异性,所以提供了File.separator表示间隔符
在Windows中,用;间隔不同的路径;在Linux或者是Unix中,用:间隔不同的路径,java中为了屏蔽不同操作系统的差异性,所以提供了File.pathSeparator表示间隔符
二、路径
绝对路径:以盘符或者是/开头的路径。在计算路径的时候和当前路径没有任何关系
相对路径:不以盘符或者是/开头的路径。在计算路径的时候需要以当前路径为基准进行计算 --- .. 表示上一层目录
三、练习
- 删除目录
思路:写成一个方法 --- 判断是一个文件(isFile())还是一个目录(isDirectory());如果是文件,直接删除(delete());如果是目录,获取这个目录中所有的子目录和子文件(listFiles()) --- 后续的操作和当前方法的功能一致的,直接调用当前的方法形成递归
- 统计工作空间中java文件的个数
思路:写成方法 --- 判断参数是文件还是目录;如果是文件,是否是一个java文件(先获取文件名,然后根据文件名判断);如果是目录,获取这个目录中所有的子文件和子目录,然后形成了递归
扩展:模拟操作系统的文件剪切的流程
扩展:剪切目录
# IO流
一、概述
是程序中一套用于数据传输的机制
IO流 - Input/Ouput流 - 输入输出流
输入流:数据从外部流向程序。例如读取文件
输出流:数据从程序流向外部。例如向文件中写数据