Java基础 —— 原生数据类型与包装类

原生数据类型

Java共有八个原生数据类型,按各自类型分类如下:
整型:byte, short, int, long;
浮点型:double, float;
字符型:char;
布尔型:boolean

变量定义

在定义变量时,整型默认为 int,浮点型默认为 double。因此,在定义较大long类型变量时应在数据末尾+L

long a = 1;     //编译正常
long a = 5,000,000,000;  //编译报错,The literal 50000000000 of type int is out of range
long a = 5,000,000,000L; //编译正常

同时,在定义带小数的 float 类型变量时应在数据末尾+F

float a = 1;  //编译正常
float a = 1.0;  //编译报错,Type mismatch: cannot convert from double to float
float a = 1.0F;  //编译正常

类型转换

原生数据类型有两种转换方式,自动类型转换和强制类型转换。
自动类型转换由编译器自动完成,不需要添加代码,也称隐式类型转换。此种转换方式只使用于变量由存储范围小的类型转换向存储范围大的类型转换,即 byte → short(char)→ int → long → float → double,如果想要由大至小的转换则需使用强制类型转换,否则报错,如在定义 float 类型变量时数据末尾未+F。
强制类型转换需要添加代码实现,也称显式类型转换。此种转换方式一般用于对变量进行由大至小的转换,因此存在数据精度丢失的问题,需要谨慎使用,在转换前必须确认这一丢失是可以接受的。

double i = 1.3;
System.out.println((int)i);  //由double类型转换为int类型,输出结果为1,小数部分丢失
short i = 200;
System.out.println((byte)i);   //由int类型转换为byte类型,输出结果为-56

如上例,由 double 类型转换为 int 类型可完成对浮点型数据的取整。而在第二例中,原 int 变量值为200,在内存中存储为0000,0000,1100,1000,在转换为 byte 类型时丢失高八位的0后,将低八位首位的1当做符号位处理,因此计算机判断为该值负数,1100,1000为其补码,将其转换为原码1011,1000,而后输出相应的十进制数字-56。

包装类

Java中万物皆对象,而其提供的原生数据类型并非对象,因此 Java.lang 包提供了包装类。

原生数据类型包装类存储大小最小值最大值
byteByte8bit-128127
shortShort16bit-3276832767
charCharacter16bit‘\u0000’‘\uFFFF’
intInteger32bit-21474836482147483647
longLong64bit-92233720368547758089223372036854775807
floatFloat32bit1.4E-453.4028235E38
doubleDouble64bit4.9E-3241.7976931348623157E308
booleanBoolean---

以Integer类为例,Integer类继承了java.lang.Number类,在对象中包装了一个基本类型 int 的值并提供了多个方法。

字段摘要:

前缀变量名变量含义
static intMAX_VALUE值为2^31-1的常量,它表示int类型能够表示的最大值
static intMIN_VALUE值为-2^31的常量,它表示int类型能够表示的最小值
static intSIZE用来以二进制补码形式表示int值的比特位数
static Class < Integer >TYPE表示基本类型int的Class实例

方法摘要

前缀方法名方法作用
bytebyteValue()以byte类型返回该Integer的值
intcompareTo(Integer anotherInteger)在数字上比较两个 Integer 对象
static intparseInt(String s)将字符串参数作为有符号的十进制整数进行解析
static IntegervalueOf(int i)返回一个表示指定的 int 值的 Integer 实例

自动装箱与拆箱

自动装箱:Java SE5开始提供自动装箱功能,允许隐式地将原始数据类型转换为类对象
拆箱:将类对象转换为对应的原始数据类型,必须显式

Integer obj = 1;    
/*
 * 自动装箱
 * 实际执行了Integer obj = Integer.valueOf(1);
 */

int i = (int)obj;
/*
 * 拆箱
 * 实际执行了int i = obj.intValue();
 */

注:上例中自动装箱生成对象调用了方法valueOf(),因此会出现由此方式生成的同一数值对象内存地址相同的情况

Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2);   //输出true

Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3 == i4);   //输出false

这一情况由valueOf()方法导致,当Integer对象数值在-128~127间时,valueOf()方法只返回对应值的缓存对象而非建立新对象,valueOf()方法源码如下

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

其中IntegerCache.low与IntegerCache.high为IntegerCache类的静态成员常量,low值为-128,high值为127

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值