1. 基本类型列表

Java 有 8 种基本原始类型。它们之所以被称为原始类型,是因为这些类型的值不是对象,而是直接存储在变量中。

下表包含有关这些类型的一些简要信息:

类型
字节 大小
取值范围 默认值 描述
byte 1个 -128 .. 127 0 最小的整数类型是单字节
short 2个 -32,768 .. 32.767 0 短整数,两个字节
int 4个 -2*10 9 .. 2*10 9 0 整数,4 字节
long 8个 -9*10 18 .. 9*10 18 0L 长整型,8 字节
float 4个 -10 38 .. 10 38 0.0f 浮点数,4字节
double 8个 -10 308 .. 10 308 0.0d 双精度浮点数,8字节
boolean 1个 true,false false 布尔类型(只有trueand false
char 2个 0 .. 65.535 '\u0000' 字符,2个字节,全部大于0
默认值

顺便说一句,这里有一个重要的细微差别。如果您声明了一个实例变量(字段)或一个静态类变量并且没有立即为其分配任何值,那么它会被初始化为一个默认值。该表列出了这些值。

方法中的局部变量没有默认值。如果您不为此类变量赋值,则它们将被视为未初始化且无法使用。

但是让我们回到原始类型并仔细研究它们。



2. 整数类型

Java 有 4 种整数类型:byteshortintlong它们的大小和可以存储的值的范围不同。

int类型

最常用的是int类型。该名称来自单词int eger(整数)。代码中的所有整数文字(整数)都是(如果它们不以、或ints结尾)。LFD

这种类型的变量可以取值从-2,147,483,648+2,147,483,647

这已经足够了,几乎适用于所有场合。几乎每个返回数字的函数都会返回一个int.

例子:

代码 解释
int n = "String".length();
length()方法返回字符串的长度
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
length字段包含数组的长度。

short类型

short类型的名称来自short int. 它通常也称为短整数。与类型不同int,它的长度只有两个字节,可能值的范围是从-32,768+32,767

这意味着您不能在其中存储数字一百万。甚至50,000。这是 Java 中最不常用的整数类型。使用它的主要动机是节省内存。

假设您事先知道您将使用永远不会超过 30,000 的值,并且这些值将有数百万个。

例如,假设您正在编写一个处理超高清图片的应用程序,10每个颜色使用 - 位。你的照片有一百万像素。int这是决定使用或事项的场景short

long类型

这种类型得名于long int,也称为长整型。与类型不同int,它的取值范围非常大:从到。-9*1018+9*1018

为什么它不是基本整数类型?

因为 Java 出现在 90 年代中期,当时大多数计算机都是 32 位的。这意味着所有处理器都针对处理由 32 位组成的数字进行了优化。处理器可以处理 64 位整数,但对它们的操作速度较慢。

因此,程序员合理地决定制作int标准整数类型,并仅在真正需要时才使用该long类型。

byte类型

这是 Java 中最小的整数类型,但远非最少使用。它的名称byte也是 Java 中最小可寻址内存块的代名词。

bytetype: from -128to的有效值不多+127。但这不是它的强项。byte当您需要在内存中存储大型 blob 数据时,最常使用该类型。s数组byte非常适合此目的。

假设您需要在某处复制一个文件。

您不需要处理文件的内容:您只想创建一个内存区域(缓冲区),将文件的内容复制到其中,然后将该数据从缓冲区写入另一个文件。byte为此,您需要一个数组。

请记住,数组变量仅存储对内存区域的引用。当变量传递给某个方法时,只传递内存地址。内存块本身不会被复制。

byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
   int size = sourceFile.read(buffer); // Read data from a file into a buffer
   destFile.write(buffer, 0, size); // Write data from the buffer to a file

   // Stop copying if the buffer is not full
   if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();


3.真实类型

基本类型包括两种实数类型。尽管使用该术语并不完全准确。当计算机处理实数时,我们称它们为浮点数。该名称来自表示数字的标准,其中数字的整数和小数部分由句点(点,而不是逗号)分隔。

一些有用的信息:

每个国家都有自己的数字书写标准(惊喜!)。

很多人习惯用句点分隔千位,用逗号作为小数点分隔符:例如,他们会one million ones and 153 thousandths写成1.000.000,153. 但是在 Java 的创造者居住的美国,采用了不同的标准:1000000.153

Java 有两种浮点原始类型:doublefloat.

正如我们前面所说,这些类型有一个非常特定的内部安排:实际上,这些类型的每个变量内部不是一个数字,而是两个:

例如,浮点数987654.321可以表示为。然后在内存中它将被表示为两个数字(尾数,即数字的有效部分)和(指数,即十的幂)0.987654321*1069876543216

float类型

类型的名称float来自float ing-point number。这种类型的大小非常小——只有 4 个字节(32 位)——但它可以存储从到 的值。分配 24 位用于表示尾数,8 位用于表示指数。这种类型只能存储 8 位有效数字。-3.4*10383.4*1038

这种方法可以存储比 大得多的数字int,同时使用相同的 4 个字节。但为此,我们牺牲了准确性。由于部分内存存储尾数,这些变量只存储6-7位小数,其余的被丢弃。

例子:

代码 价值
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

如您所见,这种类型的主要缺点是有效数字的数量非常少,并且一到第八位就会失去精度。这就是为什么该float类型在 Java 程序员中不是很流行的原因。

double类型

类型double是标准的浮点类型。名字来源于双精度浮点数。默认情况下,所有真实文字都是doubles 。

该类型占用 8 个字节的内存(64 位),可以存储从到 的值。需要知道的重要一点是,尾数分配了 53 位,而其余 11 位分配给指数。-1.7*103081.7*10308

这允许存储 15-17 位有效数字。

例子:

代码 价值
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

这种精度,尤其是与类型相比float,是决定性的:99% 的实数运算都是使用double类型执行的。

11位分配给指数,这意味着您可以存储十的幂从-323+308(这是二的幂从-1024+1023)。该double类型可以轻松存储小数点后有数百个零的数字:

代码 价值
double a = 2E-300 * 3E+302
600.0


4.无限

浮点数还有另一个有趣的特性:它们可以存储一个表示无穷大的特殊值。你可以表示正无穷大负无穷大

例子:

代码 笔记
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

如果无穷大乘以一个数,就会得到无穷大。如果你把一个数加到无穷大上,你就会得到无穷大。那是超级方便。

不是数字 ( NaN)

任何涉及无穷大的运算都会产生无穷大。好吧,大多数但不是全部。

浮点数可以存储另一个特殊值:NaN. 它是N ot a N umber(不是数字)的缩写。

在数学中,如果用无穷大除以无穷大,结果是不确定的。

但是,在 Java 中,如果用无穷大除以无穷大,结果是NaN.

例子:

代码 笔记
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

任何具有NaNyields的操作NaN



5.char类型

Java的原始类型中,有一个值得特别注意:类型char。它的名字来自单词char acter,类型本身用于存储字符。

字符是由字符串组成的,对吗?字符串是字符数组。

但更有趣的是,该char类型也是数字类型!可以这么说,这是一种双重用途的类型。

实际情况是char类型实际上不是字符。相反,它存储来自 Unicode 编码的字符代码。每个字符对应一个数字:字符的数字代码。

每个char变量在内存中占用两个字节(与类型相同short)。但与short类型不同的是,char整数类型是无符号的,可以存储从0到 的值65,535

char类型是混合类型。它的值既可以解释为数字(例如,它们可以相加和相乘)也可以解释为字符。这样做是因为尽管字符是视觉表示,但对于计算机而言,它们首先只是数字。将它们作为数字使用会更方便。

统一码

Unicode是一个包含世界上所有字符的特殊表(编码)。每个角色都有自己的编号。它看起来大约是这样的:

Java 中的原始类型

有多种方法可以为变量赋值char

代码 描述
char a = 'A';
a变量将包含拉丁字母A
char a = 65;
a变量将包含拉丁字母A。它的代码是65
char a = 0x41;
a变量将包含拉丁字母A
它的代码是,在十六进制中 65等于。41
char a = 0x0041;
a变量将包含拉丁字母A
它的代码是,在十六进制中65等于。 两个额外的零不会改变任何东西。 41
char a = '\u0041';
a变量将包含拉丁字母A
另一种通过代码定义字符的方法。

大多数情况下,人们只是简单地在引号中指明字符(如表的第一行)。也就是说,后一种方法也很受欢迎。它的优点是可以在字符串中使用。

正如我们所说,该char类型也是一个整数类型,所以你可以这样写:

代码 控制台输出
char a = 'A';
a++;
System.out.println(a);
拉丁字母B将显示在屏幕上。因为

A———— 65
B_66
C67

char与小号一起工作

每个char首先是一个数字(字符代码),然后是一个字符。如果你知道一个字符代码,你总是可以在你的程序中得到这个字符。例子:

代码 控制台输出
char c = (char) 1128;
System.out.println(c);

Ѩ

标准代码

以下是最著名的字符代码:

人物 代码
0, 1, 2, ...9 48, 49, 50, ...57
a, b, c, ...z 97, 98, 99, ...122
A, B, C, ...Z 65, 66, 67, ...90


6.boolean类型

最后一个原始类型是boolean.

如您所知,它只能取两个值:truefalse

这样,您就已经了解了有关此类型的所有信息。