数据库的三范式
三大范式
数据库范式是设计数据库时,需要遵循的一些规范。各种范式是条件递增的联系,越高的范式数据库冗余越小。常用的数据库三大范式为:
第一范式(1NF):每个列都不可以再拆分,强调的是列的原子性,即数据库表的每一列都是不可分割的原 子数据项。
第二范式(2NF):在满足第一范式的基础上,非主属性完全依赖于主码(主关键字、主键),消除非主属性对主码的部分函数依赖。
第三范式(3NF):在满足第二范式的基础上,表中的任何属性不依赖于其它非主属性,消除传递依赖。简而言之,非主键都直接依赖于主键,而不是通过其它的键来间接依赖于主键。
反射
反射在开发代码时,我们通常明确使用关键字new创建对象,然后调用对象的某个具体方法,这种方式在程序运行前就已经确定了对象的类型、方法、字段等。有些功能场景下,需要动态获取并修改对象运行时行为,这就是Java反射的作用,通过Java反射,可以动态获取对象的方法(包括构造方法)、属性、注解、修饰符等,任何东西在反射面前都是透明的。
反射的一些缺点
性能相对较低:没有经过编译优化,需要动态即时解析。
有安全⻛险:私有方法或属性,可通过反射强制进入。
难以维护:修改类的方法或字段时,部分反射代码功能错误在编译时无法检查
虽然反射有一些缺点,但是它的应用场景也非常广泛。
动态代理,字节码增强
框架设计,解耦、提升扩展性
序列化与反序列化
JavaBean
IDE工具
java.lang.reflect包提供了大量的反射API,主要的一些核心类包括Method、Field、Constructor等。JVM给每个对象提供了一个java.lang.Class实例,相同类型的实例对象得到的是同一个Class对象,Class是反射API操作的入口。
获取Class对象Java提供了三种方式获取Cl ...
缓冲流
缓冲流Java非缓冲流的每次读写都需要进行本地方法调用,交给底层操作系统进行处理,工作效率非常低, 因为每次请求可能都会触发磁盘读写、网络活动以及其它一些开销昂贵的操作。为了减少操作系统的负载,Java提供了IO缓冲流,缓冲流内部提供了缓冲区(buffer)进行读写,大部分缓冲流的buffer默认 大小为 8192 字节(8KB)。
缓冲输入流从内存区域的buffer读取数据,当buffer数据为空时,Java本地输入方法才会进行调用。
缓冲输出流将数据写入到内存区域的buffer,当buffer写满时,Java本地输出方法才会进行调用。
Java程序可以通过包装方式将非缓冲流构造成为一个缓冲流,BufferedInputStream、 BufferedOutputStream用于构造缓冲字节流,BufferedReader、BufferedWriter用于构造缓冲字符流。
字节缓冲流字节缓冲流主要包括缓冲输入流BufferedInputStream,缓冲输出流BufferedOutputStreamWriter。
BufferedInputStream通过非缓冲字节流FileI ...
字符流
字符流Java采用Unicode规范处理字符,字符流IO自动将Java内部字符格式与本地字符集进行转换,自动解码编码,因此比起直接使用IO字节流,字符流操作相对更简单高效,所有的字符操作流都是从抽象类Reader以及Writer继承而来。
字符编码字符都有编码,读写字符时的编码不一致,则容易出现乱码,因此首先需要简单了解下常⻅的字符编码规则。
ASCII码
ASCII是American Standard Code for Information Interchange缩写,称为美国信息交换标准代码。ASCII一共定义了 128 个字符,其中 33 个字符是不可显示的控制字符, 95 个可显示的字符。
一个字节占 8 位,2^8=256,即一个字节可表示 256 个字符(0255),而ASCII字符只有 128 个,因此一个字节的低 7 位,2^7=128,足以表达全部的ASCII字符(0127),128~255则预留扩展其它字符,但 128 位根本不足以表示其它国家的字符。
GBK
GBK全称汉字内码扩展规范,GBK一共收集了^2 万多汉字与字符,一个中文字符编码 ...
字节流
字节流字节流的输入输出都是以字节为单位处理数据,一个字节等于 8 个二进制位,即由 8 位 0 或 1 组成的序列,如 01102300 为一个字节。在Java中所有的字节流都是从抽象类InputStream或OutputStream 类继承而来。大部分字节流使用方式相同,只是它们的构造方式可能不一样。
InputStream
InputStream提供的方法
方法名
签名
描述
read
public abstract int read()
这是一个抽象方法,需要子类实现,用于从输入流中读取下一个字节数据。由于一个字节是 8 位,返回值介于0~255之间,如果没有可读数据,即达到了流的末尾,则返回-1。方法会一直阻塞直到有字节数据可读、到达流末尾或者发生IO异常。
read
public int read(byte b[])
从输入流中读取b.length个字节,并储存到字节数组b中,如果b⻓度为 0 ,则不会读取任何字节数据,方法返回 0 。 read(byte b[]) -> read(byte b[], int off, int len) -> re ...
文件操作
1.1 文件操作java.io.File是Java提供的专⻔针对文件操作的类,File是文件与目录路径的一种抽象表示,用于操作文件与目录,不能操作文件内容。
构造File对象一个File对象通常表示磁盘上一个真实存在的文件或目录,创建File对象时,无论对应的文件与目录是否存在,不会影响File对象的构造。
常用的三个构造File方法
方法
描述
public File(String pathname)
通过给定的路径名创建指定的File实例
public File(String parent
String child) 根据指定的父路径与子路径字符串创建File实例
public File(File parent
String child) 根据指定的父路径File与子路径字符串创建新的File实例
public static void main(String[] args) { // 创建表示一个目录的File实例 File dir = new File("D://test"); // 创建表示文件的Fil ...
tcp重传机制
ok,我重传还不行吗
tcp的拥塞控制
嗯哼,怎么进行拥塞控制呢?
tcp的流量控制
嗷呦,怎么进行流量控制呢?
代码演示
代码块的演示