第二阶段 集合--反射总结 s2-day06 ## 集合的体系结构 * 集合:
* 是一个统称, 包含很多集合的实现类. 根据不同数据结构, 提供了不同的集合类
* 数据结构:
* 数据的组织和存储方式
* 体系结构:
* 将不同的集合实现类的共性向上抽取出父类, 从而形成一种体系
* 如何学习一种体系结构:
* 从顶层开始学习共性
* 从底层使用具体实现
## Collection接口中常用的功能
* `Collection`接口
* 是单列集合体系的顶层
* 如何创建Collection对象?
* 本身是接口, 实际使用的是子类对象. 使用多态, `Collection c = new ArrayList<>();`
* 常用方法
* 增
* `boolean add(E e)`: 向集合中添加元素, 添加成功返回true, 添加失败返回false. 永远能够添加成功
* 删
* `boolean remove(Object o)`: 删除元素中的指定元素, 删除成功返回true, 删除失败返回false
* `void clear()`: 清空集合中的元素
* 判断
* `boolean contains(Object o)`: 判断集合中是否包含指定元素, 包含返回true, 否则false
* `boolean isEmpty()`: 判断集合是否为空集合, 即没有元素. 没有元素返回true, 否则false
* 获取个数
* `int size()`: 获取集合中元素的个数
* 转换
* `Object[] toArray()`: 将集合转换为Object[] s2-day07 *Set接口:
* 继承自Collection接口
* 特点
* 元素无序(存入和取出的顺序不一致)
* 元素不能重复(元素唯一)
* 没有索引
* 注意:
* 无序: 指的是存入的顺序和取出的顺序不一样, 而不是说每次取出来是随机顺序, 存入后每次取出来的顺序都一样, 但和存入的顺序不一样
* 直接打印和获取元素都属于取出, 所以不要把打印当成是HashSet内部存储的样子
## HashSet存储自定义对象并遍历 * HashSet类: 是Set接口的实现类
* 成员方法
* `boolean add(E e)`: 添加成功true, 添加失败(重复了)返回false
s2-day08 * 异常:
* 就是不正常的情况, 是代码编译或运行时发生的错误
* 常见异常
* `NullPointerException`
* `ArrayIndexOutOfBoundException`
* 任何数字(负数, 0, 正数)除以0都会抛出异常
* 异常体系结构 ```
java.lang.Throwable(最顶层)
|_ Error (不应该试图捕获的严重问题, 不能处理的异常)
|_ Exception (可以处理的异常) # 编译时异常: 编译时期就会发生的异常
|_ RuntimeException # 运行时异常: 编译时正常, 运行时才会发生的异常 s2-day09 * 注意: 目录路径字符串写2个斜线: `a\\b`, 或`a/b`
* 原因: 一个斜线可以和字母组合编程特殊字符, 如`\t`, 所以要把斜线转义为普通的斜线, 即`\\t`
* `java.io.File`类: 是文件和目录的路径名的抽象表现形式(也就是文件和目录在Java中的形式, 既能表示文件, 也能表示目录)
* 构造方法(创建了File对象, 并将其指向该路径. **注意**: 不会在磁盘上创建这个文件)
* `File(String pathname)`: 使用指定的路径名创建一个File对象.
* `File(String parent, String child)`: 根据指定的父路径和文件路径创建File对象.
* `File(File parent, String child)`: 根据指定的父路径File对象和文件路径创建File对象 s2-day10 * 类字段:
* 静态成员变量
* `System`类的类字段
* `err`: 标准错误输出流. 命令行输出错误信息
* 是PrintStream, `OutputStream`的子类, 属于字节输出流
* `in`: 标准输入流. 键盘输入 InputStream in = System.in; byte byte[]
* 是`InputStream`类, 属于字节输入流
* `out`: 标准输出流. 将数据输出到控制台 OutputStream out = System.out; byte byte[]
* 是PrintStream, `OutputStream`的子类, 属于字节输出流 s2-day11 * 进程:
* Process, 一个应用程序在内存中的执行区域
* 举例:
* 一个正在运行的程序, 可以有一个或多个进程.
* 例如: 查看资源管理器, QQ有1个进程, chrome浏览器有多个进程
* 每个进程都会占用一部分系统资源
* 如CPU, 内存, 磁盘, 网络等
* 线程:
* Thread, 是一个进程中的一个执行路径.
* 举例:
* 一个进程中可以有一个或多个线程, 每个线程可以执行自己的代码
* 多个线程各自执行的任务可以同时进行
* 线程的执行依靠CPU调度分配
* 单核CPU: 靠CPU不断高速的随机的切换执行的线程, 达到看似同时进行的效果
* 多核CPU: 每个CPU可能完全执行一个线程, 或者多个CPU各自不断高速随机切换, 更高效
* 单线程和多线程特点
* 单线程: 同一时间只做一件事情, 安全性高, 效率低.
* 多线程: 同一时间做多件事, 安全性低, 效率高.
* 单线程和多线程的例子
* 假设各位同学吃坏了, 都想去卫生间, 只有1个空位
* 单线程方式: 同学1进去解决完毕, 同学2再去. ( 安全性高, 效率低)
* 多线程方式: 大家同时进去解决... (安全性低, 效率高) s2-day12 * 网络通信三要素
* `传输协议`:
* 作用: 通信的规则
* 常见协议
* TCP: Transmission Control Protocol, 传输控制协议
* UDP: User Datagram Protocol, 用户数据报协议
* `IP地址`: 是一个二进制数字
* 作用: 网络设备的标识.
* IPv4: 192.168.100.255 (每位0~255, 32位, 4个无符号byte), `点分十进制表示法`
* IPv6: CDCD:910A:2222:5498:8475:1111:3900:2020 (128位, 16个无符号byte)
* IP可以使用主机名或域名代替, 更容易记忆
* `端口号`:
* 作用: 标识使用网络通信的进程的逻辑地址, 用于定位一个主机上的具体服务
* 0~65535个端口, 前1024个端口号是系统保留端口号
* 常见服务占用的端口
* 80: HTTP服务
* 443: HTTPS服务, 安全加密的HTTP
* 21: FTP服务, 文件传输
* 22: SSH服务, 安全加密的远程登录
* 23: Telnet服务, 远程登录
* 查看端口号: `netstat -an` s2-day13 为什么要学反射:
* 反射的目的
* 反射可以在不修改源代码的前提下, 改变程序的运行方式
* 反射是后期web框架的底层实现基础, 帮助我们更好理解框架的原理
* 反射能干的事
* 前提条件: 获取一个类的字节码对象, 然后通过该字节码对象可以:
* 获取一个类的所有构造方法
* 创建一个类的对象
* 获取一个类的所有成员属性
* 获取属性值
* 设置属性值
* 获取一个类的所有成员方法
* 调用成员方法 ## 反射机制概述, 获取字节码对象的3种方式
* 反射:
* Reflection. 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的), 调用任意一个对象的所有属性和方法(包括私有的)
* 反射的前提
* 获取类的字节码对象
* 获取字节码对象的3种方法
* `对象.getClass()`
* `类名.class`
* `Class.forName(String clasName)`
|