二进制位运算
- 位运算的特殊用法
- 清零。与一个各位都为零的数值相与
- 取一个数中指定位。例:X=10101110,取X的低四位,用X&000 1111 = 0000 1110
- 两个变量交换值的方法:A= A^B;B=A^B;A=A^B;(A=A+B;B=A-B;A= A-B;)
- 原码&反码&补码
- 原码:一个证书按照绝对值大小转换成的二进制数称为原码。
- 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
- 补码:反码加一称为补码(负数以其正值的补码形式表示)。
Java内置的进制转换
- 进制转换
十进制转成十六进制:
Integer.toHexString(int i)
十进制转成八进制
Integer.toOctalString(int i)
十进制转成二进制
Integer.toBinaryString(int i)
十六进制转成十进制
Integer.valueOf("FFFF",16).toString()
八进制转成十进制
Integer.valueOf("876",8).toString()
二进制转十进制
Integer.valueOf("0101",2).toString()
有什么方法可以直接将2,8,16进制直接转换为10进制的吗?
java.lang.Integer类
parseInt(String s, int radix)
使用第二个参数指定的基数,将字符串参数解析为有符号的整数。
- 大小端
小端法:低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端;
大端法:高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。
Java文件传输基础
- File类常用API
Java.io.File类用于表示文件(目录)
File类只用于表示文件(目录)的信息(名称、大小等),不能用于表示内容的访问。
- RandomAccessFile
Java提供的对文件内容的访问,既可以读文件,也可以写文件
支持随机访问文件,可以访问文件的任意位置
- Java文件模型:在硬盘是文件是byte byte byte存储的,是数据的集合
- 打开文件:有两种模式"rw"(读写)、"r"(只读)
- RandomAccessFile raf = new RandomAcceFile(file, "rw");
文件指针,打开文件时指针在开头pointer = 0;
- 读方法:int b = raf.read()--->读一个字节
- 写方法:raf.write(int)--->只写一个字节(后8位),同时指针指向下一个位置,准备再次写入
- 文件读写完成后一定要关闭(Oracle官方说明,会产生未知错误)
- Java字节流
- InputStream抽象了应用程序读取数据的方式;OutputStream抽象了应用程序写出数据的方式
EOF = End 读到-1就读到了结尾
- 输入流的基本方法:
int b = in.read();//读取一个字节无符号填充到int的低8位。-1是EOF
In.read(byte[] buf);//读取数据填充到字节数组buf
In.read(byte[] buf, int start, int size);//读取数据到字节数组
- 输出流的基本方法:
Out.write(int b);// 写出一个byte到流,b的低8位
Out.write(byte[] buf);//将buf字节数组都写入到流
Out.write(byte[] buf, int start, int end)
- FileInputStream--->具体实现了在文件上读取数据
- BufferedInputStream&BufferedOutputStream这两个刘类为IO提供了带缓冲区的操作,一般打开文件进行写入或读取操作时都会加上缓冲,这种流模式提高了IO的性能。
FileOutputStream--->write()方法
DataOutputStream--->writeXxx()方法
BufferedOutputStream--->write()方法
-
- Java字符流
- 编码问题
- 认识文本和文本文件
Java文本(char)是16位无符号整数,是字符的Unicode编码(双字节编码)
文件是byte byte byte … 的数据序列
文本文件是文本(char)序列按照魔种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果
- 字符流(Reader Writer)
字符的处理,一次处理一个字符
字符的底层仍然是基本的字节序列
字符流的基本实现:
InputStreamReader:完成byte流解析为char流,按照编码解析
OutputStreamWriter:提供char流到byte流,按照编码处理
FileReader/FileWriter:直接对文件进行读写(注意编码格式)
BufferedReader--->readLine 一次读一行
BufferedWriter/printWriter--->写一行
- 对象的序列化,反序列化
- 对象序列化:将Object转换成byte序列,反之叫对象的反序列化
- 序列化流(ObjectOutputStream),是过滤流--->writeObject
反序列化流(ObjectInputStream)--->readObject
- 序列化接口(Serializable)
对象必须实现序列化接口,才能实现序列化,否则将出现异常
这个接口没有任何方法,只是一个标准
- transient关键字
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
s.defaultWriteObject();//把jvm能默认序列化的元素进行序列化操作
s.writeInt(stuage);//自己完成stuage的序列化
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException{
s.defaultReadObject();//把jvm能默认反序列化的元素进行反序列化
this.stuage = s.readInt();//自己完成stuage的反序列化操作
}
分析ArrayList原码中序列化与反系列化的问题
序列化中子类和父类构造函数的调用问题