章
目
录
了解Java 中的各种数据类型。了解原始数据类型和非原始数据类型(或引用数据类型)之间的差异。我们还将了解数据类型的大小以及在 Java 中使用数据类型的最佳实践。
Java中如何声明变量?
在 Java 中,通常数据类型与变量相关联。变量声明由三部分组成:
- 引用内存位置的变量名(也称为标识符)
- 存储在内存位置的变量类型(称为datatype)
- 保存变量值的内存位置
第二个属性称为数据类型。
变量的数据类型决定了内存位置可以保存的值的范围。因此,为变量分配的内存量取决于其数据类型。
例如,为该'int'
数据类型的变量分配32位内存。
Java 是一种静态类型语言。这意味着所有变量都必须在使用之前进行声明。
boolean flag = true;
int counter = 20;
Java数据类型
Java支持两种数据类型:
- 原始数据类型
- 非原始或引用数据类型。
原始数据类型
- 原始数据类型直接在内存中保存值。例如,数字或字符。
- 原始数据类型不是对象,也没有对对象的引用。
- 存储在原语中的值称为文字。
文字是固定值的源代码表示;文字直接在代码中表示,无需计算。
Java 有八种基本数据类型。
数据类型 | 描述 | 默认值 | 内存大小 |
---|---|---|---|
boolean |
true 或的二进制值false |
false |
1 位 |
char |
任何 Unicode 字符
最小值是 \u0000(十进制等效值为 0); char 数据类型可以储存任何字符; |
\u0000 (0) | 16 位 Unicode 字符 |
byte |
值范围从 -128 到 127
byte 数据类型是8位、有符号的,以二进制补码表示的整数; byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一; |
0 | 8 位有符号值 |
short |
值范围从 -32768 到 32767
short 数据类型是 16 位、有符号的以二进制补码表示的整数 Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一 |
0 | 16 位有符号值 |
int |
值范围从 -2 31到 2 31 -1
一般地整型变量默认为 int 类型; |
0 | 32 位有符号值 |
long |
值范围从 -2 63到 2 63 -1
这种类型主要使用在需要比较大整数的系统上; |
0 | 64 位有符号值 |
float |
符合IEEE 754标准的浮点数;
float 在储存大型浮点数组的时候可节省内存空间; 浮点数不能用来表示精确的值,如货币; 例子:float f1 = 234.5f。 |
0.0f | 32 单精度位浮点值 |
double |
符合IEEE 754标准的浮点数;
浮点数的默认类型为 double 类型; double类型同样不能表示精确的值,如货币; 例子: double d1 = 7D ; |
0.0d | 64 双精度位浮点值 |
在 Java SE 7 及更高版本中,任意数量的下划线字符 (
'_'
) 可以出现在数字文字中数字之间的任何位置。比如10_000_000
是 Java 中的有效数字。
基元之间的类型转换
除此之外boolean
,我们可以将一个原始值分配给另一个原始类型。然而,有时当将大内存容量的基元分配给具有较小内存容量的基元时,可能会导致数据丢失。
这就像您将水从一个大容器转移到一个较小的容器中一样,所以水损失是自然的。
int counter = 20_000_000;
//Assign int to short (data loss)
short shortCounter = (short) counter;
//assign int to long (no data loss)
long longCounter = counter;
System.out.println(counter); //20000000
System.out.println(shortCounter); //11520
System.out.println(longCounter); //20000000
请注意,当 Java 检测到类型转换可能会导致数据丢失(较大的数据类型转换为较小的数据类型)时,则会给出类型不匹配错误并明确要求进行类型转换(例如,将“int”赋值为“short”)。它有助于检测和解决意外的数据丢失分配。
非原始数据类型
非原始或引用数据类型保存对内存中对象的引用。使用存储在变量中的引用,您可以访问引用对象的字段和方法。
例如,java.lang.String
是 Java 库中定义的一个类,您可以使用它来操作文本(字符序列)。您将类型的引用变量声明String
为:
String str = "Hello World !!";
执行这段代码时会发生什么?
- 首先,分配一个内存块,并将变量的名称
str
与该内存位置相关联。此过程与声明基本数据类型变量相同。 - 代码的第二部分
String
在内存中创建一个带有文本的新对象"Hello World !!"
,并将该对象的引用(或内存地址)存储String
到变量 中'str'
。
多个变量可以引用同一个对象
您还可以将存储在一个引用变量中的对象的引用分配给另一引用变量。在这种情况下,两个引用变量将引用内存中的同一对象。
// Declares String reference variable str1 and str2
String str1;
String str2;
// Assigns the reference of a String object "Hello" to str1
str1 = new String( "Hello World !!" );
// Assigns the reference stored in str1 to str2
str2 = str1;
System.out.println( str1 ); //Hello World !!
System.out.println( str2 ); //Hello World !!
有一个引用常量(也称为引用文字)null,它可以分配给任何引用变量。如果null
分配给引用变量,则意味着该引用变量没有引用内存中的任何对象。
包装类
包装类是其对象包装或包含原始数据类型的类。换句话说,我们可以将原始值包装到包装类对象中。
请注意,Java 有一个映射到每种基本数据类型的包装类。
例如,java.lang.Integer
class 是 int 数据类型的对象版本。同样,对于所有 8 种基本数据类型,我们总共有 8 个包装类。
包装类名称与原始数据类型相同,只是以大写字母开头。这些包装类是Boolean
、Byte
、Short
、Character
、Integer
、Long
和Float
。Double
自动装箱
在 Java 中,您可以直接将基本类型值分配给包装类。例如,您可以将int 值分配给 Integer 类引用。
Integer counter = 20;
static Float PI = 3.14f;
值得一提的是,所有包装类实例都是不可变的。出于性能原因,它们还维护内部缓存。
原始数据类型和非原始数据类型的区别
- 基元直接存储值,称为文字。引用类型存储对内存区域中实际对象的引用。
- 有 8 种固定的原始数据类型。在Java中,每个类都是一种数据类型,包括包装类。
最佳实践
- 使用Java 变量命名约定并遵循最佳实践。
- 对局部范围内的变量使用原语。例如,内部方法、循环计数器和中间结果。
- 当数据在方法或类之间传输时,最好使用对象,因为只会复制它们的引用,因此不会增加内存开销。
- 当处理集合(需要对象)时,您应该使用对象。
- 通过网络发送数据时,使用对象并创建它们
Serializable
。包装类是自动的Serializable
。 - 始终了解您需要的数据类型的大小。使用适当的数据大小。使用
int
存储boolean
值(0 和 1)是浪费内存。 - 在数字中使用下划线(Java 7 以上)。它使它们更具可读性。
文章目录前言 第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符串 […]