一、有哪些数据类型?
java的数据类型分为基本数据类型、枚举类型和引用类型
基本数据类型:boolean、byte、short、int、long、float、double、数组、char
枚举类型:enum
引用类型:除了基本数据类和枚举类型其他都是引用类型
基本数据类型:
名称 作用 默认值 范围
boolean 表示真或假 false true/false
byte 8位、有符号,以二进制补码表示的整数,表示字节数 0 -127~127
short 16位、有符号,以二进制补码表示的整数 0 -2^15~(2^15-1)
int 32位、有符号的以二进制补码表示的整数 0 -2^31~(2^31-1)
long 64位、有符号的以二进制补码表示的整数 0L -2^63~(2^63-1)
float 单精度、32位、符合IEEE 754标准的浮点数 0.0f (1.4E-45)~(3.4028235E38)
double 双精度、64 位、符合IEEE 754标准的浮点数 0.0d (4.9E-324)~(1.7976931348623157E308)
char 一个单一的 16 位 Unicode 字符 \u0000(即为0)~\uffff(即为65,535)
注:1、"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。
2、一个整数的默认数据类型是int
二、字节、字符与位的关系
bit就是位,也叫比特位,是计算机表示数据最小的单位
1byte=8bit
一个字符=2byte=16bit
三、基本数据类型与包装类
基本数据类型 包装类型
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
包装类的详解:
1、包装类是一个具体的类,可定义行为,解决了基本数据类型面向对象的问题
2、可以与基本数据类型进行转换
3、包装类是引用类型,且都是由final修饰的不可以继承
包装类的使用注意事项:
1、在类中定义属性的时候尽量不要使用包装类,因为存在null的风险
2、包装类在初始化时会加载组件所以相比基本数据类型会占用更多的内存
3、注意在拆箱过程中数字包装类的取值范围问题,如果超过范围则会重新创建对象,这时如果使用 ==则会出现错误的判断
所有的整数封装类,初始值如果大于128则会创建新的对象,例如:
Integer a1 = 97, a2 = 97;
Integer a3 = 197,a4 = 197;
a1 == a2 -----> true; //97 < 128,会从缓冲区中获取对象,引用地址没有发生改变
a3 == a4 -----> false; // 197>128,会创建新的对象,引用地址发生了改变
四、如何处理精度问题
关于基本数据类型精度大小的转换:
byte ---->(char)short --->int --->long--->float--->double
1、可以使用高精度的来接受低精度的类型(向上转)
2、如果用低精度来接受高精度的类型需要强转(向下转,此时会出现精度丢失问题)
3、因为精度不够所以,浮点数不能用来表示精度,例如货币,当出现精度丢失的问题可以使用
BigDecimal类来表示
BigDecimal是位于java.math包下的一个类,它继承了Number实现了Comparable接口,表示不变的,任意精度的带符号的十进制数字,它继承了Number类所以可以转换成为各种数字类型的基本数据类型,并且可以进行比较
五、什么是引用类型?
除了基本数据类型和枚举类型之外,其他的都是引用类型
引用的概念
强引用:必须引用的对象,如当使用new来创建对象时,被创建的对象就是强引用,如Object object = new Object(),此时的object就是强引用,GC不会回收强引用类型,jvm会抛出OutOfMemery来终止程序,也不会对强引用进行回收
软引用:只有当内存不够的时候jvm才会回收这些对象,通常用来做缓存并且通常与饮用队列联合使用,如果软引用被GC了,那么虚拟机会自动将这个软引用加入到与之关联的引用队列中
弱引用:比软引用的引用强度更低一点,如果一个对象只具有弱引用,那么当GC扫描到这个对象的时候都会被回收,但由于GC的线程优先级低,所以不一定保证能马上被回收,可以与引用队列同时使用,当这个弱引用被GC了之后,jvm会自动将这个弱引用关联到相应的引用队列中
虚引用:相当于没用引用,任何时候都可能被回收,主要用来监控一个对象被GC的过程,必须和引用队列同时使用,GC在回收对象之前,如果发现有虚引用,那么在回收之前需要把虚引用加入到相关联的引用队列中,可以通过虚引用来了解一个对象是否将要被回收
java.lang.ref包分别表示了上面的几种不同的引用类型
Reference<T>:抽象类,定义了引用类型的通用方法
SoftReference<T>:软引用,可以和引用队列联合使用
WeakReference<T>:弱引用,可以和引用队列联合使用
PhantomReference<T>:虚引用,必须和饮用队列联合使用
ReferenceQueue<T>:引用队列,起到监控对象是否被回收成功
为什么需要这么多的引用类型?
考虑到jvm的gc如果不加以区分,jvm在进行垃圾回收的时候可以更方便识别哪些需要回收,也可以手动进行垃圾回收,即调用System.gc();来回收相应的对象
网友评论