携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
基础数据类型、引用数据类型
1. 概念
1.基本类型变量: 使用八种基本类型中的任意一种类型,声明出的变量。
八种基本类型:byte、short、int、long、float、double、boolean、char。
2.引用类型变量: 使用三种引用类型中的任意一种类型,声明出的变量。引用类型变量,简称为引用,它可以用来接收对象,也叫做引用指向对象。
三种引用类型:类类型(class)、接口类型(interface)、数组类型(array)。
几乎所有的对象类都是可以算做是引用类型变量 ,例如:基础数据类型的包装类(Integer等)、集合。
2. 简单的区别
- 基本类型变量只能接收基本类型数据,它是一种比较简单的数据,没有属性,也没有方法 。只能表示最简单数字(8/16/32/64位)。
- 引用类型变量只能接收引用类型数据(也就是对象),但对象是一种比较复杂的数据,它里面可以有很多属性,也可以有很多方法。
- 引用类型变量可以访问属性、调用方法,完成比较复杂的功能。
3. ==和equal的区别
3.1 ==
【1】如果比较的对象是基本数据类型,则比较数值是否相等;
【2】如果比较的是引用数据类型,则比较的是对象的内存地址是否相等。
因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
3.2 equal
equals(): 用来比较两个对象的内容是否相等。
equals()方法存在于Object类中,而Object类是所有类的直接或间接父类。
public boolean equals(Object obj) {
return (this == obj);
}
两种情况
① 类没有覆盖 equals()方法
通过equals
()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类equals()方法。
Object类中equals方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
② 类覆盖了 equals()方法
一般我们都覆盖 equals
()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true (即,认为这两个对象相等) 。
public class EqualsDemo {
public static void main(String[] args) {
String a = new String("ab");
String b = new String("ab");
String aa = "ab";
String bb = "ab";
System.out.println("aa==bb: " + (aa == bb));
System.out.println("a==b: " + (a == b));
System.out.println("a.equals(b): " + (a.equals(b)));
System.out.println("42 == 42.0 : " + (42 == 42.0));
}
}
说明:
- String中的 equals方法是被重写过的 ,因为 Object的 equals方法是比较的对象的内存地址,而 String的 equals方法比较的是对象的值。
- 当创建 String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String对象。
String类中的equals方法源码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
注意点
- equals方法不能用于判断基本数据类型的变量,如只能用来判断两个对象是否相等。
- 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
4. 值传递的区别
- Java中原始数据类型都是值传递,传递的是值得副本,形参的改变不会影响实际参数的值(不影响原值)
- 引用数据类型的值传递传递的是引用类型数据, 包括String,数组,列表, map, 类对象等类型 ,形参与实参指向的是同一内存地址,因此形参改变会影响实参的值。 (影响原值)
5. 总结
核心区别: 是否可以指向对象。
文章来源: