String 的疑惑。String a = "abc" 和String a = new String("abc")不同?

艾德 2007-05-31 04:32:19
测试代码如下:
String a = "abc";
String b = "abc";
System.out.println(a == b);
输出:true
==========================
String a = new String("ade");
String b = new String("ade");
System.out.println(a == b);
输出:false

请问:String a = "abc" 和String a = new String("abc")有什么不同?

*****************************************************************
另外:请高人告知以下三段代码的输出是什么?为什么?(关健是告之为什么)
第一段代码:
HashMap map = new HashMap();
String a = "ade";
String b = "ade";
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

第二段代码:
HashMap map = new HashMap();
String a = new String("ade");
String b = new String("ade");
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

第三段代码:
HashMap map = new HashMap();
MyString a = new MyString("ade");
MyString b = new MyString("ade");
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
System.out.println(map.get(a).toString());
System.out.println(map.get(b).toString());

其中MyString定义如下:
public class MyString {
String str;
public MyString(String str){
this.str = str;
}
@Override
public int hashCode() {
return str.hashCode();
}

}


谢谢!
...全文
945 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
艾德 2007-06-04
  • 打赏
  • 举报
回复
你定义的类名就叫HashMap???
HashMap map = new HashMap(); new出来的是你自己的这个HashMap,不是java.util.HashMap
zhangchao0323 2007-06-02
  • 打赏
  • 举报
回复
import java.util.*;

public class HashMap
{
public static void main(String[] args)
{
HashMap map = new HashMap();
String a = new String("ade");
String b = new String("ade");
map.put(a, new Boolean(true));
map.put(b, new Boolean(false));
// System.out.println(map.get(a).toString());
// System.out.println(map.get(b).toString());
}
}

HashMap.java:11: 找不到符号
符号: 方法 put(java.lang.String,java.lang.Boolean)
位置: 类 HashMap
map.put(a, new Boolean(true));
^
HashMap.java:12: 找不到符号
符号: 方法 put(java.lang.String,java.lang.Boolean)
位置: 类 HashMap
map.put(b, new Boolean(false));
^
2 错误

为什么 会报 2个错误呢 怎么解决呢~~
xinxin821103 2007-06-01
  • 打赏
  • 举报
回复
hashmap中的比较是这样
x == y || x.equals(y)

不光光是地址比较,内容也要比较.所以,你的第一第二个都是返回FALSE

但是第3个,你是自己写的类,它没有用到equals这个方法,所以它不会用到String中的equals,他默认的调用了Object里面的,但是Object里面的equals方法是地址的比较,所以会出现一个false,一个true.
stlouisy 2007-06-01
  • 打赏
  • 举报
回复
测试代码如下:
String a = "abc";
String b = "abc";
System.out.println(a == b);//java会把字符串相同的引用放在同一个引用地址中,而不会新键一个引用
输出:true
==========================
String a = new String("ade");
String b = new String("ade");
System.out.println(a == b);//a,b各自是2个不同的引用
输出:false

请问:String a = "abc" 和String a = new String("abc")有什么不同?
饕餮v5 2007-06-01
  • 打赏
  • 举报
回复
建议LZ画下内存状态看下就很明白了
asdfasdf123 2007-06-01
  • 打赏
  • 举报
回复
new一下,就表示产生一个新的.只要记住这点,无论什么类都一样.
justforjoy 2007-06-01
  • 打赏
  • 举报
回复
很老很老的问题了,建议楼主看下以前的帖子。
以前有高人通过JAVA对堆和栈的使用详细分析过的!
believefym 2007-06-01
  • 打赏
  • 举报
回复
3锛宼rue false
because method equals was not overrided
try to override it:
public boolean equals(Object o){
return (o instanceof MyString)&&(((MyString)o).str.equals(str));
}
sword_caihui 2007-06-01
  • 打赏
  • 举报
回复
String在堆里的存在形式遵循copy on write原则,
String a ="abc"
String b ="abc"

当在声明 a = "abc"时,会在堆中分配一块内存给"abc",比如把引用地址记为:0Xff09,
而当在声明b = "abc"时,JVM发现"abc"在堆中已经存在了,所以就会直接把引用地址0Xff09付值给b,所以a==b,

当用new String("")时,内存中的引用地址都是新建的 ,所以不同
zwycsu 2007-05-31
  • 打赏
  • 举报
回复
鍚屾剰Dream_LHY()鐨勶紒锛? 杩欐槸杩欎釜鏍峰瓙锛
aoyihuashao 2007-05-31
  • 打赏
  • 举报
回复
第一段代码:和第2段代码,一样,都是输出false.

因为a.equals(b).
hashmap 的key 比的是equals 而不是==

第三段代码,是true false.

同理 这里里面a.equals(b)=false.



____________________________

String a = "abc";
String b = "abc";
System.out.println(a == b);
输出:true
==========================
String a = new String("ade");
String b = new String("ade");
System.out.println(a == b);


前面的,a跟b指向同一个字符串
后面的,因为用了new 所以是两个值相等的新字符串
Dream_LHY 2007-05-31
  • 打赏
  • 举报
回复
String a = "abc"
当表达式执行的时候,会首先去内存中的字符串池中去找,看有没有ABC这个字符串,如果没有的画,就在字符串池中创建一个,等String b = "abc"时,则a,b其实是指向了同一片内存地址空间,
而String a = new String("abc")则不会去字符串池中查找,是直接创建一个"abc",所以String b = new String("abc")时,它会再创建一个,所以这时a,b指向的是不同的内存空间
daizhenbest 2007-05-31
  • 打赏
  • 举报
回复
效果一样的
q_yanfei 2007-05-31
  • 打赏
  • 举报
回复
楼主,你在不在 啊
q_yanfei 2007-05-31
  • 打赏
  • 举报
回复
String a = "abc" 和String a = new String("abc"),前者和后者的堆的地址不同,故尔不一样的,如果是它们的内容是一样的

62,614

社区成员

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

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