package com.example.rookie.demo;
/**
* @author
* @date 2021/9/8 9:57
*/
public class IntergerDemo {
public static void main(String[] args) {
Integer x = new Integer(18);
Integer y = new Integer(18);
System.out.println(x == y);
Integer z = Integer.valueOf(18);
Integer k = Integer.valueOf(18);
System.out.println(z == k);
Integer m = Integer.valueOf(128);
Integer p = Integer.valueOf(128);
System.out.println(m == p);
}
}
new Integer(18) 会创建一个新的对象;Integer.valueOf(18) 会使用缓存池中的对象,多次调用只会取一个对象的引用;基本数据类型除了Float及Double外,其它六个(Byte、Short、Integer、Long、Chartacter、Boolean)都有常量缓存池。Integer内置了256个Integer类型的缓存数据,当使用的数据范围在 -128 ~ 127 之间时,会直接返回常量池中数据的引用,而不是创建对象,超过这个范围会创建新的对象。 128不在这个范围,因此创建了新的对象,返回false。
输出结果如下:
值传递与引用传递
int age = 18;
String name = "测试";
age是基本数据类型,值就保存在变量中,而name是引用类型,变量中保持的是对象地址,引用存放在栈中,对象存放在堆中。
- 栈:内存中的一块区域,栈是由编译器自动分配释放的(例如:方法),所以适合存放在编译期就确定生命周期的数据。
- 堆:内存中的一块区域,堆中存放的数据,编译器是不需要知道生命周期的,创建后的回收工作由垃圾收集器来完成。
对于基本数据类型age,赋值运算符会直接改变变量的值,原来的值被覆盖。
对于引用类型name,赋值运算符会改变对象引用中的保存的地址,但原来的对象不会被覆盖。
1、java中的参数传递是按值传递的。
2、如果参数是基本类型,传递的是基本类型的变量值的拷贝。
3、如果参数是引用类型,传递的是引用的对象在堆中地址的拷贝。