关于equals问题,小白求教

yanshi_wang 2013-07-19 09:41:06
为什么用String类声明的对象去调用equals方法会返回true
比如String str1 = new String(“java”)
String str2 = new String(“java”)
这个返回的是ture
但是下面的这个语句一定要重写equals中的方法才返回ture,不然就是false
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
...全文
320 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaBoyCaoJi 2013-07-22
  • 打赏
  • 举报
回复
String 对象重写equals方法,比较具体的内容。 而你写的Employee这个对象你没重写equals方法没比较具体的内容,默认比较内存地址自然不一样。
lkq_david 2013-07-22
  • 打赏
  • 举报
回复
引用 24 楼 nd707355117 的回复:
[quote=引用 23 楼 nd707355117 的回复:] [quote=引用 7 楼 qq1145174853 的回复:] 很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
正解[/quote] 上面的是我看错了,如果是new 出来的地址肯定不一样!String str1 = new String(“java”)对于这句话我的理解是,现在栈中存放了str1这个引用变量,指向堆中的java ,而对中的java是复制的常量池中的java,所以说这句代码其实是产生了两个java,一个在常量池中,而在堆中的则是复制的常量池里的[/quote] 嗯,我之前直接当成a=“java”理解了,后来楼上一兄弟批评之后才发现弄错了
ptxy68500 2013-07-21
  • 打赏
  • 举报
回复
这个问题其实我也碰到了
aaaabbbccd9876 2013-07-21
  • 打赏
  • 举报
回复
大家讲的都很好
gdmt44 2013-07-21
  • 打赏
  • 举报
回复
7楼说错了,String s1="java" String s2 ="java"才是你说的情况,new出来的都是分配在堆上的,2个new出来的对象用==都是false
guan_tu 2013-07-21
  • 打赏
  • 举报
回复
引用 23 楼 nd707355117 的回复:
[quote=引用 7 楼 qq1145174853 的回复:] 很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
正解[/quote] 上面的是我看错了,如果是new 出来的地址肯定不一样!String str1 = new String(“java”)对于这句话我的理解是,现在栈中存放了str1这个引用变量,指向堆中的java ,而对中的java是复制的常量池中的java,所以说这句代码其实是产生了两个java,一个在常量池中,而在堆中的则是复制的常量池里的
guan_tu 2013-07-21
  • 打赏
  • 举报
回复
引用 7 楼 qq1145174853 的回复:
很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
正解
惑惑 2013-07-21
  • 打赏
  • 举报
回复
引用 2 楼 samboy2002 的回复:
String是JAVA的基本类型,所有的字符串都是共享的,也就是说你的str1和str2虽然是new了两次,但实际上是一个对象实例,所以equals是true. 这个涉及到JVM对基本类型管理的知识了,JAVA中有很多类似的地方,例如:

List a = new ArrayList(0);
List b = new ArrayList(0);
		
System.out.print(a.equals(b)); // output true
我们自己定义的类一般是每次new的时候都会创建一个新的实例,所以要重写equals方法。 另外,重写equals方法,必须同时重写hashCode方法。
你概念错了 1、String 不是基本类型,JAVA中的基本类型只有8种:byte, short, int, long, char, float, double, boolean。 2、str1和str2虽然是new了两次,他们是两个不同的实例,JAVA每个new操作都是新的实例。可以使用str1 == str2来验证是否是同一个实例。 这段代码弄懂了就能对String有更深的了解了

	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = new String("abc");
		String s3 = "a" + "bc";
		String s4 = "a" + new String("bc");
		
		System.out.println(s1 == s2);		//false
		System.out.println(s1 == s3);		//true
		System.out.println(s1 == s4);		//false
		System.out.println(s1 == s4.intern());	//true
	}
xxxlightxxx 2013-07-21
  • 打赏
  • 举报
回复
可以去了解下 字符串池 的概念。
  • 打赏
  • 举报
回复
对于引用类型来说,equals比较的是在堆内存中值,而==是比较栈内存中的值
wenhan159 2013-07-20
  • 打赏
  • 举报
回复
建议楼主去看看equals的源码,把它搞懂
davidworld 2013-07-20
  • 打赏
  • 举报
回复
Codsegment:存程序代码。 Datasegment:存静态变量或字符串常量。 Stack(栈):存局部变量。 Heap(堆):存new出来的对象。 Sting类的equals方法比较的是内容,==比较的是地址 是这样吗?这一块我也一直记不住,也迷惑,大神讲清楚点呗
lkq_david 2013-07-20
  • 打赏
  • 举报
回复
引用 14 楼 forgetsam 的回复:
[quote=引用 7 楼 qq1145174853 的回复:] 很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
你这水平就别来胡说八道。 对象str1?一个? String a= new String(“java”); String b= new String(“java”); System.out.print(a==b); 你比较比较地址,看看是不是一个。[/quote] 我又到网上看了下,貌似是我理解错了 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。   堆(heap):存放所有new出来的对象。
lkq_david 2013-07-20
  • 打赏
  • 举报
回复
引用 14 楼 forgetsam 的回复:
[quote=引用 7 楼 qq1145174853 的回复:] 很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
你这水平就别来胡说八道。 对象str1?一个? String a= new String(“java”); String b= new String(“java”); System.out.print(a==b); 你比较比较地址,看看是不是一个。[/quote] a和b在栈内存中是两个对象,在堆内存中只有一个对象,a和b同时指向一个对象,自己好好去看看string的原理吧
forgetsam 2013-07-20
  • 打赏
  • 举报
回复
引用 7 楼 qq1145174853 的回复:
很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
你这水平就别来胡说八道。 对象str1?一个? String a= new String(“java”); String b= new String(“java”); System.out.print(a==b); 你比较比较地址,看看是不是一个。
Acesidonu 2013-07-19
  • 打赏
  • 举报
回复
引用 5 楼 hjw506848887 的回复:
String中的equals()也是被重写的,Object中的equals和==中一个效果,而==就是判断两个对象是不是指向同一个内存地址,所以你上面的那个不重写equals的话就是flase。如果不放心的话,你可以查看一下Object类的源代码,内部算法就是用==号来判断的。
++
  • 打赏
  • 举报
回复
String中的equals()也是被重写的,Object中的equals和==中一个效果,而==就是判断两个对象是不是指向同一个内存地址,所以你上面的那个不重写equals的话就是flase。如果不放心的话,你可以查看一下Object类的源代码,内部算法就是用==号来判断的。
yanshi_wang 2013-07-19
  • 打赏
  • 举报
回复
谢谢楼上帮助,明白了。非常感谢啊,csdn是个好地方
zhangxm2015 2013-07-19
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
这明明是两个对象,不重写equals方法的话默认对象比较是比较的地址值。 所以返回false很正常。 至于你说的String 那会是因为String比较特殊吧,比较的不是地址值,而是字符串的值。
所有的类都继承自Object类,object中的equals比较的是地址,除非重写equals。 String类重写了equals使其比较内容,看一下源码就明白了
  • 打赏
  • 举报
回复
引用 2 楼 samboy2002 的回复:
String是JAVA的基本类型,所有的字符串都是共享的,也就是说你的str1和str2虽然是new了两次,但实际上是一个对象实例,所以equals是true. 这个涉及到JVM对基本类型管理的知识了,JAVA中有很多类似的地方,例如:

List a = new ArrayList(0);
List b = new ArrayList(0);
		
System.out.print(a.equals(b)); // output true
我们自己定义的类一般是每次new的时候都会创建一个新的实例,所以要重写equals方法。 另外,重写equals方法,必须同时重写hashCode方法。
拜托String不是基本类型吧
加载更多回复(6)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧