• 2.24

八种基本数据类型,3种引用类型

注意一下几点:

  • Java八种基本数据类型的字节数:1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double)
  • 浮点数的默认类型为double(如果需要声明一个常量为float型,则必须要在末尾加上f或F)
  • 整数的默认类型为int(声明Long型在末尾加上l或者L)
  • 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
  • char类型是无符号的,不能为负,所以是0开始的

1.int和long是多少位,多少字节

类型位数(bit)字节数(byte)取值范围默认值
int32 位4 字节-2³¹ ~ 2³¹-1(约 -21亿 ~ +21亿)0
long64 位8 字节-2⁶³ ~ 2⁶³-1(约 -9×10¹⁸ ~ +9×10¹⁸)0L

2.long和int可以互转吗

long像int转: 强制类型转换,可能会有数据丢失或溢出

3.数据类型转换方式你知道哪些

  1. 隐式转换(自动类型转换):当超出范围时,java会自动转换
  2. 强制类型转换:目标类型 变量名 = (目标类型) 源类型
  3. 字符串转换 : Integer.parseInt(),Double.parseDouble()
  4. 数值之间的转换::Java 提供了一些数值类型之间的转换方法,如将整型转换为字符型、将字符型转换为整型等。这些转换方式可以通过类型的包装类来实现

4.类型互转会出现什么问题

  • 基本数据类型 doble float都会出现精度损失,因为浮点数表示不同 intbyte会舍弃高位,保留个低位
  • 对象引用转换
    • 向上转型可以,比如dog像animal转
    • 向下会抛异常,Java 会检查对象的实际类型是否与目标类型兼容。如果不兼容,就会抛出
    • 可用instanceof检查

5.*为什么用bigDecimal 不用double ?

double为二进制浮点运算,会丢失精度,比如二进制不能表示1/3=0.3333…

  • 例如手里有0.06元,却不能购买0.05和0.01元的商品,当电商或金融出现此情况会出现对不上账的情况
  • 在创建bigDecimal对象时,传入的应该是字符串(‘0.01’),而不是浮点数,避免精度损失

6.装箱和拆箱是什么

基本数据类型和对应的包装类之间进行转换的过程 发生在:赋值,方法调用

  • 弊端
Integer sum = 0; for(int i=1000; i<5000; i ){ sum =i; }

在循环中会创建4000个无用的Integer对象,重复垃圾回收,降低性能,在声明变量时避免自动装箱引起的性能问题

7.为什么要有Integer

他是int对应的包装类,将其包装为Object对象 例如: Java 的集合只能存放对象,不能直接存放基本类型。 ​所以要想把 int 放进集合,必须先变成它的对象形式——Integer。 这就是为什么 Integer 的存在是必要的

  1. 泛型中的应用 泛型中只能使用引用类型,不能使用基本类型,假设上面list中存入Integer,可以使用Collections.sort()来快速排序list中的int类型数据
  2. 转换类型的应用 将int转换为string时,需要先转换为Integer,在使用Interger的.toString()方法变为string
  3. 集合中的应用(集合框架(List、Set、Map)) 计算列表中的和,不需要循环相加,使用Interger的stream方法即可 int sum = list.stream().mapToInt(Integer::intValue).sum();

8.Integer相比int有什么区别

  1. 引用类型考点:Integer需要通过实例化对象来使用,不同于int需要额外的内存分配.性能较差
  2. 自动装箱拆箱方便
  3. 空指针异常:int可以直接赋值0,Integer变量必须通过实例化对象来赋值,不然为null,空指针异常,

9.为什么保留int类型

8.Integer相比int有什么区别效率高,内存小 包装类:对象的引用和对象本身是分开存储的 基本数据:变量对应的内存直接存储数据本身

10.Integer的缓存

Java的Integer类内部实现了一个静态缓存池,用于存储特定范围内的整数值对应的Integer对象。 默认情况下,这个范围是-128至127。当通过Integer.valueOf(int)方法创建一个在这个范围内的整数对象时,并不会每次都生成新的对象实例,而是复用缓存中的现有对象,会直接从内存中取出,不需要新建一个对象。