1.Primitive type一共十来个,都是系统内建数据类型,没办法增加或自定义。
2.剩下的所有类型都叫object。
3.Primitive type 有 object 和它相对应。
4.String没有相对应的Primitive type。
简单了解装箱和拆箱
值类型:数值是多少就是多少
EG:5==5
- a.equals(b)还要判断a是不是null
- a是null会抛出java.lang.NullPointerException异常
- 但是Objects.equals(a,b):a,b就没有上述问题。
从Java的角度:
- 为每个类协写上equals函数
- 当把a赋值给b的时候,说明a和b2个变量都会应用同一个Object,
- a改变Object,就会影响到b的值
- 因为他们应用的是同一个Object
从C++的角度:
- 所有变量只要不是Primitive type,就一定是引用类型,
- 不存在值传递和引用传递的概念
什么叫引用类型
- Object是对象,东西,不是数值
- Object这个东西 包含数值(小写部分)
拓展
1、什么是装箱和拆箱(Boxing 和 UnBoxing)?
装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型。(网上广为流传)
点击这里
值类型
Int a = 2;
把a的值赋成2
引用类型
把2装进箱子:
- 箱子的类型是Integer,箱子装的数值是2,
- a指向箱子。
是装箱操作
(1) 不是把new Integer(2)赋值给b,
(2) 而是生成新的箱子(空的),里面放了2,
(3) 让b指向箱子
a==b?会发生什么呢?
a和b同时指向一个箱子,另一个箱子没人要,
Java垃圾回收掉另一个箱子
拆箱Unboxing
把箱子里的数值拿出来
- int v:v是一个数值
- a.intValue():把里面的int的Value拿出来
常见问题
第3个◆:
- 右边Integer.valueOf(2):返回一个箱子,箱子里的值是2,
- 返回箱子的时候,可能会自己新建一个,可能会用一个现有的箱子返回
左边Integer.valueOf(2)什么时候会等于右边Integer.valueOf(2)?
(1) 当系统先把装2的箱子建立好,并且缓存起来,
(2) 把箱子的应用同时发给等号的左边和右边。
package interview.lang;
public class BoxingDemo
{
public static void main(String[] args)
{
System.out.println("new Integer(2)==2?" + (new Integer(2) == 2));
System.out.println("new Integer(2)==new Integer(2)?" + (new Integer(2) == new Integer(2)));
System.out.println("Integer.valu eOf(2)==Integer.valueOf(2)" + (Integer.valueOf(2) == Integer.valueOf(2)));
System.out.println("Integer.valueOf(2).intValue()==2?" + (Integer.valueOf(2).intValue() == 2));
System.out.println("new Integer(2).equals(new Integer(2))?" + (new Integer(2).equals(new Integer(2))));
}
}
第1个◆:
- 等号左边:Object
- 等号右边:value
- Object≠value
- 但是:Java编译器自动做Boxing and UnBoxing
左边:
- 做的是UnBoxing拆箱,把Integer(2)里的int值取出来(2),
- 再来看2==2?
- 结果2==2
第2个◆:
左边:
new integer(2):新建箱子,值为2
右边:
new integer(2):新建箱子,值为2
==:
- 判断2个箱子是不是同一个,
- 不比较箱子里的值
- 结果:false
- 是2个不同的箱子
第3个◆:
- valueOf():系统分配的一个箱子
- 调用valueOf(2):每次都分配同一个箱子
回答:他们可能相等可能不相等,这是系统决定的
第4个◆:
- Integer.valueOf(2):装箱
- .intValue():拆箱,把箱子里的值2拿出来
- 值 == 值——>2==2
第5个◆:
equals:
- 判断Integer里面的值是不是相等的。
- 不会判断他们是不是同一个箱子。
- 传入参数:对方的Object类型的obj
- 判断对方obj是不是Integer类型
- 是,转成Integer,把里面的value取出来,再判断他们的值相不相等
- 不是返回false