Java程序设计(基础)- 数据类型
Java基础程序设计
数据类型,分为两大类型:
- 基本数据类型(普通的值)
- 数值类型
- 整数类型(byte、short、int、long)
- 浮点类型(float、double)
- 字符型(char)
- 布尔型(boolean)
- 数值类型
- 引用数据类型(传递的内存地址)
- 类(class)
- 接口(interface)
- 数组
一、Java基本数据类型
Java编程语言提供了八种基本数据类型,它们可以被划分为以下四类:
1. 整数类型:
byte
: 占用1字节,有符号整数,取值范围从-128
到127
。byte smallNum = 0; // 默认值 byte smallNum = 127;
short
: 占用2字节,有符号整数,取值范围从-32,768
到32,767
。short notSoSmall = 0; // 默认值 short notSoSmall = 32767;
int
: 占用4字节,有符号整数,默认整数类型,取值范围从-2^31
到2^31 - 1
。int normalInt = 0; // 默认值 int normalInt = 2_147_483_647; // 注意Java允许下划线进行数字分隔以提高可读性
long
: 占用8字节,有符号整数,需要在数值后添加L
或l
标识符,取值范围从-2^63
到2^63 - 1
。long largeNumber = 0L; // 默认值 long largeNumber = 9_223_372_036_854_775_807L;
2. 浮点数类型:
float
: 占用4字节,单精度浮点数,取值范围较大但精度相对较低,常量后面需跟F
或f
标识符。float decimalValue = 0.0f; // 默认值 float decimalValue = 3.1415926535f;
double
: 占用8字节,双精度浮点数,这是Java默认的浮点数类型,具有更大的精度范围。double preciseDecimal = 0.0; // 默认值 double preciseDecimal = 3.141592653589793;
3. 字符类型:
char
: 占用2字节,无符号Unicode字符,通常用单引号括起来。char letterA = ''; // 默认值 \u0000(空,'') char letterA = 'A';
4. 布尔类型:
boolean
: 表示逻辑值,仅能取两个值true
或false
。boolean flag = false; // 默认值 boolean flag = true;
此外,每个基本类型都有对应的包装类,例如 Byte
, Short
, Integer
, Long
, Float
, Double
, Character
, 和 Boolean
。基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
Integer x = 1; // 装箱
int y = x; // 拆箱
对于数据来说,设置内容的时候应该放在整个允许的范围之中。如果超过了此范围,肯定会出现数值不正确的情况。 故在实际编程中,根据需要准确选择合适的数据类型是非常重要的。
❤️ 缓存池
在 Java 中,new Integer(0)
和 Integer.valueOf(0)
都用于创建代表整数值 0 的 Integer
对象,但是它们之间有一个重要的性能和内存使用的区别:
new Integer(0):
- 这是通过调用
Integer
类的构造函数显式地创建一个新的Integer
对象。 - 每次执行
new Integer(0)
,都会在堆内存中创建一个新的对象实例。
Integer a = new Integer(0); Integer b = new Integer(0); // a 和 b 是不同的对象,指向不同的内存地址 System.out.println(a == b); // 输出: false
- 这是通过调用
Integer.valueOf(0):
- 这是一个静态工厂方法,它会尝试从一个缓存池中获取对应整数值的对象引用。
- 对于
-128
到127
这个范围内的整数值,Integer.valueOf()
方法会重用已经存在的对象,而不是每次都创建新的对象。 - 因此,当连续两次调用
Integer.valueOf(0)
时,如果值在缓存范围内,实际上会返回相同的对象引用。
Integer c = Integer.valueOf(0); Integer d = Integer.valueOf(0); // 如果是在缓存范围内(如0在这个范围内),c 和 d 指向的是同一个对象 System.out.println(c == d); // 输出: true
总结起来,在处理小整数值时,Integer.valueOf()
能够提高效率并减少内存占用,因为它可能避免了不必要的对象创建。 而对于超出缓存范围的整数值,Integer.valueOf()
表现得与 new Integer()
相似,会创建新的对象实例。
提示
在 JDK 1.8 所有的数值类缓冲池中,Integer
的缓冲池 IntegerCache
很特殊,这个缓冲池的下界是 -128
,上界默认是 127
, 但是这个上界是可调的,在启动 JVM 的时候,通过 -XX:AutoBoxCacheMax=<size>
来指定这个缓冲池的大小, 该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high
系统属性,然后 IntegerCache
初始化的时候就会读取该系统属性来决定上界。
❤️ 数据类型的转换
- 自动类型转换(条件皆成立)
- 转换前的数据类型与转换后的类型兼容。
- 转换后的数据类型表示范围比转换前的类型大。
- 强制类型转换
- 整数运算,结果也会是整数。
提示
任何类型的数据都向String
转型。