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采用了特殊的算法以避免直接进行浮点数的计算。

三,类型转换

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)

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

强制类型转换规则如下:

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

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

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

在这里插入图片描述

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

其运行结果:

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

  1. 特例:当将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)快,因为它们不需要通过对象引用来访问值。
    在循环和频繁操作的代码块中,尽量使用基本数据类型以提高性能。

  • 避免类型转换

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS 块状元素

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

DevOps 温故知新

【引】伴随着微服务架构以及云技术的广泛使用,DevOps相应地引起了人们的关注,尤其在互联网企业展开了大量的探索和实践。去年赋闲在家的时候, 有幸精读了三本书,分别是《持续架构实践——敏捷和DevOps时代下的软件架构》&#xff…

vue 运行项目node-scss报错

vue项目node版本与自己电脑node版本不一样运行node导致报错 node-sass模块对node版本有兼容性,版本不适配,就容易报错 解决方案: 在项目目录下打开cmd: 输入命令: npm rebuild node-sass 然后再更新一下:…

重生奇迹mu剑士职业

1、剑士转职条件: 首先等级需要达到150级,在冰风谷寻找NPC圣导士《赛维娜》开启第一次转职任务,转职步骤分为两步,每完成一个步骤同时奖励10点属性点。 2、第一阶段: 与NPC圣导师赛维娜对话接取任务 2.领取任务后击…

SpringBoot报空指针错:java.lang.NullPointerException

虽然报空指针错误的原因可能有很多种,但是我还是写上我的报错原因,以此与各位共勉~ 在这里提前说一句,AI虽然强大,但是还是要谨慎使用啊(血的教训)~ 这里先截图我错误的地方: 前端能成功传进来值,后台控制…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作,本章我们针对增删查改内容进行与一些拓展, 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为: create table 表名 ( 字段名1 字段数据类型(数据类型长度), 字段名2 …

SpringAMQP 发布订阅-DirectExchange

DirectExchange: 路由模式模型 代码实现 直接通过注解方式绑定交换机和队列,这里边加了key也就是BingdingKey绑定key,可以看作交换机的路由规则,交换机收到消息后读取消息中指定的Routingkey发送到存有相应BingdingKey的队列中。 RabbitLis…

界面组件DevExpress Reporting中文教程 - 标记(可访问)PDF导出增强

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 可访问性支持在DevExpress这里仍然是一个高优先…

XR806开发板MQTT电源智能控制器

非常感谢这次极术社区,借助对Xr806开发板的试用,接触到了鸿蒙harmonyos,使用一定过程历时较长,也是一点点摸索,得到了很好学习机会。 社区里很多文章,感谢各位大佬的文章指点,本次试用主要是参考了两位大佬…

数据结构(二) 线性表

2024年5月13日一稿 线性表的定义与基本操作 数据类型相同(各个元素占用空间相同) 是有限序列 基操

武汉星起航:亚马逊店铺经营秘籍,揭秘提升点击率的关键策略

在竞争激烈的亚马逊电商平台上,提升点击率成为了每个卖家都渴望实现的目标。点击率不仅直接关系到商品的曝光度和销售量,更是衡量店铺经营效果的重要指标。那么,如何才能在众多商品中脱颖而出,吸引潜在买家的目光呢?武…

浏览器不兼容 replaceAll 方法问题解决

问题 在一些较旧版本的浏览器中可能会出现 replaceAll 方法不兼容,提示replaceAll 方法 undefined 的问题。浏览器版本兼容情况如下图所示: 解决 可以通过 replace 正则表达式 的方法来代替 replaceAll 方法: let str "我是一段文本…

【激活函数--下】非线性函数与ReLU函数

文章目录 一、非线性函数在神经网络中的重要性二、ReLU函数介绍及其实现2.1 ReLU函数概述2.2 ReLU函数的Python实现及可视化 一、非线性函数在神经网络中的重要性 在神经网络中,激活函数的选择对于网络的性能和能力至关重要。阶跃函数和Sigmoid函数除了是激活函数的…

想跨境出海?云手机提供了一种可能性

全球化时代,越来越多的中国电商开始将目光投向了海外市场。这并不是偶然,而是他们在长期的市场运营中,看到了出海的必要性和潜在的机会。 中国的电商市场无疑是全球最大也最发达的之一。然而,随着市场的不断发展和竞争的日益加剧…

300订单,成交大于一切

最近一直在忙于做老客户的需求,新客户挖掘方面有点大大的落后了,新客户的成交率接近0。 今天来了一个新客户,部署一套系统,我的正常报价都是300/次,至于为什么定这个价格后面再说,经过沟通客户没有服务器&…

【数据库】数据库指令

一。数据库打开 1.命令行 2.进入mysql mysql -uroot -p密码 3.退出 exit; 二。针对数据库的操作 1.创建数据库(有分号) create database student; 2.使用数据库 use student 3.删除数据库(有分号) drop database…

KNIME 报告扩展

文档对应的 KNIME AP 版本为 5.2 介绍 本指南介绍了 KNIME 报告扩展,并展示了如何创建简单和高级报告。 本指南更新于 2024/05/13,最新版请访问指北君网站 https://havef.fun/knime-cn/knime-doc/ KNIME 报告扩展允许您根据工作流程的结果创建静态报告。…

机器人系统ros2内部接口介绍

内部 ROS 接口是公共 C API ,供创建客户端库或添加新的底层中间件的开发人员使用,但不适合典型 ROS 用户使用。 ROS客户端库提供大多数 ROS 用户熟悉的面向用户的API,并且可能采用多种编程语言。 内部API架构概述 内部接口主要有两个&#x…

岩土工程监测仪器之一:振弦采集仪的工作原理解析

岩土工程监测仪器之一:振弦采集仪的工作原理解析 河北稳控科技振弦采集仪是岩土工程监测中常用的一种仪器,用于测量地面、结构物或其他物体的振动情况。它通过感应振弦的振动来获取相关的数据,进而分析和评估土壤、地基或结构物的稳定性和安…

hdfs块数据丢失(启动安全模式)

进入安全模式 hdfs dfsadmin -safemode退出安全模式 hdfs dfsadmin -safemode forceExit