Java学习笔记—数据类型

·  阅读 685
Java学习笔记—数据类型

数据类型

基本数据类型

基本数据类型是CPU可以直接进行运算的类型,是指不可再分割的原子数据类型,内存中直接存储此类型的值,通过内存地址就可以访问到数据,并且内存中只能存放这种类型的值。

Java定义了以下几种基本数据类型:

  • 整数类型:byte、short、int、long
  • 浮点数类型:float、double
  • 字符类型:char
  • 布尔类型:boolean

在理解基本数据类型区别前,先了解一下计算机内存基本结构:

计算机内存最小存储单元是字节(byte),一个字节就是8位二进制数,即8bit。它的表示范围从00000000~11111111,换算成十进制为0~255,换成十六进制为00~ff。

内存单元是从0开始编号,称之为内存地址。每个内存单元可以看作一间房间,内存地址就是房间号。

image-20200520182223759

一个字节是1byte,1K=1024byte,1M=1024K,1G=1024M,1T=1024G。

不同的数据类型占用的字节数不一样。请看下图:

image-20200520182508384

byte正好一个字节,而long和double是8个字节

整型

对于整型,Java中只定义了带符号的整型,因此,最高位的bit表示符号位(0表示整数,1表示负数)

  • byte: -128~127
  • short: -32768 ~ 32767
  • int: -2147483648 ~ 2147483647
  • long: -9223372036854775808 ~ 9223372036854775807

浮点类型

浮点类型的数就是小数,因为小数用科学计算法表示的时候,小数点是可以“浮动”,例如:1234.5表示成

1.2345*10^3

浮点数事例如下:

float f1 = 3.14f;
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324
复制代码

对于float 类型,需要在后面添加f

浮点类型表示范围非常大,float 最大表示3.4x10^38 ,而double最大可表示 1.79x10^308

布尔类型

布尔类型boolean只有truefalse两个值,布尔类型总是关系运算的计算结果:

Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。

字符类型

字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符。

注意char类型使用单引号',且仅有一个字符,要和双引号"的字符串类型区分开。

引用类型

除了以上8种基本类型外,都是引用类型。例如,引用类型最常用的就是String字符串:

String s = "hello";
复制代码

引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置。

  • 引用类型分为两种数据类型:引用变量本身和引用指向的对象。为描述简单起见,把引用变量(Reference Variable)称为refvar,而指向的实际对象(Referred Object)称为refobj。
  • refvar是基本数据类型,它的默认值是null,存储refobj的首地址。
  • refvar 占用4B空间
  • refobj 无论多么小的对象占用的存储空间是12B(用于存储基本信息,称为对象头),但是由于存储空间分配必须是8B的倍数,所以初始分配的空间至少是16B。

包装类型

  • 包装类型的继承结构图:

    image-20200525153628091

  • 自动装箱、拆箱

    • 装箱、自动装箱

      Integer i1 = new Integer(8);
      Integer i2 = Integer.valueOf(8);
      
      // 自动装箱
      Integer i3 = 8;
      复制代码

      以上 3 种都可以进行转换,但在 Java 5 之前第 3 种方法是编译失败的,第 3 种方法也正是现在的自动装箱功能。另外,第一种构造器方法也不推荐使用了,已经标为废弃了。

    • 自动拆箱

      // 自动拆箱
      int i4 = i3;
      
      int i5 = i3.intValue();
      复制代码

      继续上面的例子,把 i3 赋值给 i4 就是实现的自动拆箱功能,自动装箱的原理就是调用包装类的 xxValue 方法,如 i5 中的 Integer 的 intValue 方法。

  • 8种基本数据类型都有对应的包装类

  • 包装类解决了基本数据类型无法做到的事情:泛型类型参数、序列化、类型转换、高频区间数据缓存。

  • 所有包装类对象之间的比较,推荐全部使用equals()方法

  • 在选择使用包装类还是基本数据类型时,推荐使用如下方式:

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

字符串

  • 字符串是在堆上分配的

  • 字符串相关类型主要有三种:String、StringBuilder、StringBuffer

  • String相关:

    • String是只读字符串,不可变(immutable)对象,对它的任何改动,其实都是创建一个新对象,再把引用指向新对象。
    • String对象赋值操作后,会在常量池中进行缓存,如果下次申请创建对象时,缓存中已经存在,则直接返回相应引用给创建者。
  • StringBuffer相关:

    • StringBuffer可以对原对象上进行修改,是线程安全的。
    • JDK5引入的StringBuilder和StringBuffer均继承自AbstractStringBuilder
  • StringBuilder相关:

    • StringBuilder是非线程安全的
    • 继承自AbstractStringBuilder,该抽象类内部和String一样,也是以字符数组的形式存储字符串的。
  • String和StringBuffer:

    • 基本字符串操作可以使用String相加,这样操作比较方便。

    • 在循环语句中不推荐字符串直接相加操作,推荐使用StringBuilderd的append方法进行扩展。以下方式不推荐:

      String str= "test";
      for(int i=0;i<100;i++){
      	str = str + "hello";
      }
      复制代码

总结

  • Java的9种基本数据类型(8种基本类型+引用类型)
    • 整型:byte、short、int、long
    • 浮点型:float、double
    • 布尔型:boolean
    • 字符型:char
    • 引用类型:面向对象世界中的引用变量(引用句柄),或者叫引用类型。

image-20200520182508384

序号 类型名称 默认值 大小 最小值 最大值 包装类 缓存区间
1 boolean false 1B 0(false) 1(true) Boolean
2 byte (byte)0 1B -128 127 Byte -128~127
3 char '\u0000' 2B '\u0000' '\uFFFF' Charactor (char)0~(char)127
4 short (short)0 2B -2^15 2^15-1(32767) Short -128~127
5 int 0 4B -2^31 2^31-1 Integer -128~127
6 long 0L 8B -2^63 2^63-1 Long -128~127
7 float 0.0f 4B 1.4e-45 3.4e+38 Float
8 double 0.0d 8B 4.9e-324 1.798e+308 Double
分类:
后端
标签: