Java基本数据类型
name 符号 类型 byte byte 有 字节 8 shout 有 短整型 16 int 有 整型 32 long 有 长整型 64 float 有 单精浮点型 32 double 有 双精浮点型 64 char - 字符型 16 boolean - 布尔型 8-只有一个bit有用
浮点数用于科学计算,不能用于精确计算。由于十进制往二进制转化时会发生精度丢失. 精确计算使用Math包下的:BigDecimal
public static double add (double var1, double var2) {
BigDecimal b1 = new BigDecimal(Double.toString(var1));
BigDecimal b2 = new BigDecimal(Double.toString(var2));
return b1.add(b2).doubleValue();
}
基本类型定义在方法内(局部变量)则存储与栈,定义为类成员变量则存储在堆–不以方法结束而销毁。
字节流和字符流
字节流操作时没有用到缓冲区,直接在文件上操作。 字符流操作时使用了缓冲区,通过缓冲区操作文件。 用法:
字节流:OutputStream 字符流:Writer
Objec类中的常用方法
方法名 说明 clone() 复制:使用该方法必须实现Java.lang.Cloneable接口 equal() 比较判断,各有特性 hashcode() 获取累的hash码 toString() 转化为字符串 finalize() 垃圾收集时调用的销毁方法
clone()方法会在内存(堆)中新建一个对象。浅拷贝则对象中属性的引用相同,属性实现Cloneable接口则深拷贝,默认执行深拷贝。 与new不同,clone在初始化完成后已原对象信息填充新对象。 equal 与 == Object中的equal方法和== 都是比较内存地址是否相同; 未覆写的equal方法:基本类型(含包装类型和String),都是比较值是否相等,引用类型,都是比较在栈中的地址是否相等; equal()方法返回true的两个对象,必然hashcode()返回值相同。但hashcode返回的不一定是内存地址。
序列化与序列化
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj" ));
Test test = new Test();
test.i = 1 ;
out.writeObject(test);
out.flush();
test.i = 2 ;
out.writeObject(test);
out.close();
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
"result.obj" ));
Test t1 = (Test) oin.readObject();
Test t2 = (Test) oin.readObject();
System.out.println(t1.i);
System.out.println(t2.i);
只有实现了Serializable和Externalizable接口的类的对象才能被序列化。 Externalizable 接口默认不保存任何字段。 Serializable 接口默认保留所有字段。 Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的 网络间的同一个对象,如果serialVersionUID不同,则不能反序列化成功。这种方法也控制客户端程序更新–改变服务端的serialVersionUID。默认serialVersionUID为基于文件内容的摘要信息。 序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。 如果需要父类也被序列化,则父类需要实现Serializable 接口。如果没有实现,反序列化时会调用父类默认的无参构造函数–即属性值都是初始值。 transient 关键字可以阻止该变量被序列化到文件中,反序列化时变量的值被设为初始值。 在序列化过程中,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法。实现自定义方法时也可以使transient 变量起效。 同一个对象两次写入同一个文件,只会保存一份序列化数据,其他的为引用信息。即保存第一的状态信息,其他都是这个对象的引用。所以在反序列化后,做过的变更将会失效。
IO与NIO
IO
作用 字节输入 字节输出 字符输入 字符输出 抽象基类 InptuStream OutPutStream Reader Writer 文件访问 FileInptuStream FileOutPutStream FileReader FileWriter 数组访问 ByteArrayInptuStream ByteArrayOutPutStream CharArrayReader CharArrayWriter 管道访问 PipedInptuStream PipedOutPutStream PipedReader PipedWriter 字符串访问 - - StringReader StringWriter 缓冲流 BufferedInptuStream BufferedOutPutStream BufferedReader BufferedWriter 转换流 - - InptuStreamReader OutPutStreamWriter 对象访问 ObjectInptuStream ObjectOutPutStream - - 装饰点 FilterInptuStream FilterOutPutStream FilterReader FilterWriter 抽象基类 InptuStream OutPutStream Reader Writer 打印流 - PrintStream - PrintWriter 退回输入流 PushBackInptuStream - PushBackReader - 数据流 DataInptuStream DataOutPutStream - -
- 传统IO基于流来操作 - 传统IO是阻塞的,因为用了volatile,synchronized 来实现同步 - 流程:磁盘 -> 内核缓存 -> 用户空间
NIO
三大组件:Buffers,Channels,Selectors NIO是基于缓冲来进行操作 NIO是支持非阻塞和阻塞两种模式,除了FileChannel
都是非阻塞的
AIO(NIO2)
java7以上支持 实为异步非阻塞IO 应用程序读写为同步IO,OS读写为异步IO 流程:磁盘 -> 用户空间