日期:2014-05-20  浏览次数:20700 次

怎么样用equals 和“==”来进行字符串比较(他们的区别是什么)
我在书上看到 “==”号和equals()方法都可以用于比较字符串,但是得到的结果都不完全相同。这是怎么回事情,他们之间的区别到底是什么,有什么规则吗?

------解决方案--------------------
equals是比较两个字符串对象的内容是否相同
==是比较两个字符串对象所引用的内存地址是否相同

------解决方案--------------------
==操作符专门用来比较变量的值是否相等。
比较好理解的一点是: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是比较两个字符串对象的内容和类型是否相同 
==是比较两个字符串对象所引用的内存地址是否相同 

不管对于什么对象,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)); 

}


------解决方案--------------------
equals是比较两个字符串对象的内容是否相同 
==是比较两个字符串对象所引用的内存地址是否相同 

------解决方案--------------------
同意tangxufeng

equals是比较两个字符串对象的内容和类型是否相同,并且是先判断类型是否一致,如果类型一致,再看内容,如果均不为空,且内容相等,则返回true,否则false
==是比较两个字符串对象所引用的内存地址是否相同

------解决方案--------------------
首先,在Java中,对象变量其实都类似C++中的类指针,为他们赋值时,其实都是将他们所存储的值替换为新的地址值。如下:
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一般用于引用类型之间的比较,而==一般用于基本类型之间的比较
------解决方案--------------------
==用于基本数据类型的比较。
equals用于对象的比较。

但是字符串在使用中频繁出现,所以java的设计者对字符串进行了一些特别的处理,如果进行比较的2个字符串都是=出来的,且内容完全一样,那么用==或者equals进行比较得到的结果都是true,如果有1个字符串是new出来的,用==比较会得到false.而equals得到true.所以用equals进行比较是比较“保险”的。