Java 中的类型介绍

本文介绍 Java 数据类型,原始数据类型和非原始数据类型之间的差异,同时介绍数据类型的大小和最佳实践。

本文介绍 Java 数据类型,原始数据类型和非原始数据类型之间的差异,同时介绍数据类型的大小和最佳实践。

1. 什么是数据类型

在 Java 中,通常将数据类型与变量相关联。变量具有三个属性:

  1. 变量名称(也称为标识符)
  2. 数据类型
  3. 变量的值

Java数据类型
Java 数据类型

第二个属性(用橙色标记)为数据类型。变量的数据类型决定了内存位置可以保存的值的范围。因此,为变量分配的内存大小取决于它的数据类型。例如,为 'int' 数据类型的变量分配了 32 位内存。

Java 是一种静态类型的语言。这意味着必须先声明所有变量,然后才能使用它们。

声明变量示例:

boolean flag = true;
 
int counter = 20;

2. Java 中的数据类型

Java 支持两种数据类型,即原始数据类型和 非原始 或引用数据类型。

2.1 原始数据类型

基本数据类型 直接 在内存中保存一个值。例如,数字或字符。原始数据类型 既不是对象,也不是对对象的引用。

存储在原始类型中的值称为 文字。文字是固定值的源代码表示; 文字直接在您的代码中表示,无需计算。

在 Java 中,我们有 8 种原始数据类型。

数据类型 描述 默认值 分配内存大小
boolean true 或的二进制值false false 1 位
char 任何 Unicode 字符 \ u0000(0) 16 位 Unicode 字符
byte 值从 -128 到 127 0 8 位有符号值
short 值从 -32768 到 32767 0 16 位有符号值
int 值从 -231 到 231 -1 0 32 位有符号值
long 值从-263 到 263 -1 0 64 位浮点值
float IEEE 754 浮点 0.0 32 位浮点值
double IEEE 754 浮点 0.0 64 位浮点值

在 Java SE 7 和更高版本中,数字中数字之间的任何位置都可以出现任意数量的下划线字符('_')。例如,10_000_000 在 Java 中是有效数字。

2.1.1 原始类型之间的类型转换

除了 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”, 必须使用强制类型转换)。它有助于检测和解决意外的数据丢失分配。

2.2 非原始数据类型

非原始或引用数据类型将对象的引用保存在内存中。使用存储在变量中的引用,您可以访问引用对象的字段和方法。

例如,java.lang.String 是 Java 库中定义的类,您可以使用它来处理文本(字符串)。如下声明 String 的示例:

String str = new String( "Hello World !!" );

执行此代码会怎样?首先,分配一个内存块,并将变量名称 str 与该内存位置关联。此过程与声明原始数据类型变量的过程相同。

代码的第二部分在内存中使用文本 "Hi" 创建一个新 String 对象,并将 String 对象的引用(或内存地址)存储到变量中'str'

2.2.1 多个引用可以引用同一对象

您还可以将存储在一个参考变量中的对象的参考分配给另一参考变量。在这种情况下,两个引用变量都将引用内存中的同一对象。

// 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 赋给参考变量,则表示该参考变量没有引用内存中的任何对象。

2.2.2 包装类

包装类是一个类,其对象包装或包含基本数据类型。换句话说,我们可以将原始值包装到包装类对象中。

请注意,Java 有一个包装类映射到每种原始数据类型。例如,java.lang.Integer 类是int 数据类型的对象版本。同样,对于所有 8 种原始数据类型,我们总共有 8 个包装器类。

包装类名称与原始数据类型名称相同,仅以大写字母开头。

这些包装类包括: BooleanByteShortCharacterIntegerLongFloatDouble

2.2.3 自动装箱

在 Java 中,可以直接将原始类型值分配给包装类。例如,您可以将一个 int 值分配给 Interger 类引用。

Integer counter = 20;
 
static Float PI = 3.14f;

值得一提的是,所有包装器类实例都是不可变的。由于性能原因它们还维护内部缓存

3.原始数据类型和非原始数据类型之间的区别

  1. 原始类型直接存储值,称为文字。引用类型将对实际对象的引用存储在存储区中。
  2. 有 8 种固定的原始数据类型。在 Java 中,每个类都是包含包装器类的数据类型。

4.最佳实践

  1. 使用 Java 变量命名约定并遵循最佳实践。
  2. 将原始类型用于范围内局部变量。例如内部方法,循环计数器和中间结果。
  3. 在方法或类之间传输数据时,最好使用对象,因为仅复制它们的引用,而不会增加内存开销。
  4. 在处理集合(需要对象)时,应使用对象。
  5. 通过网络发送数据时,请使用对象并使它们可序列化。包装器类可自动序列化。
  6. 确保使用正确的数据类型,使用适当的数据大小。使用 int 存储 boolean 的值(0 和 1)是浪费的。
  7. 在数字中使用下划线(Java 7 之上)。它使它们更具可读性。