Java——变量

news2024/11/18 13:40:51

一、变量介绍

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

1、变量声明和初始化

变量的声明:

int a;

int 是类型,a 是变量名或者说标识符。

变量初始化:

a = 10;

将 10 赋值给或者说初始化给变量 a。

也可以声明和初始化同时进行:

int a = 10;

2、变量内容的输出

再声明和初始化变量之后,我们还可以使用以下方式输出变量的内容:

public class Hello {
	public static void main(String[] args) {
		int age = 18;
		//创建一个int变量然后初始化
		float height = 1.8f;
		//创建一个float变量然后初始化
		System.out.println(age);
		System.out.println(height);
	}
}

运行结果:

3、变量的内存大小

变量在初始化时的类型不同,系统对其分配的内存大小是不同的。例如 int 类型是 4 字节,double 是8字节。

在同一个作用域中不能有重名的变量。

二、数据类型

Java 的数据类型分为基本数据类型和引用数据类型:

下面将会对基本数据类型进行详细介绍。Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

1、type

特点详情
类型名称byte
位数8位
符号性有符号
存储形式二进制补码
最小值-128 (-2^7)
最大值127 (2^7-1)
默认值0

从它的名字上面也可以看出来,它的大小是一个字节,对于比较小的整数可以用它来存储,以节省空间。

byte a = 10;
byte b = -20;

2、short

特点详情
类型名称short
位数16位
符号性有符号
存储形式二进制补码
最小值-32768 (-2^15)
最大值32767 (2^15-1)
默认值0

short 又叫短整型,占用 2 字节,在数值较小时可以使用它来存储,以节省空间。

short a = 1000;
short b = -2000;

3、int

特点详情
类型名称int
位数32位
符号性有符号
表示形式二进制补码
最小值-2,147,483,648 (-2^31)
最大值2,147,483,647 (2^31-1)
默认值0

int 就是默认整型类型,占用 4 字节。

int a = 60000;
int b = -70000;

4、long

特点详情
类型名称long
位数64位
符号性有符号
表示形式二进制补码
最小值-9,223,372,036,854,775,808 (-2^63)
最大值9,223,372,036,854,775,807 (2^63-1)
默认值0L

long 又叫长整型,对于比较大的数据可以用它来存储,占用 8 字节。由于整形常量默认是 int 类型的,如果要初始化 long 类型的数据,要在整形常量后加上 L 以表示它是长整型,这里的 L 大写小写都行,但是一般大写 L 防止与数字 1 混淆。

long a = 10000000000L;
long b = -20000000000L;

5、float

特点详情
类型名称float
位数32位
符号性有符号
表示形式IEEE 754
默认值0.0f

float 又叫单精度浮点数,用于精度比较小的情况。由于浮点数常量的默认类型是 double 类型, 所以在初始化时要在常量后加上 f 。

float a = 2.34f;
float b = -3.14f;

6、double

特点详情
类型名称double
位数64位
符号性有符号
表示形式IEEE 754
默认值0.0d

double 又叫双精度浮点数,精度比 float 高,但实际上有些情况还是不能胜任。同时可以在常量值后加上 D 以表示这个数据是 double 类型,但是对于常量浮点数默认就是 double 类型的,所以加不加 D 作为后缀都可以。

double a = 3.1415926;
double b = -2.3453534D;

7、char

特点:

特点详情
类型名称char
位数16位
符号性无符号
存储形式Unicode 字符
最小值\u0000 (0)
最大值\uffff (65535)
默认值\u0000
用途存储单个字符

介绍:

我们可以将一个字符存储到 char 类型的变量中(单个字符赋值使用单引号):

char ch = 'A';

对于 char 类型的数据,实际上存储的是字符对应的 Unicode 码。所以我们可以在初始化时直接赋值给 char 类型变量一个整数:

public class Test {
	public static void main(String[] args) {
		char ch = 65;
		System.out.println(ch);
	}			
}

这样会打印这个整数对应的 Unicode 字符:

当然我们也可以将这个字符类型强制转换为整型(因为 char 类型的本质就是整型),然后以整型形式打印,就可以得到字符对应的 Unicode 码了:

public class Test {
	public static void main(String[] args) {
		char ch = '好';
		System.out.println((int)ch);
	}
}

这样就可以得到字符对应的 Unicode 码值了:

经过查询,我们发现,字符 '好' 对应的 Unicode 码值就是:

这与我们的运行结果是对应的。

与 C 语言的 char 比较:

对于 char 类型,Java 里的字符类型与 C 语言的不同,C 语言的 char 类型只有一个字节,而且只能存储 ASCII 字符集,不能存储 Unicode 字符的超出 ASCII 的部分。所以对于以下操作 C 语言的 char 类型是做不到的:

public class Test {
	public static void main(String[] args) {
		char ch = '好';
		System.out.println(ch);
	}
}

运行结果:

Java 的 char 类型是一个单一的 16 位 Unicode 字符,使用 UTF-16 编码。(对于这里有一个需要声明的点,Unicode 是一个字符集,而UTF-16是它的一个实现。其他的实现还有UTF-8和UTF-32)它的取值范围是从 \u0000\uffff(即从 0 到 65535),这允许它能够表示世界上绝大多数字符的标准集(包括 ASCII、拉丁字母、汉字等)。因此,在 Java 中,我们可以使用 char 类型来存储像 '好' 这样的 Unicode 字符。

另一方面,C 语言的标准 char 类型通常是 8 位的,并且主要用来表示 ASCII 字符集,它的取值范围是从 0 到 255 或 -128 到 127(取决于编译器是否将 char 视为有符号类型)。由于它的大小限制,C 语言的标准 char 类型不能直接表示 Unicode 字符集中的超出 ASCII 字符集的字符。如果在 C 中想要处理 Unicode 字符,通常会使用其他数据类型,如 wchar_t,这是一个宽字符类型,其大小和编码方式可以变化,依赖于平台和编译器设置,可能是 16 位或 32 位。

char 类型的存储:

当我们在使用以下语句对一个字符型变量进行初始化时,这个字符常量值是怎么存储的呢:

char ch = 'a';

对于字符型变量,内存中存储的其实是它对应的 Unicode 码值的二进制。

编码方式:

  1. ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):ASCII 是最早的字符编码标准之一,使用一个字节(8位)来表示一个字符。原始的 ASCII 编码只使用了 7 位,共计 128 个字符。它包含了英文字母(大小写)、数字、标点符号和一些控制字符。扩展 ASCII 码:后来的很多国家扩展 ASCII 则使用了全部 8 位,增加了更多字符,这些国家扩展的 ASCII 码的前128个字符是一样的,但是后面的 128~255 的编码各不相同(因为每个国家的字母不一定一样,所以后面的编码实现不同),导致使用不同的编码实现方式打开不同的文件会导致乱码。

  2. UTF-8(Unicode Transformation Format - 8-bit):UTF-8 是一种变长编码,是一种 Unicode 字符集的编码方式实现,可以在表示 Unicode 字符时使用 1 到 4 个字节。UTF-8 兼容 ASCII 编码,即 ASCII 字符使用一个字节表示,而非 ASCII 字符需要多个字节(例如汉字使用3字节)。UTF-8 是互联网上最常用的字符编码方式,因为它兼容 ASCII,并可以表示世界上几乎所有的字符。

  3. GBK:GBK 是对 GB2312 编码的扩展,主要用于表示中文字符。GBK 使用两个字节表示一个字符,其中包含了 GB2312 中的字符及更多的汉字和符号。GBK 兼容 GB2312,所以 GB2312 中的字符可以直接在 GBK 中使用。

  4. GB2312:GB2312 是中国国家标准,主要用于表示简体中文字符。它使用两个字节表示一个字符,其中包含了大部分常用的汉字和一些符号。GB2312 的字符集较为有限,不包含繁体中文和其他语言字符。

  5. Big5 码:Big5 码主要用于表示繁体中文字符。它使用两个字节表示一个字符,其中包含了繁体中文字符及一些符号。Big5 码与 GB2312 和 GBK 不兼容,因为它们使用了不同的字符集。

8、boolean

特点详情
类型名称boolean
位数不明确,依赖于具体实现
符号性
表示形式true 或 false
默认值false

boolean 又叫布尔类型,一般用于逻辑判断。

boolean isRight = true;

补充

数据类型的内存大小:

由于 Java 的代码是在 JVM 中运行的,所以对于不同的平台这些数据类型的内存大小都是一样的。这一点与 C 语言不同。这种固定大小的设计确保了 Java 程序在不同平台上的一致性。相比之下,C 语言的基本数据类型大小是依赖于编译器和目标平台的。例如,int 在某些系统上可能是 16 位,而在其他系统上可能是 32 位。这种灵活性使得 C 语言非常接近底层,可以针对特定硬件进行优化,但同时也要求程序员在编写跨平台代码时更加小心,以确保代码在不同环境下的正确性。

数据不兼容:

当我们使用不兼容的数据来赋值时:

public class Test {
	public static void main(String[] args) {
		int a = 100L;
	}
}

会出现以下报错:

这里应当使用 100L 对应的数据类型,也就是 long 类型。

Java 中整型变量一般声明为 int 类型,除非是 int 无法表示的大数才使用 long 。

当我们使用不同精度的浮点数进行赋值时:

public class Test {
	public static void main(String[] args) {
		float a = 1.0;
	}
}

我们知道浮点数常量的默认类型是 double ,当我们将浮点数不加 f 后缀赋值给 float 类型,就相当于将 double 类型数据赋值给 float 类型的变量,这样就会导致精度损失,所以会出现以下报错:

浮点数赋值补充:

再对于浮点数赋值时,如果我们要赋值的值整数位为零,可以不加整数位,直接一个小数点后接小数位,就像这样:

public class Test {
	public static void main(String[] args) {
		double num = .123;
		//这里赋值给num的值为0.123
		System.out.println(num);
	}
}

运行结果:

我们还可以使用科学计数法形式的数据对浮点数变量进行赋值:

public class Test {
	public static void main(String[] args) {
		double num1 = 1.023e2;
		//这里赋值给num1的值为102.3
		double num2 = 2.333E-2;
		//这里赋值给num2的值为0.02333
		System.out.println("num1 = " + num1);
		System.out.println("num2 = " + num2);
	}			
}

运行结果:

1.023e2 就相当于 1.023 * 10 ^ 2 。这里的 e 是 exponent 的缩写,是幂的意思,这里的 e 大写小写都可以,指数可以是正负整数。

浮点数精度:

对于一个浮点数一般使用 double 类型存储,因为 double 的精度较高。可以通过下面这个例子看出来:

public class Test {
	public static void main(String[] args) {
		double num1 = 2.123456789;
		//双精度浮点数一般能保留到小数点后15~16位
		float num2 = 2.123456789f;
		//单精度浮点数一般能保留到小数点后6~7位
		System.out.println("双精度 num1 = " + num1);
		System.out.println("单精度 num2 = " + num2);
	}			
}

运行结果:

双精度浮点数一般能保留到小数点后15~16位,单精度浮点数一般能保留到小数点后6~7位。

一个小细节:

public class Test {
	public static void main(String[] args) {
		double num1 = 1.1;
		double num2 = 3.3 / 3;
		System.out.println("1.1 num1 = " + num1);
		System.out.println("3.3 / 3 num2 = " + num2);
	}			
}

虽然这里的 3.3 / 3 我们都知道是 1.1 ,但是这里输出的却不是 1.1 ,而是一个极其接近 1.1 的数。

浮点数在计算机中通常使用 IEEE 754 标准来表示,这种表示方法在存储时不能精确表示所有小数。特别是那些在十进制中有限的小数,在二进制浮点表示中可能是无限的。实际上这里的 3.3 转换为二进制的可能是无限循环小数,由于 double 精度是有限的,无法存储无限循环的小数,所以这里得到的结果是一个很接近 1.1 的小数,可以看到这里的 1.0999999999999999 小数位刚好是 16 位,确实是 double 类型精度的极限。

浮点数详细介绍补充说明:

Java 中的浮点数类型(floatdouble)遵循 IEEE 754 标准,这与 C 语言中的浮点数类型(floatdouble)相同。IEEE 754 是一个定义浮点数运算的国际标准,它规定了浮点数的表示、运算和舍入规则。

我之前的文章《C语言——数据存储_存储的c语言编程-CSDN博客》中有详细的介绍过的浮点数。

这里的介绍不仅适用于 C 语言,同样适用于 Java 。

三 、加号的使用

1. 数值加法

+ 运算符应用于数值类型(byte、short、int、long、float、double)的操作数时,它执行加法运算。

整数加法:如果两个操作数都是整型(如 byte、short、int、long),结果也是整型。如果操作数类型不同,它们会按照从小到大的顺序(byte -> short -> int -> long)进行类型提升,运算结果的类型是提升后的类型。

int a = 5;
int b = 3;
int sum = a + b; // 结果是 8

浮点数加法:如果至少有一个操作数是浮点型(float、double),则进行浮点数加法。整数和浮点数相加时,整数会被提升为浮点数类型,运算结果类型是最大的那个操作数的类型。

double a = 5.5;
int b = 3;
double sum = a + b; // 结果是 8.5

2. 字符串连接

+ 运算符的操作数中至少有一个是字符串(String 类型)时,Java 会将 + 运算符作为字符串连接操作来执行。此时,它会将非字符串操作数转换为字符串,然后将这些字符串连接在一起。

字符串与字符串连接

String hello = "Hello, ";
String world = "world!";
String greeting = hello + world; // 结果是 "Hello, world!"

字符串与其他类型数据连接:如果其中一个操作数是字符串,另一个是非字符串(如数值、布尔值等),非字符串操作数将转换成字符串,然后进行连接。

String base = "Base score: ";
int score = 100;
String result1 = base + score; // 结果是 "Base score: 100"
String result2 = score + base; // 结果是 "100Base score: "

这种转换不仅适用于基本数据类型,也适用于对象。对于对象,Java 会调用对象的 toString() 方法来获取其字符串表示,然后进行连接。

特殊案例

在一系列加法操作中,如果涉及到字符串连接和数值加法,操作是从左到右依次进行的。因此,如果先遇到字符串,后续的操作数都会被转换为字符串进行连接。如果先进行数值加法,只有在遇到字符串后才开始进行字符串连接。

String result1 = "Sum: " + 5 + 7; // 结果是 "Sum: 57"
String result2 = 5 + 7 + " = Sum"; // 结果是 "12 = Sum"

示例:

public class Test {
	public static void main(String[] args) {
		System.out.println(21 + 34 + "nihao" + 1 + 2 + 3 + 4);
	}
}

运行结果:

可以发现与上面的描述是对应的。

也就是说这里的多个 + 运算,运算顺序是从左到右的,首先是 21 + 34 ,得到 55 ,然后 55 + "nihao" 得到 "55nihao" ,然后 "55nihao" + 1 得到 "55nihao1" ,然后 "55nihao1" + 2 得到 "55nihao12" ,然后 "55nihao12" + 3 得到 "55nihao123" ,然后 "55nihao123" + 4 得到 "55nihao1234" ,所以最终打印的是这样的一个字符串。

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

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

相关文章

05.k8s弹性伸缩

5.k8s弹性伸缩 k8s弹性伸缩,需要附加插件heapster监控 弹性伸缩:随着业务访问量的大小,k8s系统中的pod比较弹性,会自动增加或者减少pod数量; 5.1 安装heapster监控 1:上传并导入镜像,打标签 ls *.tar.gz for n in ls *.tar.gz…

Github 2024-06-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Jupyter Notebook项目2TypeScript项目1Go项目1Shell项目1Lua项目1Kong:云原生API网关与AI能力 创建周期:3482 天开发语言:Lua协议…

C# 字节数组(byte[])拼接的性能对比测试

将C#中的三种字节数组拼接方式的性能做了一个对比测试,DEMO程序代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Byte数组拼接测…

秋招突击——算法打卡——5/30——复习{最大上升子序列的和、面试算法缺陷补充}——新做:{回文数+补充 自定义Stoi实现、正则表达式匹配}

文章目录 复习导弹拦截——最大上升子序列和推理过程实现代码补充昨日面试 新作回文数实现代码 字符串转整数正则表达式匹配个人实现思路分析实现代码如下 参考做法思路分析实现代码 总结 复习 导弹拦截——最大上升子序列和 同样类型题目链接:导弹拦截重做这道题…

docker 启动关闭,设置仓库地址

1. 配置/etc/docker/daemon.json cat /etc/docker/daemon.json# 内容 {"registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com"],"insecure-registries": ["harbor.domain.io"] }2. 配置systemd启动文件 和方法1配置会有冲突&a…

HarmonyOS鸿蒙学习笔记(25)相对布局 RelativeContainer详细说明

RelativeContainer 简介 前言核心概念官方实例官方实例改造蓝色方块改造center 属性说明参考资料 前言 RelativeContainer是鸿蒙的相对布局组件,它的布局很灵活,可以很方便的控制各个子UI 组件的相对位置,其布局理念有点类似于android的约束…

摄影后期照片编辑工具:LrC2024 for Mac/win 中文激活版

LrC2024(Lightroom Classic 2024)是 Adobe 公司推出的一款专业级别的照片编辑和管理软件。它是 Lightroom Classic CC 的升级版,具有更多的功能和改进。 这款软件主要用于数字摄影师和摄影爱好者处理、编辑和管理他们的照片。它提供了一套强大…

【WEEK14】 【DAY4】Swagger第二部分【中文版】

2024.5.30 Thursday 接上文【WEEK14】 【DAY3】Swagger第一部分【中文版】 目录 16.4.配置扫描接口16.4.1.修改SwaggerConfig.java16.4.1.1.使用.basePackage()方法指定扫描的包路径16.4.1.2.其他扫描方式均可在RequestHandlerSelectors.class中查看源码 16.4.2.仍然是修改Swag…

java读取文件内容(正则表达式匹配)

已知文件score.txt内容如下: 语文85分,数学89分,英语75分,马列95分。 要求解析出其中的成绩数据,并计算总成绩 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import jav…

vector的功能讲解与底层实现

本文主要介绍vector的内容以及使用和模拟实现。 vector在英文翻译中是矢量的意思,但在c中他的本质是一个顺序表(容器),是一个类模板,(用模板创建变量就要参考我们之前的实例化内容了)用可以改变…

云硬盘的基准性能测试场景

参考来源: 深入浅出云计算-05 | 云硬盘:云上IO到底给不给力 云硬盘的性能等级 当下的云硬盘经过了多次的软硬件迭代,尤其是SSD的迅速发展,吞吐量和随机读写能力等各项性能指标都已经不再是问题了。在现代云计算中,已…

解析前端开发中同源策略与配置代理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 在前端开发中,跨域请求是一个常见的问题。同源策略限制了浏览器中一个页面…

2.1Docker安装MySQL8.0

2.1 Docker安装MySQL8.0 1.拉取MySQL docker pull mysql:latest如:拉取MySQL8.0.33版本 docker pull mysql:8.0.332. 启动镜像 docker run -p 3307:3306 --name mysql8 -e MYSQL_ROOT_PASSWORDHgh75667% -d mysql:8.0.33-p 3307:3306 把mysql默认的3306端口映射…

字符串-至多包含K种字符的子串中最长子串(mid)

一、题目描述 二、解题思路 借鉴以下题目思想,使用双指针,外层循环右侧指针移动,内存循环左侧指针移动 字符串-最长不含重复字符的子字符串(mid)-CSDN博客文章浏览阅读622次,点赞17次,收藏4次。java刷题:…

芯盾时代API安全监测平台

面对难搞的API安全,芯盾时代作为领先的零信任业务安全产品方案提供商,给出了自己的答案——以AI技术赋能API安全,打造API安全监测平台,帮助企业建立资产摸得清、漏洞看得透、攻击测得出、数据拦得住的API风险监测体系,…

通过LabVIEW提升生产设备自动化水平

现代制造业对生产设备的自动化水平提出了越来越高的要求。使用LabVIEW这一强大的图形化编程环境,可以显著提升生产设备的自动化程度,改善生产效率和产品质量。本文将详细分析如何通过LabVIEW改善生产设备的自动化水平,并提供具体的实施策略与…

c++函数基础总结

在给出的代码片段中,我们看到两部分内容:一个类定义和一个全局函数声明。让我们逐一分析它们: 类定义: cpp复制代码 class { public: void a(); }; 这个类定义是不完整的,因为它没有类名。但为了说明,我…

【SQL学习进阶】从入门到高级应用【三范式】

文章目录 什么是数据库设计三范式三范式一对多怎么设计多对多怎么设计一对一怎么设计最终的设计 🌈你好呀!我是 山顶风景独好 💕欢迎来到我的博客,很高兴能够在这里和您见面! 💕希望您在这里可以感受到一份…

【SpringBoot】SpringBoot整合JWT

目录 先说token单点登录(SSO)简介原理单点登录的优势单点登录流程分布式单点登录方式方式一:session广播机制实现方式二:使用cookieredis实现。方式三:token认证 JWT数字签名JWT的作用JWT和传统Session1、无状态&#…

精雕细琢,B 端 UI 设计展典雅风范

精雕细琢,B 端 UI 设计展典雅风范