简述
接触java已经有四年多的时间,最近开始想写一些总结,来记录这几年的学习历程。不扯太多,直接开干。
“equals()”与“==”的比较
简单来说,==指的是是否是同一个东西,equals指的是这两个东西是否一样。
用java来说,==指引用是否相同,用来判断两个变量/实例是不是指向同一个内存地址;
equals用来判断这两个变量/实例指向的地址空间里的值是否相同。
基本数据类型的比较只能用==
学习java的都知道java的基本数据类型有八种分别是 byte, short, char, int, long, float, double, boolean。
它们之间的比较都是用==来比较他们的值是否相等。并且对于基本类型而言,它们没有 equals() 方法,
equals方法只会出现在他们的引用类型(包装类型)中。
int a=10;
int b=20;
int c=10;
System.out.println("a和b是否相同:" + (a==b));
System.out.println("a和c是否相同:" + (a==c));
输出:
a和b是否相同:false
a和c是否相同:true
比较对象是引用型变量
==:比较两个引用是不是指向同一个对象实例(同一个地址)。
equals:所有的对象都是继承自Object,Object有一个方法叫做equals()方法;查看这个方法会发现他是直接用==比较;
public boolean equals(Object obj) {
return (this == obj);
}
所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。这个时候他俩没啥区别。如果你需要他俩不一样就需要重写 equal()方法;比如String
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;
}
String s1="12345";
String s2="12345";
String s3=new String("12345");
String s4=new String("12345");
System.out.println("s1与s2是否==:" + (s1==s2));
System.out.println("s1与s2是否equals:" + s1.equals(s2));
System.out.println("s1与s3是否==:" + (s1==s3));
System.out.println("s1与s3是否equals:" + s1.equals(s3));
System.out.println("s4与s3是否==:" + (s4==s3));
System.out.println("s4与s3是否equals:" + s4.equals(s3));
输出:
s1与s2是否==:true
s1与s2是否equals:true
s1与s3是否==:false
s1与s3是否equals:true
s4与s3是否==:false
s4与s3是否equals:true
特别说明 s1与s2是否==:true
public boolean equals(Object obj) {
return (this == obj);
}
所以如果这个时候你自定义了一个类,仅仅继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作。这个时候他俩没啥区别。如果你需要他俩不一样就需要重写 equal()方法;比如String
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;
}
String s1="12345";
String s2="12345";
String s3=new String("12345");
String s4=new String("12345");
System.out.println("s1与s2是否==:" + (s1==s2));
System.out.println("s1与s2是否equals:" + s1.equals(s2));
System.out.println("s1与s3是否==:" + (s1==s3));
System.out.println("s1与s3是否equals:" + s1.equals(s3));
System.out.println("s4与s3是否==:" + (s4==s3));
System.out.println("s4与s3是否equals:" + s4.equals(s3));
输出:
s1与s2是否==:true
s1与s2是否equals:true
s1与s3是否==:false
s1与s3是否equals:true
s4与s3是否==:false
s4与s3是否equals:true
特别说明 s1与s2是否==:true
程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "12345" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象"12345" ,在后面的程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"12345"Sting对象被创建在内存中。他们的值相同,但是位置不同了.