Java数据类型:基本数据类型

Java是一种强类型语言,定义变量时,必须指定数据类型。

// 变量必须指定数据类型
private String username;

初学者不免有个疑问:在实际编写代码的过程中,该如何选择数据类型呢?

回答这个问题之前,先来解决下面两个问题:

①Java中的数据类型有什么作用?
②Java有哪些数据类型呢?

一,数据类型的基本概念

1,定义

  • 数据类型是变量的属性
  • 决定了变量可以存储的数据的种类以及这些数据如何被操作

2,为什么要区分数据类型

Java是一门工业级的高级程序语言,区分不同的数据类型出于以下几个核心原因:

  • 内存效率:不同类型的数据需要不同的存储空间。例如,一个byte类型只需1字节的存储空间,而一个int类型需要4字节。这种区分允许程序仅使用必要的内存空间,从而节省资源,提高效率。

  • 精确表达数据:每种数据类型都有其特定的取值范围和精度。例如,float类型用于存储近似的小数,而double提供更高的精度。boolean类型则用于逻辑判断,只有truefalse两个值。通过精确匹配数据类型与数据需求,可以确保数据的准确表达和处理。

  • 安全性:类型检查机制是Java的一大特色。编译器会检查数据类型的正确性,防止不恰当的类型使用,如将字符串与整数进行算术运算,这会在编译阶段报错,避免了运行时错误。

  • 性能优化:不同的数据类型支持不同的操作集。例如,整型数据支持位操作,而浮点型则不支持。区分数据类型可以让编译器生成更优化的代码,利用特定类型的特性进行高效运算。

  • 清晰的代码可读性:通过数据类型命名,程序员可以直观地了解变量的用途和它可以存储的值的范围,这提高了代码的可读性和可维护性。

  • 面向对象编程的支持:Java是一种面向对象的语言,区分数据类型有助于实现面向对象的原则,如封装、继承和多态。基本类型可以被视为简单对象,而引用类型则用于复杂的对象操作,这符合面向对象设计的思想。

  • 避免数据溢出和精度损失:通过为不同大小和精度的数据指定不同类型,可以在设计时预防数据溢出(如将过大的数存储在int类型中)和精度损失(如使用float进行高精度计算)的问题。

3,分类

Java中的数据类型分为两类:

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

基本数据类型是Java语言预先定义的,它们不是对象,而是直接存储值。这篇文章仅介绍基本数据类型。

二,基本数据类型

1,分类

基本数据类型可以分为四类

  • 整数,包括 byte、short、int、long
  • 浮点数,包括double、float
  • 字符,仅有一个char类型
  • 布尔类型,仅有一个boolean类型
    在这里插入图片描述

2, 整型(Integer Types)

整型用于存储整数,主要有以下几种:

  • byte: 占1字节,范围-128到127
  • short: 占2字节,范围-32,768到32,767
  • int: 占4字节,是Java中最常用的整数类型,范围-231到231-1,能存储的数据范围大约是正负21亿
  • long: 占8字节,用于需要更大数值的情况,范围-263到263-1。能存储的数据范围大约是正负9千万亿long的数值范围远超int,适用于需要存储极大整数的场景。定义long常量时需以Ll结尾,以区分int,推荐以L结尾,避免与数字1混淆。

在这里插入图片描述

byte b = 100; // 正确
// byte bError = 128; // 错误:超出byte范围short s = 30000; // 正确
// short sError = 32768; // 错误:超出short范围int i = 2_147_483_647; // 使用下划线增加可读性
// int iError = 2_147_483_648; // 错误:超出int范围long l = 9_223_372_036_854_775_807L; // long需加L/l

3, 浮点型(Floating-Point Types)

浮点型用于存储小数,主要有:

  • float: 占4字节,大约有6-7位有效数字
  • double: 占8字节,精度更高,约有15位有效数字,是Java中的默认浮点类型。doublefloat提供更高的精度,更适合需要高精度计算的场景。

在这里插入图片描述

float f = 3.14f; // 需要f/F后缀
// float fError = 1.0E39f; // 错误:超出float表示范围double d = 3.141592653589793; // 不需要后缀,默认为double
// double dError = 1.0E309 + 1; // 错误:超出double表示范围

计算机在处理浮点数的计算时,容易出现误差,对于财务计算等精确度要求极高的情况,最佳实践是使用BigDecimal以避免浮点数运算的误差。BigDecimal采用了特殊的算法以避免直接进行浮点数的计算。

4,布尔类型(boolean)
在Java中,布尔数据类型的关键字是boolean,布尔类型的值只能是true或者false

boolean isTrue = true;
boolean isFalse = false;
System.out.println(isTrue);   // 输出:true
System.out.println(isFalse);  // 输出:false

布尔数据类型常用于条件判断语句中,例如if语句和while循环等。通过判断布尔值的真假,来决定程序的执行路径。

boolean isSunday= true;
if (isSunday) {System.out.println("今天是星期天");
} else {System.out.println("今天不是星期天");
}

布尔数据类型是高频使用类型,布尔值控制程序的行为,从而实现复杂的逻辑。

4,字符类型(char)

在Java中,字符数据类型的关键字是char,字符变量值用单引号包围。

char ch1 = 'A';
char ch2 = 'B';
System.out.println(ch1);  // 输出:A
System.out.println(ch2);  // 输出:B

除了使用单个字符外,还可以使用转义序列来表示特殊字符,例如换行符(\n)、制表符(\t)等。

char newLine = '\n';
char tab = '\t';
System.out.println("Hello" + newLine + "World");
System.out.println("Java" + tab + "Programming");

字符数据类型也支持直接使用Unicode编码来表示字符,使用反斜杠u后面跟上4位16进制数字。

char chineseChar = '\u4E2D';  // 表示中字
System.out.println(chineseChar);  // 输出:中

字符数据类型可以与整数数据类型互相转换,字符数据类型的底层存储是Unicode字符编码的整数值。

char ch = 'A';
int asciiValue = ch;  // 将字符转换为ASCII值
System.out.println(asciiValue);  // 输出:65
int intValue = 66;
char character = (char) intValue;  // 将ASCII值转换为字符
System.out.println(character);  // 输出:B

需要注意的是,字符数据类型只能用于表示单个字符,不能表示字符串。如果需要表示多个字符,应使用字符串数据类型(String)

三,类型转换

1,什么是数据类型转换

在进行数学运算、比较或者赋值等操作时,如果参与操作的数据类型不一致,Java会如何处理呢?

Java要求这些数据必须转换为相同的类型才能进行运算

例如,当你尝试将一个int类型的值与一个double类型的值相加时,int值会被自动转换为double,因为double的精度更高。

这就是Java的数据类型转换

2,如何进行类型转换

Java支持①自动类型转换(也称为隐式类型转换)(例如,byteint)和②强制类型转换(也称为显式类型转换)(如,(int) longValue)。

3, 自动类型转换(Auto Widening Conversion)

自动类型转换是指Java编译器在没有明确指示的情况下,自动将小范围的数据类型提升为大范围的数据类型,这通常是安全的,不会导致数据丢失。

自动类型转换遵循以下规则:

数据类型层次:Java的数据类型按照其存储容量从低到高排列为:byte -> short -> char -> int -> long -> float -> double。自动类型转换时,左边的类型自动提升为右边的类型,比如 int 可以提升为 double,但不会出现反方向的自动转换,即double 不可能自动转换为 int。注意,char可以直接转换为int,因为它们都代表整数。

兼容性:转换的类型必须是兼容的,即目标类型能够容纳源类型的值。例如,一个int值可以自动转换为long,因为long的范围比int

布尔型boolean类型与其他基本类型不兼容,不能进行自动转换

4,强制类型转换(Explicit Narrowing Conversion)

当目标类型小于源类型时,自动类型转换无法进行,此时就需要使用强制类型转换。

强制类型转换规则如下:

  • 显式声明:需要使用括号明确指定转换的目标类型,例如(int)longValue(longValue是一个long类型变量)。

  • 数据丢失风险:由于目标类型可能无法完全容纳源类型的所有可能值,强制类型转换可能会导致数据丢失或精度降低。例如,将double转换为float可能会丢失小数部分的精度。

        double a = 3.141593300001;// 有12小数,超出float表达范围float b = (float) a; // 强制转换后,后五位会被丢弃,出现精度损失System.out.println(b+"");

在这里插入图片描述

  • 范围检查:在进行强制类型转换前,开发者应确保源类型值的范围能够被目标类型安全地表示。如果超出目标类型的范围,可能会导致数据溢出,代码可以正常运行,但有可能出现不可以预知的结果。
        int a = 300000;// 超出short的最大值32767short b = (short) a;System.out.println(b+"");

运行结果:

在这里插入图片描述
强制转换后,变量b的值是-27680,原因是4字节的变量值强制转换为2字节的变量时,只截取了其中一部分,导致结果出现差异。

  • 特例:当将floatdouble转换为intlong时,小数部分会被直接丢弃(截断),而不是四舍五入。
       double a = 3.14159;// 有小数short b = (short) a; // 强制转换后,小数被丢弃System.out.println(b+""); // 打印 "3"

在这里插入图片描述

示例

// 自动类型转换示例
byte b = 100;
int i = b; // 自动从byte转换为int// 强制类型转换示例
double d = 123.45;
int i = (int) d; // 强制从double转换为int,小数部分丢失

四,如何选择基本数据类型

基于上面的学习,在编写Java代码时,选择合适的基本数据类型就有了理论依据。

选择Java基本数据类型,通常考虑如下几个方面:

  • 数据的用途和所需表达的值的范围

    如果数据是整数且在-128到127之间,byte可能是最佳选择;如果需要表示较大的整数,则考虑intlong

  • 精度要求

    对于浮点数,如果需要高精度计算(如财务计算),使用BigDecimal而非floatdouble,因为后者会有精度损失。对于一般科学计算,double足够使用。

  • 类型兼容性和运算规则

    当不同类型的数据进行运算时,Java会自动将较小类型转换为较大类型。理解这些规则有助于避免不必要的类型转换,比如知道intlong运算时,int会被自动提升为long

  • 性能考虑

    基本数据类型的操作通常比对象类型(如Integer)快,因为它们不需要通过对象引用来访问值。
    在循环和频繁操作的代码块中,尽量使用基本数据类型以提高性能。

  • 避免类型转换

    尽量减少不必要的类型转换,特别是强制类型转换,因为这可能导致数据丢失或异常。在设计阶段就做好类型规划,以减少转换的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/703266.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建智能制造时代的制造行业数据中台总体架构

随着数字化技术的快速发展和智能制造的兴起,制造行业正面临着前所未有的机遇和挑战。在这一背景下,构建制造行业数据中台成为推动制造业转型升级的重要战略举措。本文将深入探讨制造行业数据中台的总体架构,助力制造企业把握数字化转型的主动…

vsCode 设置上下级文件夹目录分离展示?

默认情况下,vsCode目录文件夹会使用/合并展示在一行,这样视觉上看着并不直观,设置目录文件分离展示方法如下: 1、点击左下角设置图标,点击setting; 2、搜索栏输入compact; 3、取消勾选第一个选…

MySQL存储引擎介绍

查看MySQL数据库中创建表的信息 如上图所示,当我们使用命令show create table server_info\G;可以显示我们所创建的表的信息,只显示两个字段,第一个字段是Table 即是创建的表的名称,第二个字段是Create Table即是创建的表的字段的…

Spring Boot集成activiti快速入门Demo

1.什么事activiti? Activiti是一个工作流引擎,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程流activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系…

东方伟大思想家和哲学家颜廷利:有形的财富越与无形的财富

在世界的广阔舞台上,财富常被看作衡量国家与民族成就的重要尺度。然而,在物质和精神的天平上,真正具有深远意义的,往往是后者的累积与扩散。正如东方哲学的现代诠释者、当代中国教育界的杰出教授颜廷利所阐述,“有形的…

【C语言每日题解】输入n(1~9),再输入n个长度不超过50的字符串,给这n个字符串排序并输出它们

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🌈感谢大家的阅读、点赞、收藏和关注 解题思路: 首先:使用一个二维字符数组来存储输入的字符串。由于n的范围是1到9,我们可以直接定义一…

实锤,阿里云盾会拦截百度云防护的IP!

今天凌晨,一位站长联系上云加速客服,反馈说,网站突然出现了502的情况。 在检查云防护子域名配置没有问题、本地强制回源没有问题的情况下,我们得出结论是要么服务器内防火墙拦截了云防护的IP段,要么服务器商拦截了云防…

使用make_blobs生成数据并使用KNN机器学习算法进行分类和预测以及可视化

生成数据 使用make_blobs生成数据并使用matplotlib进行可视化 完整代码: from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklea…

【保姆级介绍自动化的讲解】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

泰盈科技IPO终止:客户集中度高,业绩未达目标,高管薪酬较高

近日,上海证券交易所披露的信息显示,泰盈科技集团股份有限公司(下称“泰盈科技”)及其保荐人中金公司撤回上市申请文件。因此,上海证券交易所决定终止对该公司首次公开发行股票并在主板上市的审核。 据贝多财经了解&am…

GIN框架_请求参数

请求参数 1. Get请求参数 使用Get请求传参时,类似于这样 http://localhost:8080/user/save?id11&namezhangsan。 如何获取呢? 1.1 普通参数 request url: http://localhost:8080/user/save?id11&namezhangsan r.GET("/user/save&qu…

第四篇 Asciidoc - MindMap 思维导图 不是事

MindMap 是一种对思维的简单抽象,说到底,就是一个树状结构。 以下是一个样例: Figure 1. MindMap示例 我们的目录结构、模块结构、分类结构等等,都是树型结构,它非常普遍,因此 MindMap 是笔记软件中,获得最多支持的一种图。 精确地说,这类图,是对思维结构的一种映射…