Java的常见数据类型

本文详细解读了Java中的基本数据类型(包括byte、short、int、long、float、double、char和boolean)及其取值范围和封装类,同时介绍了引用数据类型(类、数组、接口、字符串、枚举)和包装类型的作用、转换规则。特别关注了浮点数运算的精度问题以及自动装箱拆箱的概念。
摘要由CSDN通过智能技术生成

数据类型

Java 中,数据分为 基本数据类型引用数据类型

基本数据类型

一共有八种基本数据类型

数据类型关键字大小(字节)取值范围封装类
字节型byte1-128 ~ 127Byte
短整型short2-32768 ~ 32767Short
整型int(默认)4-2^31 ~ 2^31-1Integer
长整型long8-2^63 ~ 2^63-1Long
单精度浮点数float41.4013E-45 ~ 3.4028E+38Float
双精度浮点数double(默认)84.9E-324 ~ 1.7977E+308Double
字符型char20 ~ 65535Character
布尔类型boolean1 / 4ture / falseBoolean

使用注意事项:

  • 在使用 float 类型定义数据时,需要在数据后加上 f 或者 F
  • 在使用 long 类型定义数据时,需要在数据后加上 l 或者 L

类型转换

不同数据类型之间可以相互转换

小类型赋值给大类型:小转大,自动转换

double num = 1.1f

大类型赋值给小类型:大转小,强制转换(因为可能导致计算的精度下降、数据溢出)

int num = (int)100L

char 类型的转换

char 在计算时会自动转为 short

转换规则

  • 当有多种数据类型转换时,将所有数据类型转换为 精度最大 的那个
  • (byte、short )和 char 之间不会相互自动转换
  • byte、short、char 三者可以计算,在计算时首先转换为 int 类型
byte a = 1;
short b = 1;
short c = a + b; 
// 错误,byte + short 在进行计算时,会自动转换为 int,int 赋值给 short需要进行强制转换

short d = 1;
short e = b + d; 
// 错误,short + short 在进行运算时,自动转为int

精度大小顺序:

  • char < int < long < float < double
  • byte < short < int < long < float < double

String 与 基本类型的互换

基本类型 转 字符串:

String s = 1 + "";

字符串 转 基本类型:

Integer.parseInt("123");

引用数据类型

引用数据类型包括:类、数组、接口、字符串、枚举

包装类型

八个基本类型,每一个都对应一个包装类型

为什么使用包装类型

Java 可以直接处理基本数据类型,但有时候需要将其视为对象来处理,所以需要为每个基本类型提供包装类型,就可以把基本类型转换为对象来处理

基本类型与包装类型的区别

  • 基本类型为值传递,包装类型为引用传递
  • 基本类型在栈中创建,包装类型在堆中创建

自动装箱/自动拆箱

装箱:将基本类型包装成包装类型

new Integer 或者 Integer.valueOf

Integer num = 1; // 自动装箱

拆箱:将包装类型转为基本类型

new Integer(num).intValue()

int n = new Integer(100); // 自动拆箱

String 与 包装类型的互换

包装类转 String:valueof

String 转包装类型:…parst***(String)

包装类 转 字符串

Integer i = 100;

String s1 = i + "";
String s2 = i.toString();
String s3 = String.valueOf(i);

字符串 转 包装类

String s = "123";

Integer i1 = Integer.parseInt(s);
Integer i2 = new Integer(s);

常见面试题

Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);

输出:false

i 和 j 是对象,这里使用 == 判断,判断的是 地址,这是两个不同的对象,所以结果为 false


Integer i = 1
Integer j = 2
System.out.println(i == j);

这里直接赋值,自动装箱底层是 Integer.valueOf(int i)

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

底层维护了一个静态内部类 IntegerCache,用来做数据缓存,内部类中维护了一个 Integer cache[] 数组,该数组在类加载时创建并初始化

当使用 valueOf 自动装箱传入一个 int 时,如果传入的值大小在 -128 ~ 127 之间,则不会创建对象,直接在 cache 数组中获取数据

所以这里输出:true


Integer i = 128
Integer j = 128
System.out.println(i == j);

这里因为数值为128,所以是创建对象的方式,输出 false


Integer i = 127;
int j = 127;
System.out.println(i == j);

输出:true

其中有一个是基本数据类型,当 == 双方有一方是基本数据类型的时候,比较的就是值

常见 ASCII 码

  • a-z:97-122
  • A-Z:65-90
  • 0-9:48-57

常量与变量

在 Java 中,变量必须先声明,再使用

变量分为:局部变量与成员变量

  • 局部变量:方法中的变量,存于栈内存,无默认值,先定义再使用,不可以加修饰符
  • 成员变量:方法外,类内的变量,有 static 修饰的为类变量,否则为对象变量

常量分为:普通常量与标识符常量(final)

  • 普通常量:整型、浮点型、字符、字符串、布尔、空常量 null
  • 标识符常量:当定义的 final 变量属于成员变量时,必须在定义时就设定初值

整型

整型包括:byte、short、int(默认)、long

表达方式

自 JDK 1.7 开始,,int 和 long 常量支持下划线分割,以及二进制字面量的表示方法

  • 八进制:以 0 开头,如 0123
  • 十六进制:以 0x 或 0X 开头,如 0x25
  • 下划线分割:int n = 1_234_5678
  • 二进制字面量:int n = 0b1001_1001_1011_1111

浮点数

  • 小数形式:12.37F、-0.5234D、.123(0可以省略)
  • 指数形式:2.5e4(2.5乘10的四次方)、2.1E-7

浮点数的运算存在 误差,比较两个浮点数是否相等 常常会出现错误的结果

double num = 8.1 / 3;

这里会输出一个接近 2.7 的数字,而不是 2.7,所以如果想要相等比较的话,会产生错误

正确的比较方式:浮点数相减,当绝对值小于一个很小的数时,说明相等

if (Math.abs(x - y) < 0.000001) {
    // 可以认为相等
} else {
    // 不相等
}

浮点数的四舍五入运算:加 0.5

double d = 2.6;
int n = (int) (d + 0.5);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值