(复习笔记)java基本数据类型
(复习笔记)java基本数据类型
flowchart LR
java("java数据类型")
pri("基本数据类型")
ref("引用数据类型")
java-->pri
java-->ref
digit("数值型")
bool>"布尔型,boolean,1bit,true/false"]
string("字符型")
pri-->digit
pri-->string
pri-->bool
int0("整型")
float0("浮点型")
digit-->int0
digit-->float0
byte>"byte,1个字节"]
short>"short,2个字节"]
int>"int,4个字节"]
long>"long,8个字节"]
int0-->byte
int0-->short
int0-->int
int0-->long
float>"float,4个字节"]
double>"double,8个字节"]
float0-->float
float0-->double
char>"char,2个字节"]
str["String,字符串"]
string-->char
char .->str
clazz>"class类"]
interface>"interface接口"]
array>"array数组"]
ref-->clazz
ref-->interface
ref-->array
classDef class1 fill:lightblue
classDef class2 fill:lightgreen
class byte,short,int,long,float,double,char,bool class1
class clazz,interface,array class2
浮点类型问题
浮点类型数据存在舍入损失问题,导致它们并不严谨,比如在判断两个浮点数据是否相等时,可能得到错误的结果。
float f1 = 0.1f;
double f2 = 1/10d;
System.out.println("f1 = "+f1);
System.out.println("f2 = "+f2);
System.out.println("f1=?f2:"+(f1==f2));
/*
输出结果是:
f1 = 0.1
f2 = 0.1
f1=?f2:false
*/
又比如:
float f1 = 1000000000000f;
float f2 = f1 + 1;
System.out.println("f1 = "+f1);
System.out.println("f2 = "+f2);
System.out.println("f1=?f2:"+(f1==f2));
/*
输出结果是:
f1 = 1.0E12
f2 = 1.0E12
f1=?f2:true
*/
因此,在需要严谨进行浮点数据处理时,不能够直接使用java的浮点数据类型。不过有替代方法,比如使用BigDecimal;
字符串常量和字符串类String的引用
String str1 = "123";
String str2 = "123";
System.out.println("str1=?str2: "+(str1==str2));
String str3 = new String("333");
String str4 = new String("333");
System.out.println("str3=?str4: "+(str3==str4));
/*
输出结果为:
str1=?str2: true
str3=?str4: false
*/
其实这里比较的并不是字符串里的内容是否相同,而是字符串类对象引用的内存地址是否相同。
str1和str2,通过这种赋值方式,”123“被存在常量池中。str1和str2都引用了这个被存在常量池中的”123“,所以它们的引用地址相同,因此str1==str2结果为true。
而str3和str4,由于它们是通过new创建的,是两个不同的新对象,因此一般分别引用了两块不同的内存空间,所以str3==str4结果为false。但是,有说法是,有的JVM版本可能会出现true,如果该版本JVM因为字符串比较短而进行了优化,将传入的参数"333"放进了常量池,那么这两个new出来的对象可能也会引用同一块地址空间,不过作为新手,我并未见过这种情况。
浙公网安备 33010602011771号