欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java数据结构--基本数据类型

程序员文章站 2022-04-16 22:05:01
...

Java基本数据类型

1 Java数据类型

Java 的数据类型分为两种:

  • 基本数据类型
  • 引用数据类型

运算的区别:

  1. 基本类型的赋值运算是复制数据。
  2. 引用类型的赋值运算是复制引用。
  3. 基本类型的比较(==)运算是比较数据。
  4. 引用类型的比较(==)运算是比较引用的地址。

2 Java的八种基本数据类型

参考: https://www.runoob.com/java/java-basic-datatypes.html

数据类型 占用的字节 默认值
byte 1 0
short 2 0
int 4 0
long 8 0
float 4 0.0f
double 8 0.0d
char 2 ‘\u0000’
boolean false

注意:

  • boolean占用的字节比较特殊,详见:https://www.jianshu.com/p/2f663dc820d0
  • char存储的是Unicode,可以直接存储中文
  • 实际上,JAVA中还存在另外一种基本类型 void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。

八种基本数据类型简介:

  • **byte:**最小值是 -128(-2^7),最大值是 127(2^7-1);byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一。
  • **short:**最小值是 -32768(-2^15),最大值是 32767(2^15 - 1);Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一。
  • **int:**最小值是 -2,147,483,648(-2^31),最大值是 2,147,483,647(2^31 - 1);一般地整型变量默认为 int 类型。
  • **long:**最小值是 -9,223,372,036,854,775,808(-2^63),最大值是 9,223,372,036,854,775,807(2^63 -1);这种类型主要使用在需要比较大整数的系统上。
  • **float:**float 在储存大型浮点数组的时候可节省内存空间,浮点数不能用来表示精确的值,如货币。
  • **double:**浮点数的默认类型为double类型。
  • **boolean:**只有两个取值:true 和 false;
  • **char:**最小值是 \u0000(即为0),最大值是 \uffff(即为65,535);char 数据类型可以储存任何字符。

3 包装类

3.1 包装类的概念

虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。

这种借助于非面向对象技术的做法有时也会带来不便,比如引用类型数据均继承了 Object 类的特性,要转换为 String 类型(经常有这种需要)时只要简单调用 Object 类中定义的toString()即可,而基本数据类型转换为 String 类型则要麻烦得多。为解决此类问题 ,Java为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes),也有教材称为外覆类或数据类型类。

基本类型 包装类型
byte Byte(Number的子类)
short Short(Number的子类)
int Integer(Number的子类)
long Long(Number的子类)
float Float(Number的子类)
double Double(Number的子类)
char Character(Object的子类)
boolean Boolean(Object的子类)

3.2 拆箱和装箱

在jdk 1.5之前,如果要生成一个数值为10的Integer对象,需要这么做:

Integer integer =  new Integer(10);

而在jdk 1.5开始就提供了自动装箱功能,如果要生成数值为10的Integer对象,只需要像下面这样做就行了:

Integer integer = 10;

这样写会触发自动装箱,能直接根据数值就能创建对应的Integer对象,而不用new操作。

简而言之,装箱就是基本数据类型转换为包装器类型,拆箱就是包装器类型转换基本类型:

Integer integer = 5;//装箱
int i = integer;//拆箱

**注意:**装箱的时候是调用的包装器的valueOf这个函数,拆箱的时候调用的是包装器的xxxValue这个函数(xxx是包装器对应的基本数据类型)。

3.3 基本数据类型与包装数据类型的使用规范

基本数据类型与包装数据类型的使用标准

Reference:《阿里巴巴Java开发手册》

  • 【强制】所有的 POJO 类属性必须使用包装数据类型。
  • 【强制】RPC 方法的返回值和参数必须使用包装数据类型。
  • 【推荐】所有的局部变量使用基本数据类型。

比如我们如果自定义了一个Student类,其中有一个属性是成绩score,如果用Integer而不用int定义,一次考试,学生可能没考,值是null,也可能考了,但考了0分,值是0,这两个表达的状态明显不一样.

说明 :POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或 者入库检查,都由使用者来保证。

正例 : 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。

反例 : 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时, 返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能 够表示额外的信息,如:远程调用失败,异常退出。

4 基本数据类型与常量池

参考:https://blog.csdn.net/u010126792/article/details/61616412

由于jvm方法区常量池的存在,通过自动装箱的方式生成的对象不一定是新创建的对象,即不一定是new出来的。

例如:已经存在一个使用装箱机制创建的对象A指向常量池中的一个数据a,再使用装箱机制创建一个对象B同样指向a,那么会把B赋值为A(B = A):

int i = 10;
Integer I1 = i;
Integer I2 = i;
System.out.println(I1 == I2);//结果为True,I1,I2为同一个对象

但是并不是所有的包装类都实现了常量池技术,而且实现了的包装类也只是在对应值在一定范围内才可使用常量池:

int i = 128;
Integer I1 = i;
Integer I2 = i;
System.out.println(I1 == I2);//结果为False,128超出了使用常量池的范围

八种包装类的实现情况及他们缓存的范围是:

  • Integer: (-128,127)缓存
  • Boolean :全部缓存
  • Byte :全部缓存
  • Character : <=127缓存
  • Short : (-128,127)缓存
  • Long : (-128,127)缓存
  • Float : (没有缓存)
  • Double : (没有缓存)

注意: String类也有类似的常量池技术