(三)Java 基本数据类型

目录

一. 前言

二. 基本数据类型

2.1. char(字符型)

2.2. byte(字节型)

2.3. short(短整型)

2.4. int(整型)

2.5. long(长整型)

2.6. float(单精度浮点型)

2.7. double(双精度浮点型)

2.8. boolean(布尔型)

三. 类型转换

3.1. 自动转换

3.2. 强制转换

3.3. 类型自动提升

3.4. 自动装箱和自动拆箱

四. 实例

五. 引用类型

六. Java 常量


 

一. 前言

    Java 是一门强类型的编程语言,所有的变量必须显式声明数据类型。Java 中定义了多种数据类型,根据数据的特点,数据类型分为两大类:基本数据类型和引用数据类型(简称引用类型)。

Java 中数据类型的分类如下图所示:

231f9d9dfd834ff99b04b4d98deed084.gif

二. 基本数据类型

    变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。

    基本数据类型包括 4 类 8 种,4 类分别是整数类型、浮点类型、字符类型和布尔类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

数据类型占用字节默认值包装类
char(字符型)1\u0000Character
byte(字节型)10Byte
short(短整型)20Short
int(整型)40Integer
long(长整型)80LLong

float

(单精度浮点型)

40.0fFloat

double

(双精度浮点型)

80.0dDouble
boolean(布尔型)1falseBoolean

注意:在 Java 中,整形和浮点型都是有符号的。

2.1. char(字符型)

  1. char 类型是一个单一的16位 Unicode 字符;
  2. 最小值是 ’\u0000’(即为 0);
  3. 最大值是 ’\uffff’(即为65,535);
  4. char 数据类型可以储存任何字符;
  5. 例子:char letter = ‘A’。

2.2. byte(字节型)

  1. byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  2. 最小值是 -128(-eq?2%5E%7B7%7D);
  3. 最大值是 127(eq?2%5E%7B7%7D-1);
  4. 默认值是 0;
  5. byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
  6. 例子:byte a = 100,byte b = -50。

2.3. short(短整型)

  1. short 数据类型是16位、有符号的以二进制补码表示的整数
  2. 最小值是 -32768(-eq?2%5E%7B15%7D);
  3. 最大值是 32767(eq?2%5E%7B15%7D - 1);
  4. short 数据类型也可以像 byte 那样节省空间。一个 short 变量是 int 型变量所占空间的二分之一;
  5. 默认值是 0;
  6. 例子:short s = 1000,short r = -20000。

2.4. int(整型)

  1. int 数据类型是 32 位、有符号的以二进制补码表示的整数;
  2. 最小值是 -2,147,483,648(-eq?2%5E%7B31%7D);
  3. 最大值是 2,147,483,647(eq?2%5E%7B31%7D - 1);
  4. 一般地整型变量默认为 int 类型;
  5. 默认值是 0;
  6. 例子:int a = 100000, int b = -200000。

2.5. long(长整型)

  1. long 数据类型是 64 位、有符号的以二进制补码表示的整数;
  2. 最小值是 -9,223,372,036,854,775,808(-eq?2%5E%7B63%7D);
  3. 最大值是 9,223,372,036,854,775,807(eq?2%5E%7B63%7D -1);
  4. 这种类型主要使用在需要比较大整数的系统上;
  5. 默认值是 0L;
  6. 例子:long a = 100000L,long b = -200000L。

2.6. float(单精度浮点型)

  1. float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;
  2. float 在储存大型浮点数组的时候可节省内存空间;
  3. 默认值是 0.0f;
  4. 浮点数不能用来表示精确的值,如货币;
  5. 例子:float f1 = 234.5f。

2.7. double(双精度浮点型)

  1. double 数据类型是双精度、64位、符合 IEEE 754 标准的浮点数;
  2. 浮点数的默认类型为 double 类型;
  3. double 类型同样不能表示精确的值,如货币;
  4. 默认值是 0.0d;
  5. 例子:double d1 = 123.4。

2.8. boolean(布尔型)

  1. boolean 数据类型表示一位的信息;
  2. 只有两个取值:true 和 false;
  3. 这种类型只作为一种标志来记录 true / false 情况;
  4. 默认值是 false;
  5. 例子:boolean one = true。

三. 类型转换

在 Java 中,将一种类型的值赋值给另一种类型是很常见的。boolean 类型与其他7种类型的数据都不能进行转换,char 类型不支持自动转换成它,只支持强制转换,除了这两种类型有些特殊以外,其他 6 种数据类型,它们之间都可以进行相互转换,只是可能会存在精度损失。

将 6 种数据类型按取值范围的大小顺序排列一下:

double > float > long > int > short > byte

取值范围从小转换到大,是可以直接转换的,而从大转成小,或转成 char 类型,则必须使用强制转换。

3.1. 自动转换

    自动转换时会进行扩宽(widening conversion)。因为较大的类型(如 int)要保存较小的类型(如 byte),取值范围是足够的,不需要强制转换。

    在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他类型的自动转换不会出现精度损失:

  1. int --> float
  2. long --> float
  3. long --> double
  4. float --> double

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

3.2. 强制转换

    如果要把大的转成小的,或者在 short 与 char 之间进行转换,就必须强制转换。这也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。

强制转换的格式和实例如下:

(target-type) value;// 实例
long lo = 99;
int i = (int) lo;

    严格地说,byte 转为 char 不属于(narrowing conversion),因为从 byte 到 char 的过程其实是 byte --> int --> char,所以 widening 和 narrowing 都有。

强制转换可能会损失精度,主要有两种场景:

  1. 整数类型之间相互转换,如果整数超出目标类型范围,会对目标类型的范围取余数。
  2. 从浮点类型转成整数类型,会发生截尾(truncation),也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。 

3.3. 类型自动提升

在表达式计算过程中会发生类型转换,这些类型转换就是类型提升,类型提升规则如下:

  1. 所有 byte / short / char 的表达式都会被提升为 int;
  2. 除以上类型,其他类型在表达式中,都会被提升为取值范围大的那个类型,例如有一个操作数为 double,整个表达式都会被提升为 double。 

3.4. 自动装箱和自动拆箱

    Java 是面向对象语言,其概念为一切皆为对象,但基本数据类型是个例外。基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,对于声明在方法中的基本类型变量,它存放于“栈”中而不是存放于“堆”中。这有很多好处,例如不需要和对象一样需要在堆中分配内存,然后搞个引用指向它。不需要 GC,因为是直接在栈上分配空间,方法运行结束就出栈回收掉了。可以放心的使用最基本的运算符进行比较和计算等等。

    没有什么是完美无缺的,数据类型也有缺点,例如会自动设置默认值(这是双刃剑,一些场景下会增加额外的处理逻辑),不支持泛型等。

    Java 希望使用一切皆为对象的理念来统一语言设计,但基本类型确实有很多优点和使用场景,鱼和熊掌我就要兼得之!所以它为每一个基本类型都提供了相应的包装类,封装了很多实用的方法,最重要的是,提供了自动装箱和自动拆箱的语法糖,让开发者可以无感知的在包装类型和基础类型之间来回切换。

四. 实例

    对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:

public class PrimitiveTypeTest {public static void main(String[] args) {// byteSystem.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);System.out.println("包装类:java.lang.Byte");System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);System.out.println();// shortSystem.out.println("基本类型:short 二进制位数:" + Short.SIZE);System.out.println("包装类:java.lang.Short");System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);System.out.println();// intSystem.out.println("基本类型:int 二进制位数:" + Integer.SIZE);System.out.println("包装类:java.lang.Integer");System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);System.out.println();// longSystem.out.println("基本类型:long 二进制位数:" + Long.SIZE);System.out.println("包装类:java.lang.Long");System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);System.out.println();// floatSystem.out.println("基本类型:float 二进制位数:" + Float.SIZE);System.out.println("包装类:java.lang.Float");System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);System.out.println();// doubleSystem.out.println("基本类型:double 二进制位数:" + Double.SIZE);System.out.println("包装类:java.lang.Double");System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);System.out.println();// charSystem.out.println("基本类型:char 二进制位数:" + Character.SIZE);System.out.println("包装类:java.lang.Character");// 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台System.out.println("最小值:Character.MIN_VALUE="+ (int) Character.MIN_VALUE);// 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台System.out.println("最大值:Character.MAX_VALUE="+ (int) Character.MAX_VALUE);}
}

编译以上代码输出结果如下所示:

基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535

    Float 和 Double 的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示 E 之前的数字要乘以 10 的“数字”次幂。比如 3.14E3 就是 3.14×1000=3140,3.14E-3 就是3.14/1000=0.00314。

    实际上,JAVA 中还存在另外一种基本类型 void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。

五. 引用类型

  1. 引用类型变量由类的构造函数创建,可以使用它们访问所引用的对象。这些变量在声明时被指定为一个特定的类型,比如 Employee、Pubby 等。变量一旦声明后,类型就不能被改变了。
  2. 对象、数组都是引用数据类型。
  3. 所有引用类型的默认值都是 null。
  4. 一个引用变量可以用来引用与任何与之兼容的类型。
  5. 例子:Animal animal = new Animal(“giraffe”)。

六. Java 常量

常量就是一个固定值。它们不需要计算,直接代表相应的值。

常量指不能改变的量。 在 Java 中用 final 标志,声明方式和变量类似:

final double PI = 3.1415927;

虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量

字面量可以赋给任何内置类型的变量。例如:

byte a = 68;
char a = 'A'

byte、int、long、和 short 都可以用十进制、16进制以及8进制的方式来表示。

当使用常量的时候,前缀0表明是8进制,而前缀 0x 代表16进制。例如:

int decimal = 100;
int octal = 0144;
int hexa = 0x64;

和其他语言一样,Java 的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:

"Hello World"
"two\nlines"
"\"This is in quotes\""

字符串常量和字符常量都可以包含任何 Unicode 字符。例如:

char a = '\u0001';
String a = "\u0001";

Java 语言支持一些特殊的转义字符序列:

符号字符含义
\n换行 (0x0a)
\r回车 (0x0d)
\f换页符(0x0c)
\b退格 (0x08)
\0空字符(0x0)
\s字符串
\t制表符
\"双引号
\'单引号
\\反斜杠
\ddd八进制字符 (ddd)
\uxxxx16进制Unicode字符 (xxxx)

 

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

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

相关文章

前端如何设置模板参数

1.背景: 最近接到一个需求,在一个类似chatGpt的聊天工具中,要在对话框中设置模板,后端提供了很多模板参数,然后要求将后端返回的特殊字符转成按钮,编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…

C++ 类模板

目录 前言 类模板语法 类模板和函数模板的区别 类模板没有自动类型推导的使用方式 类模板在模板参数列表中可以有默认参数 类模板中成员函数创建时机 类模板对象做函数参数 指定传入的类型 参数模板化 整个类模板化 类模板与继承 类模板成员函数类外实现 类模板分…

在Spring Cloud中使用OpenFeign完成从一个微服务上传到另一个微服务中

跨服务上传文件,嘿嘿,来一篇实用性高的,本篇将主要完成在Feign中上传文件到另一个微服务中。步骤如下: 我们需要在服务提供者和服务消费者的项目中添加相应的依赖: 对于服务提供者的项目,你需要添加Sprin…

Redis设计与实现之集合及有序集

目录 一、集合 1、编码的选择 2、编码的切换 3、 字典编码的集合 4、集合命令的实现 5、 求交集算法 6、求并集算法 7、 求差集算法 二、有序集 1、编码的选择 2、编码的转换 3、ZIPLIST 编码的有序集 4、SKIPLIST 编码的有序集 三、如何添加元素到集合或有序集中…

万兆网络之屏蔽线序接法(中)

在介绍优质网线选购之前,先简单介绍一下水晶头 1毛钱一颗跟1元一颗的水晶头,往往是金手指厚度差别,你可以想象压制的时候可能会有什么情况 另外,一些3元一颗的镀金水晶头会有15U、30U之类的是电镀厚度单位,数值越大镀…

文档安全加固:零容忍盗窃,如何有效预防重要信息外泄

文档安全保护不仅需要从源头着手,杜绝文档在使用和传播过程中产生的泄密风险,同时还需要对文档内容本身进行有效的保护。为了防范通过拷贝、截屏、拍照等手段盗窃重要文档内容信息的风险,迅软DSE加密软件提供了文档加密保护功能,能…

10 新字符设备驱动文件

一、新字符设备驱动原理 因为 register_chrdev 和 unregister_chrdev 两个函数是老版本驱动文件,现在可以用新字符设备驱动 API 函数。 1. 分配和和释放设备号 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可,但是这样会带来两…

信息安全和网络安全的区别

信息安全与网络安全都属于安全领域,但它们的范围和重点不同。 信息安全主要关注数据的保护,包括对敏感数据进行加密、防止数据丢失或泄露等措施。信息安全通常与数据存储、传输和处理相关。 而网络安全更侧重于保护计算机系统和网络免受攻击、病毒、蠕…

Mac安装软件显示文件已损坏处理方法

今天安装软件,突然遇到了文件已损坏,扔到废纸篓的情况,于是搜索了下解决办法,跟大家分享下,希望对你有所帮助 一、检查安全性设置 打开【设置】-【隐私与安全】,下拉找到安全性,将安全性更改为…

System作为系统进程陔如何关闭?

一、简介 system进程是不可以关闭的,它是用来运行一些系统命令的,比如reboot、shutdown等,以及用来运行一些后台程序,比如ntfs-3g、v4l2loopback等。system进程也被用于运行一些内核模块,比如nvidia、atd等。system进程…

mars3d加载arcgis发布的服务,⽀持4523坐标

问题 1.从这个服务地址加载,具体在哪⾥去转坐标呢? 加个 usePreCachedTilesIfAvailable:false 参数即可 坐标系为4490的arcgis影像服务图层,配置后瓦片加载不出来,没报错 甚至可以跳转 没有看出问题,或者测…

linux系统启动时运行web程序

1.修改rc.local文件 执行命令如果找不到会报错command not found ,使用全路径即可 找不到的话 可以使用which 命令 找到路径 后台查看执行日志 2.修改rc.local文件的权限 chmod x rc.local 然后reboot 可以查到进程和启动日志

vue3:直接修改reative的值,页面却不响应,这是什么情况?

目录 前言: 错误示范: reactive() 的局限性 解决办法: 1.使用ref 2.reative多套一层 3.使用Object.assign 前言: 今天看到有人在提问,问题是这样的,我修改了reative的值,数据居然失去了响…

YOLOv5改进 | 注意力篇 | DAttention (DAT)注意力机制实现极限涨点

一、本文介绍 本文给大家带来的是YOLOv5改进DAT(Vision Transformer with Deformable Attention)的教程,其发布于2022年CVPR2022上同时被评选为Best Paper,由此可以证明其是一种十分有效的改进机制,其主要的核心思想是:引入可变形…

微信小程序置顶导航,替代原生导航栏

效果图&#xff1a; 思路&#xff1a;Navigation是小程序的顶部导航组件&#xff0c;当页面配置navigationStyle设置为custom的时候可以使用此组件替代原生导航栏&#xff0c;wx.getSystemInfoSync获取可使用窗口高度 wxml代码&#xff1a; <!-- 头部 --> <view cla…

【docker】部署minio对象存储并用rclone同步

docker部署minio对象存储并用rclone同步 本文首发于 ❄️慕雪的寒舍 1.什么是minio&#xff1f; minio是一个开源的对象存储服务器&#xff0c;兼容S3协议。 官网&#xff1a;https://min.io/ 官方在开源的基础上也提供云端S3服务&#xff0c;分为个人和企业&#xff0c;有不…

【MySQL】图形化界面工具 DataGrip

使用 dataGrip: 1.添加数据源 2.连接本地数据库 user 是 root 密码是 123456 3.展示所有数据库 4.创建数据库 5.创建表 6.修改表 在需要修改的表上&#xff0c;右键选择 "Modify Table..." 如果想增加字段&#xff0c;直接点击号&#xff0c;录入字段信息&#x…

前端面试(5)

1、移动端适配 1.1、设置meta缩放比例&#xff0c;将设备窗口调整为设计图大小。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-sc…

MetaAI发布Seamless:两秒内实现跨语言同声传译

在当今日益互联的世界中&#xff0c;语言差异常常成为沟通的障碍。MetaAI最新发布的语音翻译大模型Seamless&#xff0c;正是为打破这一障碍而生。Seamless不仅提供流畅、高效的多语言翻译功能&#xff0c;更在保留说话人韵律和风格方面取得突破&#xff0c;是AI同声传译领域的…

MX6ULL学习笔记(十三)Linux 自带按键驱动程序

一、Linux 内核自带按键驱动使能。 Linux 内核也自带了 KEY 驱动&#xff0c;如果要使用内核自带的 KEY 驱动的话需要配置 Linux 内核&#xff0c;不过 Linux 内核一般默认已经使能了 KEY 驱动&#xff0c;但是我们还是要检查一下。 使用如下命令打开 Linux 配置菜单&#xff…