一楼的说equals是比较两个字符串对象的内容是否相同,那下面这个equals的内容相同 为什么输出的结果是false class Test{ int i = 200; }class Demo{ public static void main(String[] args){ Test t1 = new Test(); Test t2 = new Test(); System.out.println(t1.equals(t2)); } }
equals是比较两个字符串对象的内容和类型是否相同 ==是比较两个字符串对象所引用的内存地址是否相同 不管对于什么对象,JVM在编译时都会后面加上.toString(), t1.equals(t2)相当于t1.toString().equals(t2.toString()),对于类,如果在编写时没有重写toString(),JVM会自动加一个默认的public String toString(){...},该函数返回创建对象的内存地址,所以创建类时要比较就应该重写toString()函数 class Test{ int i = 200; public String toString(){ String s=(String)i; return s; } } class Demo{ public static void main(String[] args){ Test t1 = new Test(); Test t2 = new Test(); System.out.println(t1.equals(t2)); } }
==是比较两个字符串对象所引用的内存地址是否相同
比较好理解的一点是:int a=10;int b=10;则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容 为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是 false。a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
那如果是两个object对象呢? String s1=new String(“JDK1.2”);
String s2=new String(“JDK1.2”); Sysout.out.print(s1==s2);
这个时候用==比较的是堆还是栈里的值?
////////
而对对象使用==比较的是引用,所以这里答案是false
String s1=(“JDK1.2”);
String s2=(“JDK1.2”); Sysout.out.print(s1==s2);
/////////
这个答案是true
而这个例子告诉我们 s1 s2是指向同1引用 这是因为jvm提供了一个空间,可称之为 字符串标准引用区
又编译器直接赋值的都指向 字符串标准引用区
String s1=new String(“JDK1.2”);
String s2=new String(“JDK1.2”); Sysout.out.print(s1.intern()==s2.intern());
//////////////
这个答案是true 因为intern()返回的是字符串标准引用区 你可以参考下String.intern()方法
equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
==什么意思?
对于原始类型(int,short,char,long,float,double,boolean..)而言表示他们的值是否相同
对于object而言,表示他们所指向到引用是否相同
class Test{
int i = 200;
}class Demo{
public static void main(String[] args){
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2));
}
}
==是比较两个字符串对象所引用的内存地址是否相同 不管对于什么对象,JVM在编译时都会后面加上.toString(),
t1.equals(t2)相当于t1.toString().equals(t2.toString()),对于类,如果在编写时没有重写toString(),JVM会自动加一个默认的public String toString(){...},该函数返回创建对象的内存地址,所以创建类时要比较就应该重写toString()函数
class Test{
int i = 200;
public String toString(){
String s=(String)i;
return s;
}
}
class Demo{
public static void main(String[] args){
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2));
}
}
==是比较两个字符串对象所引用的内存地址是否相同
==是比较两个字符串对象所引用的内存地址是否相同
class Animal {....}
class Horse extends Animal{}
class Monkey extends Animal{}
Animal animal= new Horse();
这时在堆内存中生成了一个Horse类型的对象,并将animal指向该对象,接着;
animal = new Monkey();
堆中又生成了一个Monkey类型的对象,animal这时指向Monkey对象了,而Horse如果没有其他引用的话就等待垃圾回收器来回收了。其次,Java中所有的类都派生自Object类,Object类中的equals方法就是直接将调用它的对象的引用和传递给它的对象的引用做一次判等,如下:
if(this==传递进来的引用)
{
return true;
}
return false;在现在的类库中,很多类都覆盖了Object类中的equals方法,所以用equals方法进行判等其规则就取决于它们的具体实现了。
第三,使用“==”判等,如果是基本类型,如byete、int、float等,就是比较他们的数值;如果是对象变量,那么就是判断他们的引用,即他们实际上所指向的堆中的对象是否是同一个。
不知道明白了否?
有什么错误的地方,请大家指正。本人也是刚学Java。
equals用于对象的比较。但是字符串在使用中频繁出现,所以java的设计者对字符串进行了一些特别的处理,如果进行比较的2个字符串都是=出来的,且内容完全一样,那么用==或者equals进行比较得到的结果都是true,如果有1个字符串是new出来的,用==比较会得到false.而equals得到true.所以用equals进行比较是比较“保险”的。请大家指正。
class Test
{
public static void main(String[] args)
{
int a=5;
Integer integer=5;
System.out.println(a==integer);
}
}结果是ture,但是一个是一个引用,一个是基本数据类型,这中间怎么定义装箱引用的值的?????
class Test2
{
public static void main(String[] args)
{
Integer i1=300;
Integer i2=300;
//String s1="123";//new String("JDK1.2");
//String s2="123";//new String("JDK1.2");
//String[] s1=new String[]{"123","234"};
//String[] s2=new String[]{"123","234"};
//System.out.println(s1.equals(s2));
//System.out.println(s1==s2);
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
}
}赋值号后边的如果是基本数据类型,比如Interger i1=300;Integerr i2=300;i1==i2引用值不同返回为false,但equals返回ture,如果赋值号后边是对象,比如字符串数组,引用不同,对象也不同,必须是同一个对象equals方法才返回ture,String类型虽然也是引用类型,但它是个常量,有点特殊,行为类似基本数据类型.
刚学JAVA,瞎试不知道具体是不是这个道理.