public class test {
public static void main(String args[]){
String a = "abc";
String b = "abc";
if (a==b){
System.out.println("a==b");
}
if (a.equals(b)){
System.out.println("a equals b");
}
}
}
为什么我的程序输出结果是
a==b
a equals b
a和b的地址也相同么?
==和equals的区别到底是什么
这样就好了System.out.println(a==b);
你程序这样,地址是一样的!
==比较内在地址,
equals比较字符串的内容
不是吧,lz只是向输出表示a和b的内容相等
public class test {
public static void main(String args[]){
String a = "abc";
String b = "abc";
if (a==b){ //比较的是引用地址!因为a和b指向同一个对象,所以相等
System.out.println("a==b");
}
if (a.equals(b)){ //String类重写了从Object继承过来的equals方法,重写为比较他们的内容!
System.out.println("a equals b");
}
}
}
不是引用地址的,而是当作基本类型来处理的,不是字符串相同,地址就相同的。java里面处理String a="abc"; 这样的字符串就是作为基本类型的,和String a= new String("abc");是截然不同的。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
String a = "abc";
String b = "abc";
首先,要知道Java会确保一个字符串常量只有一个拷贝,例子中的a和b中的"abc"都是字符串常量,
它们在编译期就被确定了,当已经定义了一个字符串常量"abc"的时候,如果再定义一个"abc"常量的时候,java会
自动直接引用常量池中已经定义的那个字符串常量,也就是说此时a和b实际上指向的是同一个引用,也就是为什么a==b会成立的原因,
当然,二者的引用相同那么a.equals(b)也必然成立了。
如果用new String() 创建的字符串那么就不是常量,不能在编译期就确定,所以new String()
创建的字符串不放入常量池中,它们有自己的地址空间,如果此时再用a==b的话,那么肯定是不成立的.
String b = "abc";
=====================
这里只是声明了两个引用,并且初始化引用且初始化的值相等,并没有创建对象.所以就应该当作基本类型来处理了,为true.String a = new String( "hello ");
String b = new String( "hello ");
======================
这里生成了两个对象,==比较的是对象的引用是否相等,这里明显不等了,所以为false.