数据类型:数据在内存中的存储形式。下面来说一下Java的数据类型。
一、Java是一种强类型语言
在计算机科学中,编程语言的类型系统决定了变量和函数参数的类型是在编译时确定还是在运行时确定。根据类型系统的不同,编程语言可以分为强类型语言、弱类型语言、静态类型语言和动态类型语言。这些分类对于理解编程语言的工作原理和编写高效代码至关重要。
强类型语言要求变量在使用之前必须明确声明其类型,并且在整个生命周期中保持不变。类型错误在编译时就会被捕获,不允许隐式转换或动态更改类型。这种严格的数据类型检查有助于减少运行时错误,提高代码可读性和维护性。Java和C++是典型的强类型语言。
相比之下,弱类型语言允许在运行时进行类型检查和转换,这使得代码更加灵活。然而,这也可能导致运行时错误和数据不一致性。Python和JavaScript是常见的弱类型语言。
二、基本数据类型
1、byte
byte 数据类型是8位、有符号的,以二进制补码表示的整数;byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
其最小值为-128,最大值为127。
例题:
public class Test {
public static void main(String []args) {
byte a = 127;
byte b = 1;
byte c = (byte)(a+b);
System.out.println(c); //最终结果为-128
}
}
2、short
short 数据类型是 16 位、有符号的以二进制补码表示的整数。Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是 0。
3、int
int 数据类型是32位、有符号的以二进制补码表示的整数;一般地整型变量默认为 int 类型;默认值是 0 ;
4、long
long 数据类型是 64 位、有符号的以二进制补码表示的整数;注意在定义时,为了避免与整数常量混淆,我们应该在整数后面添加一个大写字母“L”或小写字母“l”作为标识。
5、float
float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;注意:初始化float变量的时候,后面要加上"f"。如果不加"f",则系统会默认该变量为double类型。
6、double
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
浮点型举例:
public class HelloWorld {
public static void main(String []args) {
System.out.println(1.2-1);
}
} //结果为0.19999999999999996
解析:将0.2变为二进制,是无限循环的。由于double类型的数值位为52位所以会出现数据丢失、精度问题。
那么有什么办法可以进行精确计算?这时就需要用到BigDecimal中的方法。(补充见末尾)
import java.math.BigDecimal;
public class client{
public static void main(String[]args){
BigDecimal b1=new BigDecimal(Double.toString(1.2));
BigDecimal b2=new BigDecimal(Double.toString(1));
Double value = b1.subtract(b2).doubleValue();
System.out.println(value);
}
}
7、char
字符类型实际上是一个16位无符号整数,这个数对应字符的编码。java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位。char 类型是一个单一的 16 位 Unicode 字符,可以储存任何字符;任何一个字符都可以转化为一个整数,整数的范围是0-65535
举例
public static void main(String[] args) {
char c1 = '中';
char c2 = '\u4e2d'; //注释:’4e2d‘为’中‘所对应的16位Unicode编码
System.out.println(c1);
System.out.println(c2);
} //最后的输出结果是两个字符 中
public static void main(String[] args) {
int a = '中';
System.out.println(a);
} //结果为20013
public static void main(String[] args) {
char c = 69;
System.out.println(c);
} //结果为字符 E
注意:对于不方便输出的字符可以采用转义字符表示
\n | 表示回车 |
\r | 表示换行符 |
\\ | 表示反斜杠( \ ) |
\' | 表示单引号( ' ) |
\" | 表示双引号( " ) |
8、boolean
boolean数据类型表示一位的信息;只有两个取值:true 和 false;默认值是 false;数值型和boolean之间不能直接转化。
三、引用数据类型
引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
四、数据类型转换
自动类型转换:必须满足转换前的数据类型的位数要低于转换后的数据类型(小转大)
强制类型转换:大转小
public class HelloWorld {
public static void main(String []args) {
int a = 10;
byte b = (byte)a;
System.out.println(b);
}
} //结果为10(10的二进制没超过8位)
public class HelloWorld {
public static void main(String []args) {
int a = 1234;
byte b = (byte)a;
System.out.println(b);
}
} //结果为-46 大转小由于1234的二进制位数超过byte的8位,出现问题。
五、补充BigDecimal类
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
BigDecimal中常见的方法
add(BigDecimal) | BigDecimal对象中的值相加,返回BigDecimal对象 |
subtract(BigDecimal) | BigDecimal对象中的值相减,返回BigDecimal对象 |
multiply(BigDecimal) | BigDecimal对象中的值相乘,返回BigDecimal对象 |
divide(BigDecimal) | BigDecimal对象中的值相除,返回BigDecimal对象 |
toString() | 将BigDecimal对象中的值转换成字符串 |
doubleValue() | 将BigDecimal对象中的值转换成双精度数 |
floatValue() | 将BigDecimal对象中的值转换成单精度数 |
longValue() | 将BigDecimal对象中的值转换成长整数 |
intValue() | 将BigDecimal对象中的值转换成整数 |