wangjie-fourth 的个人博客

may be just need work hard

目录
java数据类型
/    

java数据类型

java数据类型包含:

  • 基本数据类型:8种
  • 引用数据类型:对象
  • 数组类型

一、基本数据类型

java一共有四大种8小种数据类型:4种整型、2种浮点型、1种字符串类型、1种布尔类型。基本数据类型是在栈中分配的,而引用类型是在堆里面分配空间的。

整数数据类型

1、简介

没有小数部分的数值,可以是负数。

int a = 10_0000_0000;//等价于1000000000
long b = 22_0000_0000;
2、分类
类型字节大小取值范围
byte1字节-128~127
short2字节正负3万左右
int4字节正负20亿左右
long8字节很大
  • long 类型数据后缀 L 不要忘记
  • byte 类型数据注意它的范围

浮点数据类型

1、简介

用于表示含小数的数值

2、分类
类型字节大小取值范围
float4字节有效位数6位
double8字节有效位数15位
  • double表示的数值精度是float的俩倍,所以又被称为双精度数值。
  • float类型的数值后面要加一个后缀F。如3.14F
  • double类型的数值可以不加后缀,也可以加后缀D。如3.14D
3、近似表示

十进制中,许多小数是无法用二进制来表示的,只能用近似表示。比如计算机在计算:

0.1 + 0.2 = 0.30000000000000004; // 这就是因为近似表示的原因。

由于近似表示,我们需要注意浮点数可以比较大小,但不能使用 ==来比较相等。原因就是由于近似表示,可能会使我们程序逻辑失效。这时候,需要使用Math类来比较:

    float a = 0.1f;
    float b = 0.1f;

    if (Math.abs(a - b) < 0.0000001){
        System.out.println("a 与 b 相等");
       }
4、BigDecimal对象

由于浮点数类型不适合比较、不适合出现舍入误差计算中。比如说:System.out.println(2.0-1.1)结果是0.8999999999999999,而不是0.9。主要原因是浮点数值是采用二进制系统表示,而在二进制系统中无法精确表示分数1/10。就好像十进制中无法精确表示1/3。如果数值计算中需要不含任何的舍入误差,应使用BigDecimal类。

字符类型

1、简介

表示Unicode编码的字符单元,通常用来表示字符常量。字符类型可以当作数字来比较。
charjava中是2个字节。 java采用unicode2个字节(16位)来表示一个字符。

布尔类型

1、简介

布尔类型有俩个值:falsetrue。注意:

void类型

void其实也算一种数据类型,它其实在虚拟机中都有指定类型表示。

Class voidClass = void.class;

基本数据类型默认赋值

  • 如果是整数类型,默认为0
  • 如果是浮点类型,默认为0.0
  • 如果是字符类型,默认为\u0000
  • 如果是布尔类型,默认为false
  • 如果是引用类型,默认为null

二、基本数据类型转换

8种基本数据类型中除了boolean类型数据,其他数据类型可以相互转换。
数据类型转换分为俩种:

  • 自动类型转换(隐式):低精度类型 转 高精度类型;小范围转大范围;
  • 强制类型转换(显示):高精度类型 转 低精度类型;大范围转小范围;

自动类型转换

自动类型转换发生在低精度类型 转 高精度类型,比如说:intdouble。在俩个不同基本类型的值操作的时候,有时就发生转换:

  • 如果其中有一个操作数是double,另一个操作数要先转换为double
  • 否则,如果其中有一个操作数是float,另一个操作数要先转换为 float
  • 否则,如果其中有一个操作数是long,另一个操作数要先转换为 long
  • 否则,俩个操作数都会转换为int类型;

常见的坑有:

  public static void main(String[] args) throws IOException {
      System.out.println("result = " + divide(3,2));//1.0
  }
  static double divide(int a,int b){
      /*
       \* 等价于:
       \*         double result = a / b;
       \*        return result;
       */
      return a/b;
      // return 1.0 * a / b;
  }

强制类型转换

强制类型转换发生在将大的数据类型转换为小的数据类型。比如说:doubleint。这时候,可能会发生数据溢出

三、基本包装类

所有的包装类都是不可变对象,都是final的。
| 基本类型 | 对应的包装类 |
| :------: | :----------: |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |

int 转 Integer优化

int基本数据类型数据会自动装箱到Integer,而每次装箱都new一个对象的话,可能有点浪费空间。
所以,JDK默认基本数据为-128 ~ 127之间的数据,装箱到一个缓存中,如果以后还有相同的数字想转成Integer的话,就默认从缓存中获取。

public static void main(String[] args) {
      Integer a = 1;
      Integer b = 1;
      System.out.println(a);
}

四、数组类型

数组类型在jdk是一种特殊的类型,你看不到它的定义,但仍然可以使用它。它是由jdk根据特殊的指令来创建的。它主要特性有:

  • 长度不可变
  • 类型安全
  • 只有一个length属性
  • 可以使用for循环迭代它
    public static void main(String[] args) {
        int[] a = new int[]{1,2,3};
    }

可以理解成jdkJVM中为你创建int[]类型的字节码文件,这个类型有length属性。只不过它是由jdk为你创建的。

1、为什么我从来没有见过数组的定义?
数组是JVM提供的虚拟机级别的支持,有对应的字节码,但无java源码;比如说在字节码层面上,数组也是一个对象,也有length属性。

2、为什么说数组是真泛型,而泛型是假泛型?

  • 真泛型是指在运行时,会有类型信息;
  • 假泛型是指在运行时,没有类型信息;
String[] a = new String[10];
Object[] b = a;
b[0] = new Object();//这里就会因为类型不同,而抛出异常
评论