基本类型
①精度丢失和溢出?
精度丢失一般发生在浮点型存储数值或类型强制转换的时候。我们知道计算机存储数值实际存储的是二进制,举个粟子
double r1 = 1 - 0.99;
double r2 = 2 - 0.99
r1的值是0.010000000000000009,r2的值为1.01,因为0.99转换成二进制的时候就已经精度丢失了。小数二进制和十进制的转换方法,类似于十进制无法表达1/3一样。所以进行计算后有可能计算出来的数值不正确(是否正确主要看二者进行二进制的运算后再转换回十进制是否正确了)
溢出一般发生在赋值超出了目标类型所能表达的范围
如byte表达范围在【-128~127】之间,如果赋值130的话则
//130的二进制
0000 0000 0000 0000 0000 0000 1000 0010
//强制类型转换后
1000 0010
//第一位为1的为负数,负数用补码表示,所以要显示原码,要取反加1,即
0111 1110
//转换成十进制,加上符号位就是-126
PS:精度丢失在计算中的解决方法,使用String来保存数值,计算时使用BigDecimal来进行计算。
②转换问题?
- 类型由小到大自动转换,由大到小需强制转换,小数部分直接舍掉。
//需强制转换且a的值为10
int a = (int)10.8
- 整型字面常量的大小超出目标类型所能表示范围也需要强转,溢出
//需强制转换,b1为-128,b2为-127
byte b1 = (byte)128;
byte b2 = (byte)129;
- 复合运算符(+=、-=、*=、/=、%=)是可以将右边表达式的类型自动强制转换成左边的类型
int a = 8;
short s = 5;
s += a;
s += a+5;
- char是无符号类型,其他类型转换成char都需要显式强制转换,赋值负数也需要强制转换
PS:Java中类属性变量会默认赋初始值,局部变量则需要手动初始化,引用数据类型不管在哪都会被赋予初始值null,String类型的初始值也是null
常用类
String
Date
正则表达式
数据结构概述
基本组成
- 数组:
优点:内存空间连续,查询快,相对其他结构消耗内存空间小
缺点:初始化时就需要分配数组(内存)大小,不支持动态扩充,插入和删除慢
一维数组是在内存连续分配的一段存储空间,多维则如下
数组声明后会便会在连续内存空间中进行内存分配,并赋初始值
//此时,int[1] = 0
int[] array = new int[3];
- 链表:内存空间不连续,插入删除快