java的String 对象equals是被重写过的,比较的是内容。你可以看一下apipublic boolean equals(Object anObject)Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.Overrides: equals in class Object Parameters: anObject - The object to compare this String against Returns: true if the given object represents a String equivalent to this string, false otherwise See Also: compareTo(String), equalsIgnoreCase(String) 以上摘自java api文档 说的很清楚了,会比较字符
u1.setName('lte')这种是放在常量池的,u2.setName('lte')还会去常量池中找
这两个是的同一个对象,地址值相同,值也相同
但是new 这种就不会放常量池了 用==号就flase了
删了楼上两个吧
new一个String的话,它会在堆里分配内存,那么两个具有相同内容的字符串用==比较会不同,而直接用“字符串内容”的形式给字符串变量赋值的话,Java会去字符串缓冲区找,没有的话在那里创建一个,有的话,直接拿过来用。
楼主的程序在给name赋值时用的是第二种形式,第一次是创建了一个字符串常量,第二次是取用字符串常量,所以,用==比较结果为true。
u2.setName(new String("ltj"));这样试试
就象两个人是双胞胎,就算看起来完全相,但他们还是两个人,你给哥哥拍一耳光,弟弟一般是不会疼的再有就是字符串的常量池,在java中,如果编译期间可以确定值的字符串,在运行时会放到常量池中,如果字符串的内容相同,是会指向同一个对象的,以节省内存;而在运行时才能确定内容的字符串,则不会放进常量池。
比如X,Y变量所在的地址是不一样的,可是他们存储的值可以一样
所以X==Y等于false,X.equals(Y)等于true
equals in class Object
Parameters:
anObject - The object to compare this String against
Returns:
true if the given object represents a String equivalent to this string, false otherwise
See Also:
compareTo(String), equalsIgnoreCase(String)
以上摘自java api文档
说的很清楚了,会比较字符
基本数据类型(值类型)byte,short,char ,int,long,float ,double,boolean.他们之间用== 比较是比较值
引用类型: 当使用 ==比较的是内存中存放的地址。所以new出来的对象,即使所有字段一样。但是他们存放内存地址也不同。
equals 是Object 中方法,在String,integer等类中重写了该方法,只比较值,而不是内存存放地址。
其他类在不重写equals方法情况下,只对比内存地址。即和==是一样的结果