Set ----散列集合
元素不可重复,元素是无序的。
HashSet底层是基于HashMap-----HashMap中维持了一个数组,数组的每一个位置称之为一个桶,每一个桶中维持了一个链表。一个元素根据其哈希码进行运算,根据运算结果将值平均的分到这些桶中。当用了75%的桶的时候,会进行扩容,桶的数量会增加一倍。已有元素会重新计算哈希码重新分布,这个过程称之为rehash操作。
HashMap,默认初始容量是16,即一开是有16个桶,当用到13个桶的时候要进行扩容,有16个桶扩为32个桶。
---加载因子越大,碰撞概率概率越大;加载因子越小,扩容和rehash操作越频繁。
Iterator
迭代器----用于迭代遍历集合----通过hasNext方法来判断是否有下一个元素,
Map<k,v>---映射
每一个键对应一个值---键值对----一个映射是有多个键值对来组成的----Map不是集合----键唯一的,值可以重复。
如何遍历一个Map?
1.先获取所有的键,遍历这些键,然后根据键获取对应的值---keySet()---将所有的键取出来放到一个Set集合
2.直接遍历所有的键值对----用什么表示键值对?---Map.Entry---每一个entry对象都表示了一个键值对,所有实际上一个Map
是由多个Map.Entry对象来组成---entrySet()---表示将所有的键值对放入一个Set集合中
Map不是集合,但是Map是集合框架的一员
集合框架(Java Collections Framework):Map、Collection、Collections、Arrays、Comparator、Comparable、Iterator --- 所谓集合框架指的是和集合相关的类的组成
Dictionary---映射的顶级父类---整个类都过时了
HashMap---允许键或者值为null.默认的初始值是16,默认加载因子是0.75f,每次扩容一倍。是一个异步是线程不安全的映射
Hashtable---不允许键或者值为null,默认初始容量是11,默认加载因子是0.75f。是一个同步式线程安全映射
ConcurrentHashMap---异步式线程安全的映射
File:
表示文件或者目录(文件夹)的类。目录实际上是不占用内存的。
名称分隔符:在windwos中用\来分割目录,在Liunx中/来分隔目录---separator
重要方法
创建
creatNewFile()---用于创建文件。只有当文件不存在的时候才能创建成功----要求路径必须真实存在---只能创建文件而不能创建
目录
mkdir()----只能创建目录而不能创建文件---只能创建一层目录
mkdirs()---用于创建一层或者多层目录
删除
delete()---用于删除文件/目录---如果删除的是目录,并且目录下有子文件或者子目录则会删除失败。
判断
canWrite()---判断文件是否可写
isAbsolute()---判读是否是一个绝对路径
isFile()---用于判读是否是一个文件
isDirectory()----用于判读是否是一个目录
isHidden()--判读是否是一个隐藏文件
exists()---判读文件是否真实存在
获取:
getName()---获取文件名字
listFiles()---获取指定路劲下子目录和子文件
枚举:
出现取值相对固定的情况---用enum关键字来定义一个枚举类。枚举常量是默认写在枚举类的首行
枚举类中可以定义任何的方法和属性
枚举类中可以定义抽象方法
枚举类中可以重载构造方法,但是构造方法一定是私有的
java中所有的枚举都默认继承了java.lang.Enum
可变参数
参数个数可以不固定
... 来定义可变参数。可变参数本质上是一个数组。在使用可变参数的时候可以不传入参数,也可以传入任意多个参数
可变参数在每个方法中只能定义一个,而且必须放在末尾
Arrays.aList()
Io 流
流动的是数据---数据的传输。Input/Output Stream -----输入/输出流。----数据是从外部流向了程序---输入流;
数据是从程序流向了外部---输出流;读取文件----数据从文件中流向程序,需要使用输入流;向文件中写入数据---数据
从程序流向文件中,使用输出流,根据数据的流动方向:输入流、输出流, 根据数据的传输形式:字符流,字节流
字符流 字节流
输入流 Reader InputStream
输出流 Writer OutputStream
四大基本流都是抽象类。
数据的来源/目的地:硬盘、硬件设备、内存、网络
流中的异常处理
1.需要将流对象放在try之外声明并且赋值为null,放到try之内初始化
2.在关流之前需要判断流对象是否初始化成功---判断流对象是否为null
3.关流之后需要将流对象强制设置为null,防止关流失败流对象依然占用文件
4.需要在关流之前手动冲刷缓冲区以防止关流失败导致一部分数据死在缓冲区中
缓冲流
BufferedReader---依靠传入的输入流来读取数据,然后BufferedReader再从输入流中获取数据提供缓冲区
转换流
OutputstreamWriter----将字符转化为字节的流
InputStreamReader----将字节转化为字符的流
序列化 /反序列化流
将对象的完整信息保存起来的过程----序列化---持久化
1.一对象想要被序列化,这个对象对应的类必须实习 Serializable ---这个接口中没有任何的方法和属性,仅仅用于标志这个类产生的对象可以被序列化
2.被static/transient关键字修饰的属性不会被序列化
3.一个类在实习Serializable接口之后会默认添加一个属性servialVersionUID----版本好,版本号的值会根据当前类中的
属性和方法自动计算。反序列化的时候就会比较对象中的版本号和当前类的版本号是否一致---需要手动指定版本号,防止
类产生微小改动的时候已经序列化的对象反序列化不回来---默认是用private static final long 修饰
4,集合和大部分映射不能被序列化
Properties
可以持久化的映射---规定键和值的类型是String
Properties对象必须放到.properties文件中
线程的定义方式
1.继承Thread,将要执行的任务逻辑放到run方法中,调用start方法来开启线程
2.实线Runnable,重写run方法,需要利用Runnable对象来构建一个Thread对象来启动线程
3。实习Callable<T>重写call
反射:剖析一个类,分析这个类的字节码,获取对应的字节码对象以及产生对应的实例对象的过程。--- 获取字节码对象:类名.class,对象.getClass(),Class.forName(类的全路径名);获取字节码对象:类名.class,对象.getClass(),Class.forName(类的全路径名) ,要求这个类中必须有无参构造;获取类中对应形式的构造方法对象
利用反射实现解耦操作