由浅到深认识Java语言(4):数据类型

该文章Github地址:https://github.com/AntonyCheng/java-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(3):关键字&变量&常量

10.Java中的数据类型

整数类型

Q 1 . Q_1. Q1.对于一个整数,为什么 Java 会给出 int byte short long 四个选择:

A 1 . A_1. A1.在创建变量时,因为不同数据类型整数,开辟的空间大小是不一样的,所以就要根据实际的情况来决定开辟多少大小的空间,在实际情况允许下,开辟尽量小的空间,能够节省内存的开销;

实际情况:要存放在变量中的数值的大小;例如我们要存放的值最多不超过127,那么就可以使用byte去定义变量;

类型占用存储空间表数范围
byte1字节 − 128 ∼ 127 -128\sim127 128127
short2字节 − 2 15 ∼ 2 15 − 1 -2^{15}\sim2^{15}-1 2152151
int4字节 − 2 31 ∼ 2 31 − 1 -2^{31}\sim2^{31}-1 2312311
long8字节 − 2 63 ∼ 2 63 − 1 -2^{63}\sim2^{63}-1 2632631
float4字节 − 3.403 E 38 ∼ 3.403 E 38 -3.403E38\sim3.403E38 3.403E383.403E38
double8字节 − 1.798 E 308 ∼ 1.798 E 308 -1.798E308\sim1.798E308 1.798E3081.798E308
char2字节 0 ∼ 65535 0\sim65535 065535
boolean理论上 1/8 字节

一般情况下,对于整数来说我们都用 int

对于long类型的注意事项

当我们已经给一个 int 型变量赋值后,JVM 会默认给所有整数类型设置为 int 型,这是赋值一个 超过 int 型内存的 long 型的整数就会报错;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

报错反例

为了避免这样一个报错,我们需要在 long 型整数后面加上一个大写 L

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浮点数类型

JVM 默认的是 double ,如果想要 float 型浮点数,那么需要在浮点数后面加上 f

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浮点数反例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

浮点数举例
//在Java的浮点运算中,这三种的打印结果如下:
10.0/0.0  ==>  Infinity
-10.0/0.0 ==>  -Infinity
0.0/0.0   ==>  NaN

字符类型

char :一个字符型变量只能存放一个字符,不能存放多个字符;

字符类型用单引号包裹,字符串类型用双引号包裹;

注意:String 这个不是基础数据类型,而是引用数据类型;

强烈建议在程序中不要使用char类型,除非确实需要处理UTF-16代码单元,原因参考《Java核心技术 卷Ⅰ》

数据类型的转换

当不同数据类型变量之间进行运算时就会涉及到数据类型转换;

  • 自动类型转换

    容量小的数据类型允许被转换成容量大的数据类型,这一动作是自动完成的;

    容量大的数据类型不被允许转换成容量小的数据类型;

    这里的容量指的是数据类型的表数范围

    class demo{
        public static void main(String[] args){
            int a = 10;
            //long b = a; 自动类型转换成功
            //byte c = a; 自动类型转换失败
        }
    }
    

    自动转换的大小顺序

    byte
    short
    int
    char
    long
    float
    double

    但是这里要注意 byte short char :

    byte short char 之间进行运算时,会先转换成 int

    因为在 Java 中,整数类型默认的是 int 型,所以如果要如下运算就不行;

    byte a = 10;
    char b = a + 10;//a 是 byte ,10 默认的是 int ,int 的容量比 char 大,所以赋值会失败 
    char c = 10 + 20;//这里则能够将其看成 10+20 后自动转换成 char
    

    自动类型转换没有布尔值(boolean);

  • 强制类型转换

    如果容量大的数据转换成容量小的就必须得通过强转符 () 实现强制类型转换;

    double
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    解释:高位转 byte 是 -128~127 的循环;高位转 char 是对应的 ASCII 码,显然 199 超出了 ASCII 码范围;

数值类型之间的转换补充:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6个实线箭头,表示无信息丢失的转换,另外三个虚线箭头,表示可能有精度损失的转换;这九个箭头均表示可以进行数据类型的”自动“转换,但是不能逆箭头”自动“转换,或者无箭头”自动“转换,若需转换则应该使用强制转换的方式;

基本类型之间可以互相转换,转换结果无论错对,至少程序可以进行,但是引用类型之间的互相转换可能会报错;

大数

大数这个概念是第二次复习Java所补充的笔记,如果你是第一次看到这个笔记,那么请继续读下去,下面会对在此之前没有提到的概念进行说明;

这个元素确切来说并不是Java中的数据类型,但是它能够解决一些关键性的问题,比如当基本的整数和浮点数精度不能满足我们程序的要求时,我们就需要用到 java.math 包中的两个类(类这个概念后面会有介绍):BigInteger和BigDecimal,这两个类可以处理包含任意长度数字序列的数值,其中BigInteger类能实现任意精度的整数运算,BigDecimal类能实现任意精度的浮点数运算,大数可以使用valueOf()方法将整数和浮点数转换为大数类型:

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * @author AntonyCheng
 * @date 2022/8/28 17:32
 */

public class Demo {
    public static void main(String[] args) {
        int a = 100;
        double b = 200.2;
        BigInteger c = BigInteger.valueOf(a);
        BigDecimal d = BigDecimal.valueOf(b);
        System.out.println("c = " + c);
        System.out.println("d = " + d);
    }
}

当然,当我们需要更大的数据(像一个 long 都没办法表示的数据),我们可以使用一个带字符串(字符串这个引用数据类型在后面会有介绍)参数的构造器(构造器这个概念在后面会有介绍)创造出来:

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * @author AntonyCheng
 * @date 2022/8/28 17:32
 */

public class Demo {
    public static void main(String[] args) {
        BigInteger bigInteger = new BigInteger("99999999999999999999999999999999999");
        String a = bigInteger.toString();
        BigDecimal bigDecimal = new BigDecimal("99999999999999999999999999.9999999999999999");
        String b = bigDecimal.toString();
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

在大数类中的计算并不是我们平时那样直接用 + - * / 去计算,而是需要用到类中的方法(方法这个概念后面也会提到):

import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * @author AntonyCheng
 * @date 2022/8/28 17:32
 */

public class Demo {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("9999999999999999999999999999");
        BigDecimal b = new BigDecimal("1111111111111111111111111111");
        //大数之间相加
        BigDecimal addResult = a.add(b);
        System.out.println("addResult = " + addResult);
        //大数之间相减
        BigDecimal subtractResult = a.subtract(b);
        System.out.println("subtractResult = " + subtractResult);
        //大数之间相乘
        BigDecimal multiplyResult = a.multiply(b);
        System.out.println("multiplyResult = " + multiplyResult);
        //大数之间相除
        BigDecimal divideResult = a.divide(b);
        System.out.println("divideResult = " + divideResult);
    }
}

其实大数主要是用来处理浮点精度不准确问题的,例如2.0-1.9得到的结果并不是0.1,因为在二进制中无法整处理0.1;

上一章:由浅到深认识Java语言(5):运算符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值