Java基础系列文章-数据类型之基础数据类型
Java基础系列文章-数据类型之基础数据类型
文章目录
前言
笔者写这个系列的初衷是当我工作一年左右发现Java基础是真的非常非常非常重要,而不是简单的应付面试所用的,想往高处走,基础必须扎实。
一、数据类型结构图
二、基本数据类型
1.数值型
1.1 整数类型
1.1.1 字节型(byte)
Java中字节数据类型是8位有符号的,也是Java中最小的整数数据类型。
它的范围是-128至127 (-27 to 27 - 1)。当程序使用其值在-128到127范围内的大量变量或在文件或网络中处理二进制数据时或者处理可能与 Java 的其他内置类型不直接兼容的未加工的二进制数据时,使用字节变量。没有字节字面量。我们可以将在这个字节范围内的int类型的字面量分配给一个创建的字节变量。
代码如下(示例):
byte a = -118
byte b = 118
当我们为字节变量分配一个超出了字节数据类型范围的int字面量,那么Java会产生编译器错误。
但是我们可以将存储在一个int变量中的值(其范围为-128到127)分配给一个字节变量。
在Java中,我们不能将较高范围数据类型的变量的值分配给较低范围数据类型的变量,因为在进行这种赋值时可能会损失精度。
要做这样的赋值从int到字节,我们必须使用类型转换。
代码如下(示例):
int num1 = 1;
byte b1 = (byte)num1; // Ok
Java有一个类 Byte ,它定义了两个常量来表示字节数据类型的最大和最小值,Byte.MAX_VALUE和Byte.MIN_VALUE。
代码如下(示例):
byte max = Byte.MAX_VALUE;
byte min = Byte.MIN_VALUE;
1.1.2 短整型(short)
Java中short数据类型是16位有符号整数数据类型。 它的范围是-32768至32767(或-2 15 15 - 1)。
short 数据类型限制数据的存储格式为先高字节,后低字节,short基本很少使用,容易导致一些系统的系统错误
short没有字面量。但是,我们可以将任何在short(-32768到32767)范围内的int字面量分配给short变量。
代码如下(示例):
short s1 = 8888; // ok
short s2 = -8888; // ok
byte变量的值可以分配给short变量,byte数据类型在short类型范围内。
Java有一个名为Short的类,它定义了两个常量(Short.MAX_VALUE和Short.MIN_VALUE)来表示short数据类型的的最大值和最小值。
代码如下(示例):
short max = Short.MAX_VALUE;
short min = Short.MIN_VALUE;
1.1.3 整型(int)
Java中int数据类型是32位有符号数据类型。
int数据类型的变量需要32位内存存储。
有效范围是-2,147,483,648至2,147,483,647(-231至231 - 1)。
范围内的所有整数称为整数字面量。
例如,6、7、-19等是int的整数字面值。
一个整数字面量可以分配给一个int变量,如num1,
代码如下(示例):
int num1 = 21;
整数字面量可以用不同的进制表示
十进制数字格式
八进制数字格式
十六进制数字格式
二进制数格式
其中八进制表示当整数字面量以零开始并且至少有两个数字时。
以下代码行将十进制值17(八进制为021)分配给num1:
// 021 is in octal number format, not in decimal
int num1 = 021;
以下两行代码具有将值17分配给变量num1的相同效果:
以下值没有前导零,它是十进制数字格式。
int num1 = 17;
以下值具有前导零,因此它是一个八进制数字格式。八进制中的021与十进制中的17相同。
int num1 = 021;
八进制格式的int字面值必须至少有两位数字,并且必须以零开始以作为八进制数处理。
数字0在十进制数格式中被视为零,并且以八进制数格式将00视为零。
十六进制数字格式的所有int字面量都以0x或0X开头,它们必须至少包含一个十六进制数字。
十六进制数字格式使用16位数字,0-9和A-F(或a-f)。
字母A至F的情况无关紧要。
以下是以十六进制格式使用int字面量的示例:
int num1 = 0x123;
int num2 = 0xdecafe;
int num3 = 0x1A2B;
int num4 = 0X0123;
可以使用二进制数字格式表示一个int字面量。
所有二进制数字格式的int文字以0b或0B开头。
以下是使用二进制数字格式的int字面量的示例:
int num1 = 0b10101;
int num2 = 0b00011;
int num3 = 0b10;
int num4 = 0b00000010;
Java有一个名为Integer的类,它定义两个常量来表示int数据类型的最大值和最小值,即Integer.MAX_VALUE和Integer.MIN_VALUE。例如,
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
1.1.4 长整型(long)
Java中long数据类型是64位有符号数据类型。
当超出int数据类型的范围时可以使用。
范围是 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (-263 to 263 - 1),该范围内的所有整数称为long类型的整数字面量。 long类型的整数常数总是以L或小写l结尾。
以下是使用long类型的整数字面量的示例:
long num1 = 0L;
long num2 = 4L;
long mum3 = -3;
long num4 = 8;
long num5 = -1L;
长整型字面量
long类型的整数字面量可以用八进制,十六进制和二进制格式表示。例如,
long num1;
num1 = 25L; // Decimal format
num1 = 031L; // Octal format
num1 = 0X19L; // Hexadecimal format
num1 = 0b11001L; // Binary format
当long 字面量分配给long类型的变量时,Java编译器检查要分配的值,并确保它在长数据类型的范围内;否则会产生编译时错误。
注意
从int到long的赋值是有效的,因为可以存储在int变量中的所有值都可以存储在long变量中。但是,反过来就不行啦。
最好不要将存储在long变量中的值分配给int变量,有存在值溢出的可能性,当需要long变量的值赋给int变量,在Java中可以使用“cast”,如下所示:
num1 = (int)num2;
Java有一个类Long,它定义了两个常量(Long.MAX_VALUE和Long.MIN_VALUE)来表示长数据类型的最大值和最小值。
long max = Long.MAX_VALUE;
long min = Long.MIN_VALUE;
1.2 浮点类型
浮点类型是带有小数部分的数据类型,也叫实型。浮点型数据包括单精度浮点型(float)和双精度浮点型(double),代表有小数精度要求的数字。单精度浮点型(float)和双精度浮点型(double)之间的区别主要是所占用的内存大小不同,float 类型占用 4 字节的内存空间,double 类型占用 8 字节的内存空间。双精度类型 double 比单精度类型 float 具有更高的精度和更大的表示范围。
Java中默认的浮点型为 double,例如,11.121 和 1.3335 都是 double 型数值。如果要说明一个 float 类型数值,就需要在其后追加字母 f 或 F,如 11.21f 和 1.2225F 都是 float 类型的常数。
当评估需要分数精度的表达式时,使用浮点数(也称为实数)。
包含小数部分的数字称为实数,例如,3.3,-1.29等。
Java支持浮点数格式。 Java使用IEEE 754浮点标准存储实数。
它们的宽度和范围如下所示:
名称 | 宽度以位为单位 | 近似范围 |
---|---|---|
double | 64 | 4.9e-324〜1.8e + 308 |
float | 32 | 1.4e-045〜3.4e + 038 |
1.2.1 单精度浮点型(float)
Java中float使用32位来存储浮点数。
浮点数也称为单精度浮点数。它可以表示一个小到1.4×10-45和大到3.4×1038的大小的实数。可以是正的或者负的。所有以f或F结尾的实数称为浮点文字。浮点文本可以用以下两种格式表示:
- 十进制数字格式
- 科学计数法
浮点字面量
十进制数字格式的浮点文本示例如下:
float f1 = 1F;
float f2 = 2.F;
float f3 = 3.0F;
float f4 = 4.51F;
float f5 = 5.0F;
float f6 = 56.78f;
在Java中,实数可以使用科学记数法表示为浮点文本。科学记数法中,数字32.5×10-1 被写为32.5E-1。作为浮点文本,Java中可以写作32.5E-1F或32.5E-1f。
所有以下浮点文本表示相同的实数4.25:
4.25F
42.5E-1F
0.425E+1F
0.425E1F
0.0425E2F
0.0425e2F
4.25E0F
float数据类型定义两个零:+ 0.0F(或0.0F)和-0.0F。 + 0.0F和-0.0F都被认为是相等的。
float数据类型定义了两个无穷大:正无穷大和负无穷大。
未定义浮动上的一些操作的结果。例如,将0.0F除以0.0F是不确定的。
不确定的结果由称为NaN(非数字)的float数据类型的特殊值表示。
Java有一个 Float 类,它定义了三个常量,分别表示正数无穷大,负无穷大和浮点数据类型的NaN。
下表列出了这三个浮动常量及其含义。
常量 | 含义 |
---|---|
Float.POSITIVE_INFINITY | float类型的正无穷大 |
Float.NEGATIVE_INFINITY | float类型的负无穷大 |
Float.NaN | 不是类型float的数量 |
Float.MAX_VALUE | 可以在float变量中表示的最大正值。 这等于3.4×10 38 (约)。 |
Float.MIN_VALUE | 大于零的最小正值,可以在float变量中表示。 这等于1.4×10 -45 。 |
在将float值分配给任何整数数据类型int,long,byte,short或char的变量之前,必须强制转换该值。
将int和long赋值为float可能会导致精度损失。
1.2.2 双精度浮点型(double)
Java中double数据类型使用64位来存储浮点数。double值也称为双精度浮点数。
范围在4.9 x 10-324和大到1.7 x 10308。可以是正或者负的。所有实数被称为双精度字面量。双精度字面量可以可选地以d或D结尾,例如1.27d。后缀d或D在双精度字面量中是可选的。19.7和19.7d代表相同的双精度字面量。
双精度字面量
双精度字面值可以用以下两种格式表示:
十进制数字格式
科学计数法
十进制数字格式的双精度字面值示例如下: double d1 = 8D;
double d1 = 8D ;
double d2 = 8.;
double d3 = 8.0;
double d4 = 8.D;
double d5 = 78.9867;
double d6 = 45.0;
8是一个int字面量,而8D,8和8.0是双精度字面量。
我们还可以使用科学记数法表达双精度字面量。
double d1 = 32.5E-1;
double d2 = 0.325E+1;
double d3 = 0.325E1;
double d4 = 0.0325E2;
double d5 = 0.0325e2;
double d6 = 32.5E-1D;
double d7 = 0.325E+1d;
double d8 = 0.325E1d;
double d9 = 0.0325E2d;
注意
double数据类型定义了两个零,两个无穷大和一个NaN。它们由Double类中的常量表示。
下表列出了这些常量及其含义。
常量 | 含义 |
---|---|
Double.POSITIVE_INFINITY | 正无穷大类型double |
Double.NEGATIVE_INFINITY | 负无穷大类型double |
Double.NaN | 不是类型double的数量 |
Double.MAX_VALUE | 可以在双变量中表示的最大正值。这等于1.7 x 10308。 |
Double.MIN_VALUE | 大于零的最小正值,可以在双变量中表示。 这等于4.9 x 10-324。 |
可以将所有整型类型(int,long,byte,short,char)和float的值分配给双精度数据类型的变量,而不使用显式强制转换。
int num1 = 15;
double salary = num1;
salary = 12345;
double bigNum = Double.MAX_VALUE;
bigNum = 1234L;
double justAChar = "A";
double dInf = Double.POSITIVE_INFINITY;
double dNan = Double.NaN;
在将double值分配给任何整数数据类型(int,long,byte,short或char)的变量之前,必须将其转换为整数类型。
2. 字符型
2.1 字符类型(char)
Java中char数据类型是16位无符号Java基元数据类型。表示Unicode字符。char是无符号数据类型。因此,char变量不能为负值。范围为0到65535。
字符字面量
字符字面量表示char数据类型的值。 Java中的字符字面量可以用以下格式表示:
- 用单引号括起来的字符
- 作为字符转义序列
- 作为Unicode转义序列
- 作为八进制转义序列
- 字符可以通过用单引号括起来表示。
以下代码段使用此形式为char变量赋值:
char c1 = 'A';
char c2 = 'L';
char c3 = '5';
char c4 = '/';
用双引号括起来的字符序列是一个String字面量。不能将字符串字面量分配给char变量,即使String字面量只有一个字符。
字符转义序列
字符字面量可以表示为字符转义序列。字符转义序列以反斜杠开头,后面紧跟一个字符,并且都用单引号括起来。
有八个预定义的字符转义序列,如下表所列。
字符转义序列 | 描述 |
---|---|
‘\n’ | 换行 |
‘\r’ | 回车 |
‘\f’ | 表单Feed |
‘\b’ | 退格 |
‘\t’ | 标签 |
‘\’ | 反斜杠 |
‘"’ | 双引号 |
‘’’ | 单引号 |
Java中只有八个字符转义序列。我们不能定义你自己的字符转义序列。
char c1 = "\n"; // Assigns a linefeed to c1
char c2 = "\""; // Assigns double quote to c2
char c3 = "\a"; // A compile-time error. Invalid character escape sequence
Unicode
字符字面量可以表示为“\ uxxxx”形式的Unicode转义序列。 \u 表示Unicode转义序列的开始,xxxx正好表示四个十六进制数字。由xxxx表示的值是字符的Unicode值。因为字符’A’有65 65十进制可以用十六进制表示为41的值的Unicode值。所以,字符’A’可以用Unicode转义序列表示为’\ u0041’。
以下代码将相同的字符“A”分配给char变量c1和c2:
char c1 = "A";
char c2 = "\u0041"; // Same as c2 = "A"
字符文字可以表示为形式为’\ nnn’的八进制转义序列。n是八进制数(0-7),八进制转义序列的范围是’\ 000’到’\ 377’。因为八进制数377与十进制数255相同,所以,使用八进制转义序列,我们可以表示Unicode代码范围从0到255个十进制整数的字符。
Unicode字符集(代码范围0到65535)可以表示为Unicode转义序列(’\ uxxxx’)。
当给字符变量分配一个int字面量时,char变量表示其Unicode代码等于该字符串表示的值的字符。
字符’a’的Unicode代码是97.十进制值97被表示为141八进制和61十六进制。
下面的代码显示了如何使用int字面值97来表示Unicode字符’a’。
char c1 = 97; // Same as
c1 = "a";
c1 = "\141";
c1 = "\u0061";
演示char变量:
public class Main {
public static void main(String args[]) {
char ch1, ch2;
ch1 = 88; // code for X
ch2 = "Y";
System.out.print("ch1 and ch2: ");
System.out.println(ch1 + " " + ch2);
}
}
ch1 被分配值88,它是对应于字母X的ASCII和Unicode值。ASCII字符集占据Unicode字符集中的前127个值。
例2
char旨在保存Unicode字符,但它也可以用作整数类型,您可以在其上执行算术运算。
例如,您可以将两个字符添加在一起,或者增加一个字符变量的值。
public class Main {
public static void main(String args[]) {
char ch1;
ch1 = "X";
System.out.println("ch1 contains " + ch1);
ch1++; // increment ch1
System.out.println("ch1 is now " + ch1);
}
}
在程序中,首先给ch1赋值X.接下来,ch1递增。这导致ch1包含Y,ASCII(和Unicode)序列中的下一个字符。
上面的代码生成以下结果。
3. 布尔类型
3.1 布尔类型(boolean)
Java中布尔数据类型只有两个有效值:true和false。这两个值称作布尔值字面量。
boolean done; // Declares a boolean variable named done
done = true; // Assigns true to done
布尔变量不能转换为任何其他数据类型,反之亦然。boolean 是所有关系运算符返回的类型,如<a。boolean 是控制控制语句的条件表达式所需的类型,例如if、for和while。
演示布尔类型:
public class Main {
public static void main(String args[]) {
boolean b;
b = false;
System.out.println("b is " + b);
b = true;
System.out.println("b is " + b);
b = false;
if (b)
System.out.println("This is not executed.");
// outcome of a relational operator is a boolean value
System.out.println("10 > 9 is " + (10 > 9));
}
}
上面的代码生成以下结果。
总结
文章可能会后续慢慢补充完善
著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。