Java-数据类型
java是强类型语言要求变量的使用必须要严格符合规定所有变量都必须先定义后才能使用。在java里数据类型分为两大类基本数据类型和引用数据类型。基本数据类型用于存储简单的数值。它们直接存储数据值效率非常高。这 8 种类型可以分为四组整数类型浮点类型字符类型布尔类型1.整数类型用来存储不带小数的数据。类型占用内存取值范围默认值说明byte1 字节-128 ~ 1270适合存储状态码或者小整数short2 字节-32,768 ~ 32,7670较少使用int4 字节约 -21亿 ~ 21亿0最常使用long8 字节范围极大0L存储超大整数如时间戳赋值时必须加L后缀。测试byte a 1; System.out.println(a1); short b 2; System.out.println(b1); int c 3; System.out.println(c1); long d 4; System.out.println(d1);结果2.浮点类型用来存储带小数的数据。类型占用内存精度默认值说明float4 字节约 6~7 位有效数字0.0f单精度赋值时必须加F后缀double8 字节约 15~16 位有效数字0.0d最常用的小数类型是 Java 默认的小数类型测试注意使用小数但是不加f,默认是double类型。float a 0.6f; System.out.println( a0.1); double b 0.6; System.out.println( b0.1); float c 0.6f; System.out.println(c0.6);结果可以看到这里对float的计算出现误差了这是为什么在进行小数的加减乘除运算时会有精度损失因为计算机不管在运算还是存储都会转为二进制操作假设有一个10进制的数字69.875整数部分的二进制为0100 0101小数部分的二进制为111如果是10进制的0.9小数部分的二进制为1110011000110011001100110011001100110011001101一共45位表示如果是0.226小数部分就更长了有55位。而在java中而不论是float和double在底层占用的字节数是有限的float占4个字节32个bit位double8个字节64个bit位而给小数部分的bit位数float是23位double是52位多出来的会被舍弃。小数在存储的时候有可能是不精确的计算出来的结果也可能是不精确的。为什么double看起来没问题那是因为double有 64 位空间比float多了一倍的精度。它在存储 0.6 和 0.1 时保留了更多的小数位误差极小极小。实际上如果用高精度的工具去检查double计算出的0.6 0.1的真实结果其实也是存在误差的。而Java 的System.out.println在打印double时会默认做一个“智能美化”。如果误差非常小超出了日常使用的精度它会直接四舍五入显示为0.7为了让你看着舒服。也可以验证double b 0.6 ; // 使用 BigDecimal 的 valueOf 可以看到 double 的真实值 System.out.println(new BigDecimal(b0.1));结果所以尽量不要使用浮点数进行比较最好使用BigDecimal。这里暂时不介绍BigDecimal了。3.字符类型类型char。占用内存 2 字节。取值范围 Unicode 字符 (0 ~ 65535)。默认值\u0000。说明 用于存储单个字符必须使用单引号括起来。它可以存储英文字母、数字、汉字等例如char grade A;或char ch 中;。测试char a 1; System.out.println(a); char b 1; System.out.println(b);结果为什么两者的结果不一样这就涉及到char的原理了。当不加引号的时候1 是 ASCII 码值Unicode 编码。Java 会查找 ASCII/Unicode 表中编号为 1 的字符ASCII 码 1 对应的是 是一个控制字符不可显示所以你会看到空白或者特殊符号。当加引号的时候char 类型有两个视角存储时存的是数字ASCII/Unicode 编码值。输出时显示的是字符人类可读的形式。在赋值阶段1 → 编译器查找 ASCII 表 → 发现 1 对应的编码是 49→ 在内存中存储 49在输出阶段System.out.println(b) 看到 b 是 char 类型→ 从内存读取 49→ 查 ASCII 表反向转换49 → 1→ 在屏幕上显示字符 1所以在 Java中char类型底层存储的其实是一个整数。存储空间Java 中的char占用 2个字节16位。编码方式它使用 Unicode 编码兼容 ASCII。映射关系每一个字符都对应一个唯一的数字。你可以把char想象成一个“翻译官”当你写char a 1;时你直接给了它数字 1它就去查“1号”对应的符号结果查到了不可见的控制符。当你写char b 1;时你告诉它“我要字符1”它就去查“字符1”的编号49然后存下了 49。4.布尔类型类型boolean取值 只有true和false两个值。默认值false说明 用于逻辑判断。Java 中的boolean类型不能与数字如 0 或 1互相转换。验证boolean类型不能直接和0或1转换5.类型转换由于java是强类型语言所以要进行有些运算的时候需要用到类型转换。低------------------------------------------------------高byte,short,char - int -long - float - double运算中不同类型的数据先转换为同一类型然后再进行运算。强制转换 取值范围大的数值转换为取值范围小的数值。其语法为(类型)变量名自由转换隐式转换取值范围小的数值转换为取值范围大的数值。转换规则1取值范围小的和取值范围大的进行运算小的会先提升为大的再进行运算。转换规则2byte,short,char三种类型的数据再运算的时候都会直接先提升为int然后再进行运算。比如long转int需要强转。细节1在操作比较大的数字的时候注意栈溢出// JDK7新特性数字之间可以用下划线分割 int money 10_0000_0000; int years 20; int total money * years; //-1474836480计算的时候溢出了 System.out.println(total); long total2 money * years; //默认是int转换之前已经存在问题了 System.out.println(total2); long total3 money*((long) years); //先把一个数转换为Long System.out.println(total3);结果细节2short s 1; s 1; System.out.println(s); // 2把左边和右边的值进行相加得到结果2再赋值给左边的变量等同于s s1;问题是short类型和int类型进行运算时short会先转换int型所以计算得出的结果为int型但左边的变量s为short正常int不能转换为short为什么不报错因为,-,*,/,%都隐藏了一个强制类型转换上面的s1就等于s (short)(s1)6.引用数据类型引用数据类型比基本数据类型更复杂它们存储的是对象在内存中的地址引用而不是数据本身。常见类型 类如String、接口如List、数组如int[]等。默认值null。这里不花过多时间介绍了。