Java 语言基础

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));
       // b1.subtract(b2).doubleValue(); // 减法
       // b1.multiply(b2).doubleValue(); // 乘法
       // b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();// 除法,scale 精度,到小数点后几位
       // b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); // 四舍五入
       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

  • 结构体系:
作用字节输入字节输出字符输入字符输出
抽象基类InptuStreamOutPutStreamReaderWriter
文件访问FileInptuStreamFileOutPutStreamFileReaderFileWriter
数组访问ByteArrayInptuStreamByteArrayOutPutStreamCharArrayReaderCharArrayWriter
管道访问PipedInptuStreamPipedOutPutStreamPipedReaderPipedWriter
字符串访问--StringReaderStringWriter
缓冲流BufferedInptuStreamBufferedOutPutStreamBufferedReaderBufferedWriter
转换流--InptuStreamReaderOutPutStreamWriter
对象访问ObjectInptuStreamObjectOutPutStream--
装饰点FilterInptuStreamFilterOutPutStreamFilterReaderFilterWriter
抽象基类InptuStreamOutPutStreamReaderWriter
打印流-PrintStream-PrintWriter
退回输入流PushBackInptuStream-PushBackReader-
数据流DataInptuStreamDataOutPutStream--

- 传统IO基于流来操作
- 传统IO是阻塞的,因为用了volatile,synchronized 来实现同步
- 流程:磁盘 -> 内核缓存 -> 用户空间

NIO

  • 三大组件:Buffers,Channels,Selectors
  • NIO是基于缓冲来进行操作
  • NIO是支持非阻塞和阻塞两种模式,除了FileChannel 都是非阻塞的

AIO(NIO2)

  • java7以上支持
  • 实为异步非阻塞IO
  • 应用程序读写为同步IO,OS读写为异步IO
  • 流程:磁盘 -> 用户空间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值