[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=引用 7 楼 qq1145174853 的回复:] 很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
很高兴能帮助到你,String是个很特殊的类。你真的理解了String str1 = new String(“java”)吗,这句话其实生成了两个对象,一个是存放在堆内存里面的“java”,还有一个对象str1存放在栈内存里面,栈里面的str1指向对内存的具体对象。当执行String str2 = new String(“java”)这句话的时候,首先判断堆内存中是否存在“java”这个对象,查到存在了这个对象就不会在堆内存中生成了,只在栈内存中生成一个str2指向“java”这个对象,所以str1和str2的堆内存其实是一个东西,理解了吗?
String中的equals()也是被重写的,Object中的equals和==中一个效果,而==就是判断两个对象是不是指向同一个内存地址,所以你上面的那个不重写equals的话就是flase。如果不放心的话,你可以查看一下Object类的源代码,内部算法就是用==号来判断的。
这明明是两个对象,不重写equals方法的话默认对象比较是比较的地址值。 所以返回false很正常。 至于你说的String 那会是因为String比较特殊吧,比较的不是地址值,而是字符串的值。
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方法。
List a = new ArrayList(0); List b = new ArrayList(0); System.out.print(a.equals(b)); // output true
62,635
社区成员
307,269
社区内容
加载中
试试用AI创作助手写篇文章吧