class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:false
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:true
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a.equals(b));
}
}
结果为:true
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:false
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
结果为:true
class Test{
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a.equals(b));
}
}
结果为:true
字符型对象比较是否相同,应该用equals
明白没?
class Test{
public static void main(String[] args){
String a="taoyu";
String b="taoyu";
System.out.println(a==b);
}
}
第三个没问题,第一个和第二个为什么会有差别啊
public static void main(String[] args){
String a=new String("taoyu");
String b=new String("taoyu");
System.out.println(a==b);
}
}
class Test{
public static void main(String[] args){
String a="taoyu";
String b="taoyu";
System.out.println(a==b);
}
} 第一个因为是两个对象,用==比较的是地址,两个对象都是用new创建的,所以地址不同。而第二个,两个对象都没有用new关键字,这时,涉及到了java的字符串池技术,在直接用s = "xxx"的形式时,会把=号后面的字符串放入字符串池,而且相同的字符串只放一次,所以a和b的地址是一样的,因为在字符串池里面。
用equals!!!!
equals比较内容
equals比较对象的内容。
要判断字符串是否相等应该用equals()
"==" 判断引用地址是否相等
如果String a ="abc" String b="abc" (a==b)内存中的A已经有了ABC所以B只要指向A的地址就可以了,所以是true
其实String 是一个引用变量,当用new产生一个新的对象时,就重新开辟了一个空间,所以(a==b)是false
也就是说,“==”比较的是引用对象的存储的首地址,而equals比较的是对象的内容!!!很容易理解啊~~~~
你去看看这个帖子,里面有我的回答,应该很详细了
String a="taoyu";
String b="taoyu";
“taoyu”在堆内存中只有一份,a,b都是对它的引用。地址相同,所以结果为true
另,注意:==比较的是地址,equals比较是内容。
private int a=1;
public static void main(String[] args){
Test a1=new Test();
Test a2=new Test();
Test a3=a1; System.out.println("a1==a2的结果:"+a1==a2);//false
System.out.println("a1.equals(a2)的结果:"+a1.equals(a2));//也是false
System.out.println("a1==a3的结果:"+a1==a3);//true
System.out.println("a1.equals(a3)的结果:"+a1.equals(a3));//也是true
}
}我想说的是:如果你不重写equals方法,告诉equals方法如何比较内容(String类就是这样做的),那么equals方法和==的效果是一样的(其实==就是调用的Object的equals方法完成比较的,相关内容参见《thinking in java》)。
堆中的则只有NEW你没有new那是放在池中
NEW了是放在堆中
String a="abc";String b="abc";和
String a=new String("abc");String b=new String("abc");是有区别的..前者执行的时候会在常量池里面创建"abc", 后面如果非new的形式定义字符串的话, 那么会直接在常量池里面去找,如果有就直接指向那个字符串,如果没有会在常量池里面新建. new就不一样了,每new一次,会为它分配自己的内从空间.所以地址是不一样的
System.out.println(a1);你可以试一下,看a1是什么?它其实就是一个地址,是通过继承Object类的toString()方法得到的字符串值。所以==比较的是地址。而通过equals我们比较的是同一个对象的属性值
a这个引用值是放在栈中的,而new A()则是放在堆中的。
“==”只能比较栈中值的大小,equals可以比较堆中的值
equle 比较的是内容 所以是true
"=="比较的事地址"=="时出现 true
那因为你之前NEW过 系统发现一样就直接赋到上次NEW的那个地址了 貌似是这样
Object 中equals()和==是一样的
但是String中就是比较 a b的内存地址是否相同了
当然是false了
o(╯□╰)o
Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池中的一个对象。使用new操作创建的字符串对象不指向字符串池中的对象。(但是可以使用intern()方法使其指向字符串池中的对象。)
“字符串池”,是Java为了提高内存利用率而采用的措施:当遇到String a = "taoyu"; 这样的语句时,Java会先在字符串池中寻找是否已经存在"Hello"这个字符串,如果没有,则建立字符串"taoyo"对象,然后变量 a 指向这个地址;然后遇到语句String b = "taoyu",这时字符串池中已经有 "taoyu"了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。
而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同。
String a = new String("taoyu"); 与 String a = "taoyu" 产生的对象不一样的,
使用new 关键字是新的对象,而直接赋值的那个Java为了省内存,在String池里装它对象,再次使用赋值时,两个String都是同一个对象,而new却都不是同一个对象,"=="是内存地址的对比,eques是值的对比.
关键的东西是: Java有个String池.
1 string池
2 == 内存地址比较
3 equals 值比较
通常==用于数字类型的比较如int...
而equals()主要用于字符类型的比较如string...
String类的equals方法被重写了
java对String对象是有优化的,字符串常量编译的时候就已经分配好了,其实你弄明白这个问题简单,但是呢
如果想进一步了解更多的jvm知识建议看看《深入Java虚拟机》
字符型对象比较是否相同,应该用equals a.equals(b);
所以为TRUE
如:int a = 1;
int b = 1;
a == b trueInteger a = new Integer(1);
Integer b = new Integer(1);
a == b false