String a = "JAVA";
String b = "JAVA";
String c = new String("JAVA");
String d = "JA";
String e = "VA";
String f = "JA"+"VA";
String g = d+e;
String h = c;
System.out.println(a==b);//TRUE
System.out.println(a==c);//FALSE
System.out.println(a==f);//TRUE
System.out.println(a==g);//FALSE
System.out.println(c==f);//FALSE
System.out.println(c==g);//FALSE
System.out.println(c==h);//TRUE
//为什么a==g是FALSE呢?
String b = "JAVA";
String c = new String("JAVA");
String d = "JA";
String e = "VA";
String f = "JA"+"VA";
String g = d+e;
String h = c;
System.out.println(a==b);//TRUE
System.out.println(a==c);//FALSE
System.out.println(a==f);//TRUE
System.out.println(a==g);//FALSE
System.out.println(c==f);//FALSE
System.out.println(c==g);//FALSE
System.out.println(c==h);//TRUE
//为什么a==g是FALSE呢?
解决方案 »
- 不显示删除回复显示所有回复显示星级回复显示得分回复 卡在BufferederInputStream.read()和HttpURLConnection.getI
- Struts 标签输出日期,怎么设置输出格式
- 关于jTable中放JComboBox的问题
- 一个applet包含多个class文件时怎样将其嵌入html文件中?
- 请问怎样判断一个文件的写入是否结束?与是否读到文件尾是两个问题吗?未写完的文件有文件尾吗?谢谢!
- 100分在线求助一个问题,
- java 怎样取得一个图片的尺寸
- JNI 谁能给讲讲,比如俺要去本机CPU
- 我想做一个远程监控桌面的程序!大家近来讨论一下都有分~
- 怎样去掉applet中的菜单和对话框下面的警告条???
- 牛人进
- 如何去掉List中重复的对象???
对象比较要用equals
要a.equals(g)才是true
//为什么A==G
因为a和b是常量字符串"java",编译器在编译时做了自动优化,将a和b指向了同样一个地址,但g是计算结果,不具确定性,编译器无法提前知道取值,当然不可能做相应的优化,指向同一个地址.因此,g指向的是另外一个地址.
//为什么A==F?
f当然是对了,f是常量字符串连接,编译器在编译时首先会做"JA" + "VA"这一步,结果不就是"JAVA"嘛
"JAVA"这种好象叫做字符常量,放在全局区的?
String a = "JAVA";
String g = d+e;跟String f = "JA"+"VA";
是不相同的,String g = d+e;相当与new了一个String 对象,所以重新分配了内存。
如果你换成String g = d+"VA";跟a==g的值依然是false,这也是new了一个对象。
所以内存地址不相同。
楼主的String f = "JA"+"VA";这一条语句,可以改为String f = "JAV"+"A";
String f = "JAVA";等等这种字符串拼接起来的效果是一样的。跟String g = d+e;完全是两种不同的方式。
只要搞清楚用Stirng 类的两个构造函数,当然肯定也用到了new,肯定产生一个新的对象,分配新的内存地址。表达士(d+"VA")不是常量表达士,因此也产生了一个对象,相当于new。用常量创建的都是同一个interned字符串,所以内存地址相同。
string类比较特别,有问题可以在论坛里搜下,以前有很多类似的问题,也有很多经典的答案。
很明显上面的内存地址不同啊
你用eques()方法比较是比较他们的内容的
==好像是比较两个对象的内存地址是否相同
很明显上面的内存地址不同啊
你用eques()方法比较是比较他们的内容的
支持
equals,相当于调用了每个对象的toString()方法,然后再比较
你可以给两个绝对不一样的对象加同样返回值的toString方法
再调用equals(),100%是true
呵呵,接分!
一般对象比较用equals()
a.equals(b)....true;
a==b 是比较两个对象的地址(可以这样理解),肯定false
除非年是原始类型可以这样比较
如
char a ='a';
char b= 'b';
a==b --true;
要比较对象的值要用equals
欢迎大家参与程序群的讨论,共同进步!
群号:32998944(程序人生)
String b = "JAVA";//a==b是成立的,因为都是直接量。JVM为了优化,a,b两个引用变量指向同一个对象,如果你要
a=f的唯一办法是
f.intern();
a==f就是TRUE了。
String b = "JAVA";
String c = new String("JAVA");
String d = "JA";
String e = "VA";
String f = "JA"+"VA";
String g = d+e;
String h = c; 下面逐一的说:System.out.println(a==b);//TRUE 通过String str=""这种方式获得的相同内容的String指向同一个intern对象
System.out.println(a==c);//FALSE new String()方式生成的是一个新的对象,可通过intern()方法指向同一个intern对象System.out.println(a==f);//TRUE "JA"+"VA";会在编译期换为"JAVA"System.out.println(a==g);//FALSE d+e后,是新的String了,不会在编译期完成
System.out.println(c==f);//FALSE 这个很简单,地球人都知道
System.out.println(c==g);//FALSE 这个很简单,地球人都知道
System.out.println(c==h);//TRUE 这个很简单,地球人都知道