Java-数据类型详解(基础篇)
⽂章⽬录
Java-数据类型详解(基础篇)
Java是⼀种强数据类型语⾔。这就意味着必须为每⼀个变量声明⼀种类型。在Java中变量的数据类型分为两种,即基本数据类型和引⽤数据类型。如图所⽰,其中,8种基本数据类型是Java语⾔内嵌的,在任何操作系统中都具有相同⼤⼩和属性,⽽引⽤数据类型是Java程序中由编程⼈员⾃⼰定义的变量类型。
本篇主要涉及Java中的基本数据类型(primitive type),其中有4种整型、2种浮点型、⼀种⽤于表⽰Unicode编码的字符单元的字符类
型char和⼀种表⽰真值的boolean类型。
注释:Java有⼀个能够表⽰任意精度的算术包,通常称为“⼤数值”,但其并不是⼀种新的Java类型。⽽是⼀个Java对象。
整型
整型⽤于表⽰没有⼩数部分的数值。它允许是负数。Java提供了4种整型,具体如下所⽰:
类型存储需求(所占字节⼤⼩)内存位取值范围定义变量举例int432-2 147 483 648 ~ 2 147 483 647(正好超过20亿)int x = -100; short216-32768 ~ 32767short m = 25;
long864-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807long n = 440L;
byte18-128 ~ 127byte a = -5;
在通常情况下,int类型最常⽤。byte和short类型主要⽤于特定的场合。例如,底层的⽂件处理或者需
要控制占⽤存储空间量的⼤数组。在Java中,数据的范围与运⾏Java的代码的机器⽆关,从⽽解决了软件从⼀个平台移植到另外⼀个平台,或者在同⼀个平台中的不同操作系统之间进⾏移植给程序员带来的诸多问题。
C/C++注释:与此相反,int和long等数据类型的⼤⼩与⽬标平台相关。C和C++程序需要针对不同的处理器选择最为⾼效的整型,在8086这样的16位处理器上整型数值(int)占2个字节;不过在32位处理器上和64位处理器上(⽐如:Pentium或SPARC)上,整型数值(int)则为4个字节。类似的,在32位处理器上long值为4字节,在64位处理器上则为8个字节。这样就有可能造成⼀个在64位处理器上运⾏很好的C程序在32位系统运⾏却发⽣整数溢出(其实C/C++中也有解决办法,只是⽐较繁琐)。由于Java程序必须保证在所有机器上都能够运⾏得到相同的运⾏结果,所以各种数据类型的⼤⼩及其取值范围必须固定。()
长整型(long)数值有⼀个后缀L或者l(例如4400000000L)。⼗六进制数值有⼀个前缀0X或者0x(例如:0XAFFC)。⼋进制有⼀个前
缀0(例如:070对应的⼗进制为:56)。很显然,⼋进制表⽰法⽐较容易混淆,所以建议不要使⽤⼋进制。
在为⼀个long类型的变量赋值时需要注意⼀点,如果赋的值未超过int类型的取值范围。则可以省略字
母L(⼩写l),如果超过了int所能表⽰的范围,则必须要加字母L(⼩写l)。
public class Demo {
public static void main(String[] args) {
long a = 2147483648; //a = int(MAX) + 1, ERROR 没有加L/l
System.out.println("a = "+a);
}
}
程序运⾏结果:
Demo.java:3: 错误: 整数太⼤
long a = 2147483648; //a = int(MAX) + 1
^
1 个错误
从Java 7开始,加上前缀0b或0B就可以表⽰⼆进制!(例如:0b101对应的⼗进制为9)。另外,同样是从Java 7开始,还可以为数字字⾯量加下划线,(例如:1_000_000或者0b1111_0100_0010_0100_0000表⽰⼗进制的1 000 000)。这些下划线只是为了让⼈更易读懂,Java编译器会去除这些下划线。
public class Demo {
public static void main(String[] args) {
System.out.println("0XAFFC: "+0XAFFC);
System.out.println("070: "+070);
System.out.println("1_000_000: "+1_000_000);
System.out.println("0b1111_0100_0010_0100_0000: "+0b1111_0100_0010_0100_0000);
}
}
程序运⾏结果:
0XAFFC: 45052
070: 56
1_000_000: 1000000
0b1111_0100_0010_0100_0000: 1000000
注意,Java没有任何⽆符号(unsigned)形式的int、long、short或byte类型()。
关于整型类型的说明总结:
1. Java 语⾔规定,直接写出的整数被认为是int 类型,如5,-3等。
2. 描述byte 类型的数据通常要使⽤强制类型转换,如(byte)10;
3. 描述short 类型的数据通常需要使⽤强制类型转换,(short)10;
4. 描述long 类型的整数常数要在数字后加上字母L 或l ,如123L 。
5. Java 中还可以描述⼆进制、⼋进制和⼗六进制的数。⼆进制的数以0b 或0B 开头,⼋进制数以0开头,⼗六进制以0x 或0X 开头。
如0b1001表⽰⼆进制的9,010表⽰⼋进制的8,0x10表⽰⼗六进制的16。
浮点类型
浮点类型⽤于表⽰有⼩数部分的数值。在Java 中有两种浮点类型。具体见下表
类型存储需求(所占字节⼤⼩)
内存位取值范围
float 432⼤约double
8
64
⼤约double 表⽰这种类型的数值精度是float 类型的两倍(有⼈称之为双精度数值)。绝⼤部分应⽤程序都采⽤double 类型。在很多情况
下,float 类型的精度很难满⾜需求。实际上。只有很少的情况使⽤float 类型,例如,需要单精度数据的库,或者需要存储⼤量的数据。
float 类型的数值有⼀个后缀F 或者f (例如:3.14F )。没有后缀F 的浮点数(3.14)默认为double 类型。当然,也可以在浮点数值后⾯添加后
缀D 或d (例如:3.14D )。
public class Demo {
public static void main(String[] args) {
Float f = 3.14F; //Float 与float 此处并⽆实际区别 Double d = 3.14; //Double 与double 此处也并⽆实际区别
System.out.println("3.14F 的数据类型⼤⼩为:"+f.BYTES+"Bytes"); System.out.println("3.14 的数据类型⼤⼩为:"+d.BYTES+"Bytes"); }}
程序运⾏结果:
3.14F 的数据类型⼤⼩为:4 Bytes 3.14 的数据类型⼤⼩为:8 Bytes
警告:
浮点数值不适⽤于⽆法接受舍⼊误差的计算中。例如:
public class Demo {
public static void main(String[] args) { System.out.println("(2.0-1.1)="+(2.0-1.1)); }}
运⾏结果是:
(2.0-1.1)=0.8999999999999999
⽽不是⼈们想象的。这种舍⼊误差的主要原因是浮点数值采⽤⼆进制系统表⽰,⽽在⼆进制系统中⽆法精确地表⽰分数。这就好像⼗进制⽆法精确地表⽰分数⼀样。如果在数值计算中不允许有任何的舍⼊误差,就应该避免使⽤浮点数值。
±3.40282347E +38F (有效位数为6~7位)±1.79769313486231570E +308(有效位数为15位)
0.9101
31
旁注:Ariane5—浮点溢出的⾼昂代价
将⼤的浮点数转换成整数是⼀种常见的程序错误来源。1996年6⽉4⽇,Ariane 5⽕箭初次航⾏,⼀个浮点错误便产⽣了灾难性的后果。发射后仅仅37秒,⽕箭偏离了它的飞⾏路径,解体并且爆炸。⽕箭上载有5亿美元的通信卫星。具体细节,请⾃⾏百度。
关于浮点类型的说明总结:
1. Java 语⾔规定,直接写出的浮点数被认为是double 类型,如37.3,-3.69等。
2. 可以通过在数字后⾯加上字母D 或d 来表明当前数据是double 类型的实数常量,如37.4D ,-
3.1d 等。对于double 来说,不写后缀也
是可以的。
3. 描述float 类型的浮点数值必须在数字后加上字母F 或f ,如2.5F ,3.6f 等。
4. float 类型的变量保留位有效数字,double 类型的变量保留位有效数字,实际精度取决于具体数值。
char 类型
char 类型原本⽤于表⽰单个字符(C/C++)。不过,现在的情况已经有所变化。如今,有些Unicode 字符可以⽤⼀个char 值描述,另外⼀
些Unicode 字符则需要两个char 值。有关的详细阅读请参考**《Java核⼼技术 第10版》的3.3.4 Unicode和char类型**。char 类型的字⾯量值要⽤单引号括起来。(例如:‘A’是编码值为所对应的字符常量。它与“A”不同,“A”是包含⼀个字符A 的字符串。)
public class Demo {
public static void main(String[] args) { char ch1 = 'A'; char ch2 = "A"; }}
程序运⾏结果:
Demo.java:4: 错误: 不兼容的类型: String ⽆法转换为char char ch2 = "A"; ^1 个错误
char 类型的值也可以表⽰为⼗六进制值,其范围从\u0000到\Uffff 。例如:\u2122表⽰注册符号()。
除了转义序列\u 之外,还有⼀些⽤于表⽰特殊字符的转义序列,如图所⽰,所有这些转义序列都可以出现在加引号的字符字⾯量或字符串中。例如,'\u2122'或"Hello\n"。转义序列\u 还可以出现在加引号的字符常量或字符串之外。(⽽其他所有转义序列不可以)。例如:
java核心技术有哪些public static void main(String\u005B\u005D args)
就完全符合语法规则,\u005B 和\u005D 是[和]的编码。
public class Demo {
public static void main(String[] args) { char ch1 = 'A';
System.out.println("字符A 的Unicode 编码是:"+(0+'A')); System.out.println('\u2122'); }}
程序运⾏⽰例:
字符A 的Unicode 编码是:655™
6~71565TM
转义序列名称Unicode值
\b退格\u0008
\t制表\u0009
\n换⾏\u000a
\r回车(不换⾏)\u000d
\"双引号\u0022
\’单引号u0027
\\反斜杠\u005c
警告:
Unicode转义序列会在解析代码之前得到处理。例如,"\u0022+\u0022"并不是⼀个由引号(U+0022)包围加号构成的字符串。实际上,\u0022会在解析之前转换为",这会得到“” +“”,也就是⼀个空串。
public class Demo
{
public static void main(String[] args)
{
System.out.println("\u0022+"\u0022+"前⾯是空的");
}
}
程序运⾏⽰例:
前⾯是空的
关于字符类型的说明总结:
1. Java语⾔中的字符采⽤Unicode编码,⼀个字符在内存中占两个字节空间。这使得Java可以使⽤char类型描述更多种类的字符,包括
英⽂字母、标点符号、汉字等等。
2. 每个字符类型的数据必须⽤单引号扩起来,⼀个字符类型的变量只能存放⼀个字符。如语句char ch1 = 'a',ch2 = '*',ch3 = '好';。
3. 字符类型变量的内存空间实际存储的是字符编码,即char类型的变量可以与整数类型的变量通⽤。
如语句char ch = 97;相当于给变
量ch存储了字符编码为97的⼩写字母a。
public class Demo {
public static void main(String[] args) {
char ch = 97;
System.out.println("ch = "+ch);
}
}
程序运⾏结果:
ch = a
4. Java中的字符类型变量可以存储转义字符。
boolean类型
boolean(布尔)类型有两个值:false和true,⽤来判断逻辑条件。不能存储其他内容。整型值和布尔值之间不能进⾏相互转换,因为Java已经把boolean类型作为了基本数据类型。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论