equals本意:
即在Object对象中定义的equals()方法有什么样的意义。
equals方法,用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。
Object类中的equals方法内部使用的就是==比较运算符。
在开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较,也就是在开发经常需要子类重写equals方法根据对象的属性值进行比较。
如下代码演示:
1 public class Person {
2 private String name;
3 private int age;
4 Person(){
5
6 }
7 Person(String name,int age){
8 this.name=name;
9 this.age=age;
10 }
11
12 public boolean equals(Object obj) {//Object obj=new Person();
13 //调用子类都有的成员,需要向下转型
14 if(obj==null){
15 return false;
16 }
17 if(obj==this){
18 return true;
19 }
20 if(obj instanceof Person ){
21 Person p=(Person)obj;
22 return this.age==p.age;
23 }
24 return false;
25 }
注意:
在复写Object中的equals方法时,一定要注意public boolean equals(Object obj)的参数是Object类型,
在调用对象的属性时,一定要进行类型转换,在转换之前必须进行类型判断。
toString方法
toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
1 public class Demo01 {
2
3 public static void main(String[] args) {
4 Person p1=new Person("熊大",2);
5 Person p2=new Person("熊二",2);
6 ArrayList<String> list=new ArrayList<String>();
7 System.out.println(p1==p2);
8 System.out.println(p1.equals(list));
9 System.out.println(p1);//默认打印tostring() 子类方法重写后 就变成子类重写方法
10 System.out.println(p2);
11 }
String类
创建的相同String数组地址是一样的,在运行str时已经存在abc字符串数组,
所以运行str2的时候会先去找这个数组存不存在,如果已经有了则他的地址直接拿过来用
所以str与str2的地址与内容都是一样的
1 public static void main(String[] args) {
2 String str="abc";
3 //str="efg";
4 //String str1=new String("abc");
5 String str2="abc";
6 System.out.println(str==str2);
7 System.out.println(str.equals(str2));
8 }
图解:
当运行str的时候,在堆里分配一个数组地址,分为三块,这个地址给到str,
在运行str1的时候,也分配一个地址,因为内容一样 所以str的地址直接给到str1,
所以str与str1比较的时候,他们地址不一样而内容是一样的
1 public static void main(String[] args) {
2 String str="abc";
3 //str="efg";
4 String str1=new String("abc");
5 //String str2="abc";
6 System.out.println(str==str1);
7 System.out.println(str.equals(str1));
8 }
图解:
插一段string的构造方法
1 public static void main(String[] args) {
2 //字节数组走的是GBK编码表(正数走ascII表,负数就是汉字(两个字节一个汉字))
3 byte[] bytes={97,98,99,100};
4 String str=new String(bytes);
5 String str2=new String(bytes,1,2);
6 System.out.println(str2);
7 System.out.println(str);//abcd
8 }
下面是详细ascII码表:
48—0,65—A,97—a