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.mzph.cn/bicheng/12802.shtml

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

相关文章

线性/非线性最小二乘 与 牛顿/高斯牛顿/LM 原理及算法

最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min ||f(x)||2 若f(x) ax b,就是线性最小二乘;若f(x) ax2 b / ax2 bx 之类的,就是非线性最小二乘; 1. 求解线性最小二乘 【参考】 2. 求解非线性最小二乘…

[数据结构]红黑树的原理及其实现

文章目录 红黑树的特性红黑树的时间复杂度推导:结论红黑树与AVL树比较 红黑树的插入红黑树的节点定义调整策略思考情况2:思考情况3: 代码实现myBTRee.htest.cpp 红黑树的特性 红黑树最常用的平衡二叉搜索树。跟AVL树不同的是,红黑…

阻抗控制理解之逆动态控制律

具有六个自由度的二阶机械系统,其特征是给定的质量、阻尼和刚度,称为机械阻抗。 用于运动控制的加速度解决方法,它旨在通过逆动力学控制律在加速度水平上解耦和线性化非线性机器人动力学。在与环境存在交互作用的情况下,控制律 考…

代码托管(二)git(4)冲突解决

一、pull更新代码冲突 二、cherry-pick冲突 1、冲突演示 本地check out到当前分支,双击目标分支,选择需要cherry-pick的commit,右键选择cherry-pick。 (1)如果没有冲突,会自动add--》并自动commit&#…

Sam Blackshear谈Move语言的创新

Sui上的Move编程语言融合了三项基本创新:面向对象的数据模型、可编程交易区块和动态字段。Mysten Labs的联合创始人兼首席技术官Sam Blackshear在五年前创建了Move,这是一种专门为在区块链上编写智能合约而设计的语言。这三项在Sui上的创新提升了Move的潜…

【nfs服务部署服务端和客户端搭建】

原理 NFS(Network File System)是文件服务器之一。它的功能是可以通过网络,让不同的机器、不同的操作系统可以彼此共享数据文件。 NFS服务器可以让服务端的共享目录挂载到本地端的文件系统中,其他服务器如果想访问共享目录&#…

C++原型模式

原型模式实现方式 原型模式的结构 抽象原型类:规定了具体原型对象必须实现的接口。具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。访问类:使用具体原型类中的 clone() 方法来复制新的对象。 //父类 class Protot…

单链表经典算法 面试题--力扣02.04

链接:. - 力扣(LeetCode)【点击即可跳转】 思路:创建新链表:大链表和小链表 将pcur节点小于x的值,尾插在小链表中 将pcur节点大于或等于x的值,尾插在大链表中 最终---- return lessHead->…

护眼 保护眼睛

高度近视600度的我,花了4个月时间度数降了50度,又花了一个多月的时间,双眼50度散光清零了。 然后就有人问我:散光都可以恢复吗? 我有点被问懵了,散光难道不容易恢复吗?直到我在网上查了一下,才发…

vue3和vite

vue3 1、vue3使如何实现效率提升的 客户端渲染效率比vue2提升了1.3~2倍 SSR渲染效率比vue2提升了2~3倍 1.1、静态提升 解释&#xff1a; 1. 对于静态节点&#xff08;如&#xff1a;<h1>接着奏乐接着舞</h1>&#xff09;&#xff0c;vue3直接提出来了&#xff…

whisper使用

whisper使用 1. 直接调用 语音识别2. 语种识别 whisper.detect_language()和whisper.decode()3. 指定要识别的语种做语音识别**whisper 源码的transcribe函数** 函数解析1. transcript.py2. tokenizer.py3. audio.py4. __ init__.py github: https://gitcode.com/openai/whispe…

vue基础+高级用法

一、vue基础用法 mvvm的了解/认知 语义化模板mvc - model view controllermvvm - model view view-model vue是如何利用mvvm思想进行开发 双向数据绑定 花括号&#xff0c;构建了数据与视图的双向绑定通过视图绑定事件&#xff0c;来处理数据 生命周期-vue示例 建立&…

【JAVA进阶篇教学】第十六篇:Java中AOP使用

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十五篇&#xff1a;Java中AOP使用。 AOP&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它允许开发者在不修改源代码的情况下&#xff0c;对代码进行横切关注点的分离和增强。在 Java…

CNAME记录

CNAME记录 维基百科&#xff0c;自由的百科全书 &#xff08;重定向自CNAME&#xff09; 真实名称记录&#xff08;英语&#xff1a;Canonical Name Record&#xff09;&#xff0c;即CNAME记录&#xff0c;是域名系统&#xff08;DNS&#xff09;的一种记录。CNAME记录用于…

mysqldump: Error 2013 导致mysql停止运行

https://www.cnblogs.com/DataArt/p/10173957.html 1 查询表大小 SELECT table_name AS "表名", round(((data_length index_length) / 1024 / 1024), 2) AS "大小(MB)" FROM information_schema.tables WHERE table_schema your_database_name AND …

Togaf培训简介

Togaf简单讲 1.定义事物&#xff0c;方便大家互相理解 2.做好现状和愿景设计 3.做好现状到愿景的计划 1.togaf 首先是统一语言。大家互相能理解&#xff0c;比如各种定义。 togaf源自美国军方理论 2.没有架构设计&#xff0c;烟囱式系统是必然的。 就跟之前去政府办户籍一…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好&#xff0c;我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单&#xff0c;转化低的各种问题。 明明店铺的曝光不低&#xff0c;访客也不少&#xff0c;就是没转化。 下面我根据我们做店的经验&#xff0c;给大家分享一些问题所在&#xff0c;…

Git—安装及介绍

下载Git 官网地址&#xff1a;Git - Downloads (git-scm.com) 安装 双击安装包 点击 next 检查安装 桌面&#xff0c;右键鼠标&#xff0c;是否出现 Git GUI Here 和 Git Bash Here 打开Git Bash Here 输入命令 git --verison

NX/UG软件使用—策略OK回调环境变量

新建环境变量UGII_CAM_OPERATION_OK_EXIT&#xff0c;变量值为需要执行的xx.dll路径&#xff0c;设置后&#xff0c;重启NX&#xff0c;那么在每次点击策略OK之后&#xff0c;会自动执行xx.dll(注意这个dll需要在配置好的工具目录里&#xff0c;也就是说NX能手动加载这个dll)。…