一、数据类型
1、整型 :没有小数部分的数值,可以是负数
byte | 8位(1个字节) |
short | 16位(2个字节) |
int | 32位(4个字节) |
long | 64位(8个字节) |
在java程序中,通常情况下,默认整数为int类型;long类型的整数需要加上后缀L或l来表示
2.浮点类型:含有小数部分的数值,可以是负数
float | 32位(4个字节) |
double | 64位(8个字节) |
在java程序中,通常情况下,默认浮点类型为double,double表示这种类型的数值精度是float类型的两倍(被称为双精度数值);float数据类型的数值需要加上后缀F或l来表示(单精度数值),都会产生误差,不过double相比float误差小一点。
所有的浮点值计算都遵循IEEE 754规范。来看下面的例子:
package com.yh;
import java.math.BigDecimal;
/**
* @Author ASUS
* @Date 2019/8/10 12:28
* @Description 数据类型、变量和常量
* @Version 1.0
**/
public class DataType {
public static void main(String[] args){
int a =12;
int b = -5;
Double c = 0.0;
float d = 3.1F;
int e =0;
float f = 3F;
Double g = 4.6;
long h =4444444L;
Double i = 123E2;
//运行时会报错 因为整数运算中 分母不能为0
// System.out.println(a/e);
/*
运行结果为正无穷大(Infinity)
当不同数据类型的数值进行运算,计算结果自动转为字节较大的类型
此处结果就将int类型变成了Double类型 所以程序可以运行
*/
System.out.println(a/c);
// 运行结果负正无穷大(-Infinity)计算结果自动转为Double类型
System.out.println(b/c);
// 运行结果为NaN (不是一个数字)
System.out.println(c/c);
// 运行结果为NaN (不是一个数字)
System.out.println(c/e);
//运行结果为: 这是一个NaN
if(Double.isNaN(c/e)){
System.out.println("这是一个NaN");
}else{
System.out.println("这不是一个NaN");
}
// 运行结果为0.099999905
System.out.println(d-f);
// 运行结果为-0.40000000000000036
System.out.println(g+b);
/* 运行结果为正无穷大(Infinity)
本来在int类型里面计算分母不能为0,而这里的运算结果是(Infinity)
*/
System.out.println(f/e);
//整型数据计算 结果只会保留整数部分 所以结果为 -2
System.out.println(a/b);
//运行结果为正无穷大(Infinity)
System.out.println(h/c);
//运行结果为 12300.0 i使用了科学计数法 且只有浮点型数据可以使用科学计数法
System.out.println(i);
}
}
部分例子分析:
(d-f)、(g+b)运算,结果总是产生误差,我们理想的结果应该是(d-f = 0.1)、(g+b = -0.4)。这种误差的主要原因是浮点数值采用二进制系统来表示,但是在二进制系统中无法精确的表示分数(1/10),就好比在十进制中无法精确表示分数(7/10)一样,因此总会产生一些误差。
因此数值计算精确度要求很高时,不能使用浮点数值,应该使用BigDecimal这个类。
数值计算总结如下:
1、当操作数据类型为整型时,遵循数学规定,分母不能为0;
2、当多种数据类型操作时,计算结果会自动提升数据类型为较大的数据类型;
3、当整型与浮点型数据进行计算时,会把整型看成浮点型进行计算,结果为浮点型;
4、浮点数据类型不能进行精确计算,会产生误差,如果在计算中不允许有任何的舍入操作,应该使用BigDecimal这个类;
5、三个特殊的浮点数值:Double.POSITIVE.INFINITY(正无穷大)、Double.NEGATIVE.INFINITY(负无穷大)、Double.NaN(NaN,不是一个数字);
6、所有的NaN(不是一个数字)的值都是不相同的,但是可以通过Double.isNaN()方法来判断一个数是否为NaN;
7、只有浮点型数值才能使用科学计数法,如123E2表示(12300.0)
3.char类型
总的来说,char数据类型是一个采用UTF-16编码表示的Unicode码点的代码单元。char类型的数据要使用单引号括起来。
转义序列 | 名称 | Unicode值 |
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\' | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
关键名词解释:
码点(code point):与一个编码表中的某个字符对应的代码值。在Unicode标准中,码点采用十六进制书写,并加上前缀U+,比如U+0041就是拉丁字母A的码点。
基本的多语言级别:Unicode的码点可以分为17个代码级别(code plane),第一个代码级别称为基本的多语言级别(basic multilingual plane),码点从U+0000到U+FFFF,其中包括经典的Unicode的代码;其余的16个级别码点从U+10000到U+10FFFF,其中包括一些辅助字符(supplementary character)。
代码单元:UTF-16编码采用不同长度的编码表示所有Unicode码点。在基本的多语言级别中,每个字符用16位表示,通常被称为代码单元(code unit)。
要想弄清楚char类型,必须要了解Unicode编码机制。在Unicode出现之前,就有很多种编码标准,比如美国的ASCII、西欧语言中的ISO 8859-1、俄罗斯的KOI-8、中国的GB 18030和BIG-5等。由于各种编码的规范不统一,一是导致一个代码值表示不同的字母,产生歧义;二是采用大字符集的语言其编码长度有可能不同,例如有些常用字符采用单字节编码,而另一些字符则需要两个或者更多个字节。
为了解决这些问题,诞生了Unicode编码。在20世纪80年代开始启动设计工作,当时人们都认为两个字节的代码宽度可以满足世界所有语言字符的编码,且有足够空间用于以后的扩展。但是过了一段时间,由于增加了大量汉语、日语和韩语中的表意文字,Unicode字符超过了65536个,使得16位的char类型已经不能满足所有Unicode的需要。
为了解决这个问题,UTF-16编码采用不同长度的编码表示所有的Unicode码点。在基本的多语言级别中,辅助字符采用一对连续的代码单元进行编码,而字符用16位表示。这样构成的编码值落入基本的多语言级别中空闲的2048字节内,通常被称为替代区域(surrogate area)[ U+D800 ~ U+DBFF用于第一个代码单元,U+DC00 ~ U+DFFF用于第二个代码单元 ]。通过这样的设计,我们可以从中迅速知道一个代码单元是一个字符集的编码,还是一个辅助字符的第一或者第二部分。
强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。比如:? is a test。这个字符串中,?使用UTF-16编码需要两个代码单元,我们可能会把?的第二个代码单元误认为是空格。
4.boolean类型
boolean(布尔)类型有两个值:true和false,用来判定逻辑条件。整型值与布尔值不能进行转换。
二、数值类型转换
如上图所示。 黑色实心箭头表示默认数值转换类型,无信息丢失;红色虚线箭头表示精度可能会损失。
在java中,必要的时候像int类型会自动转换为double类型,但有的时候也需要将double转换为int。java允许这种数值之间的转换,当然,这种转换可能会丢失一些信息。
一般来说,当把一个取值范围小的数值或变量直接赋给另一个取值范围大的变量时,系统可以进行自动类型转换。反之则需要进行强制类型转换,语法如下:
大数据类型 变量1 = 变量值;
小数据类型2 变量2 =(小数据类型2)变量1;
举例:
package com.yh;
/**
* @Author ASUS
* @Date 2019/8/11 9:57
* @Description 数据类型转换
* @Version 1.0
**/
public class ChangeType {
public static void main(String[] args) {
int a =166;
//将int类型强制转换成byte类型
byte aa = (byte) a;
//输出结果为:-90 典型的溢出
System.out.println(aa);
double b =65659999994.0443;
/*
如果将超过int类型存储最大值的double类型数据强制转换为int类型
只能输出int的最大值
输出结果为 2147483647
*/
int bb =(int) b;
System.out.println(bb);
double c =16.66;
/*
如果将未超过int类型最大值(2147483647)的double类型数据强制转换为int类型
输出的结果为double类型数据的整数部分,小数部分被舍去
输出结果为 16
*/
int cc = (int) c;
System.out.println(cc);
double d =21.55;
/*
如果想对浮点数进行四舍五入操作 使用Math.round()方法
输出结果为 22
*/
int dd = (int) Math.round(d);
System.out.println(dd);
}
}
三、常量
在java中,使用final来指示常量。final表示这个变量只能被赋值一次,一旦赋值就不能再修改,习惯上,定义常量名全用大写。
四、变量
在java中,每个变量都对应一种类型。声明变量时,变量的类型位于变量名之前,以分号结束。如:
int number;
String name;
变量名必须是一个以大小写字母、_、$开头并由大小写字母、_、$或数字组成的序列。不能使用特殊字符、java保留字和空格,大小写敏感。
声明一个变量后,必须使用赋值语句变量进行显式初始化,未初始化的变量不能使用。