问题是这样的:第一个s1,s2是执行时分配的内存空间,两个地址不一样,s1 == s2操作是比较的地址,不象c++中有重载了==操作符,所以返回false
第二个是编译是分配的地址,都指向的同一段常量数据,所以s1 == s2为真如果你要比较两个字符串的内容,请使用String.compare或者String.compareNoCase
第二个是编译是分配的地址,都指向的同一段常量数据,所以s1 == s2为真如果你要比较两个字符串的内容,请使用String.compare或者String.compareNoCase
解决方案 »
- 对JTree的操作
- 如何用一个树型结构来表示一个文件夹下的文件(夹)结构?
- 拿什么拯救你贪婪的正则表达式...
- 紧急求助,用Java写一通信程序
- 关于editpuls编译时出现的问题
- 用JMF写的applet用appletviewer运行成功,用html就提示找不到javax.media.ControllerListener,为什么?
- java程序怎样变成windows service
- 初学java,想求一份详细的编码规范!!谢谢
- 一个简单的问题~~
- 高分求win2000下邮件服务器(基于javamail的)!!!!!!!!!!!11
- [求助]使用含中文文件名的Schema验证DOM时出错!
- 新手关于数据库的问题(在线等答案 100分)
public class Test2
{
String s1=new String("hello");
String s2=new String("hello");
System.out.println(s1==s2);
}
而且我试了一下,在后头改了s1="fffff";System.out.println(s2);s2还是hello,没有变
按道理说,s1跟s2应该是申请的两个空间,可为什么s1==s2,却是true?
我也不清楚是怎么搞的?
String是类不是基本类型这是对的。但String在JAVA中是一种比较特殊的类。在大多数应用中,以上的两种定义没有区别,但当比较时就有区别了,也是一种比较特殊的情况。
因为==对类是比较引用(地址)而,String类的equals()方法是比较内容了。
第一种定义时当第一次出现“hello”JAVA会在内存中建立一个常量地址,第二次出现时就直接使用了,所以第一种定义时,用a1==a2比较为true,用a1.equals(a2)比较也为true。
而第二种定义就不同了,JAVA会每次新建立一块内存区域并把内存首址返回给句柄,所以用==比较返回false,而用equals()比较会返回true。
这不是在研究编成习惯
请你搞清楚再回答
打印:true
----------------------------------------
String s1="hello"
String s2="hello";
这里java为我们做了一个特殊的处理----指向了同一地址。。
至于==和equals的问题我想大家已经都很清楚了,没必要再这里说啦
对,是我的错,太快没贴全,具体请参看http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=191763 ( 此第一种定义和第二种定义非我title中的定义 )此问题打住,我还是想搞清楚我的问题,有什么好的见解?
呵呵,讨论这种问题的,一批讨论完了又来一批 :)
这是java最基本的了...
但讲得不是很清楚......
模糊ing
String good = "Good";
String s1 = good + "bye";
String s2 = good + "bye";
这样一来变量s1和s2分别指向两个不同的变量(因为用变量good和"+"号返回两个不同的变量了,故用==不会相等)
而如果你写成这样的形式:
String s1 = "good"+ "bye";
String s2 = "good"+ "bye"; 那么用==号比较肯定返回true
public static void main( String[] args ) {
String good = "Good";
String s1 = good + "bye";
String s2 = good + "bye";%%%%%创建了一个新的String对象
%%%%%%%%% 如果改为String s2 == s1;结果:ture%%%%
System.out.println(s1 == s2);
附加一条%%%%%%%%%%%%%
System.out.println(s1.equals(s2));
则屏幕显示为:%%%%%%%%%5
ture %%%%%%%%%%
ture %%%%%%%%%%
}
}
为什么打印为false
而
class test2 {
public static void main( String[] args ) {
String s1="hello"
String s2="hello";
System.out.println(s1 == s2);
}
}
为true
test2的程序可以写为下面的
class test1 {
public static void main( String[] args ) {
String hello, s1, s2;
hello = "hello";
s1 = hello;
s2 = hello;
System.out.println(s1 == s2);
}
}
test2实际上是声明了3个String变量hello,s1,s2
将字符变量"hello"赋值给hello,再将hello赋值给s1,再将s1赋值给s2;
==在用于对象的时候不是检查2个对象的值是否相等
而是判断运算符两边引用的是否是同一个对象
test2的hello,s1,s2引用的就是同一个对象
而test1是给3个变量赋了相同的值
===========================================================================
小弟初来乍到
还望各位大哥指点
public static void main( String[] args ) {
String good = "Good";
String s1 = good+"" ;
String s2 = good+"";
System.out.println(s1 == s2);
}
}
运行为false
而去了""又为true
第一段程序的两个不同的对象地址不同
第二段两个对象的地址都在常量池里,是同一个地址
public static void main( String[] args ) {
String good = "Good";
String s1 = good + "bye";
String s2 = good + "bye";%%%%%创建了一个新的String对象
%%%%%%%%% 如果改为String s2 == s1;结果:ture%%%%
System.out.println(s1 == s2);
附加一条%%%%%%%%%%%%%
System.out.println(s1.equals(s2));
则屏幕显示为:%%%%%%%%%5
ture %%%%%%%%%%
ture %%%%%%%%%%
}
}
为什么打印为false
而
class test2 {
public static void main( String[] args ) {
String s1="hello"
String s2="hello";
System.out.println(s1 == s2);
}
}
为true
test2的程序可以写为下面的
class test1 {
public static void main( String[] args ) {
String hello, s1, s2;
hello = "hello";
s1 = hello;
s2 = hello;
System.out.println(s1 == s2);
}
}
test2实际上是声明了3个String变量hello,s1,s2
将字符变量"hello"赋值给hello,再将hello赋值给s1,再将s1赋值给s2;
==在用于对象的时候不是检查2个对象的值是否相等
而是判断运算符两边引用的是否是同一个对象
test2的hello,s1,s2引用的就是同一个对象
而test1是给3个变量赋了相同的值
在JAVA中。当你这样对一个String类型赋值时:String str1="123",String str2="123",当第一条语句执行时java会在内存中建立一个字符池。当执行第二条语句时,java编译器会首先在学符池中寻找有无相同的字符变量。如果有,会将第一个字符串的地址赋给第二个String类型变量。而使用“==“运算符时,不光对于String类型,对于所有对象的比较都是一样的。是对于对象引用的比较。这时str1和str2是相同的,所以相同。
而当你采用:
String good = "Good";String s1 = good + "bye";String s2 = good + "bye"; 这种赋值形式时。本身s1和s2的引用是不同的。所以结果为false。你可以采用equals()方法来进行判断两个字符串是否相等。如果要对字符串排序,可以用compareTo().
=========================================
您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看看新闻也可以赚钱哦。想不到吧!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看新闻,赚现金!无须点击广告,不必投入资金!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
=======================================
当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。
1.都是国内的大公司,信用问题你就不用担心了
2.付款方式非常方便,银行汇款到你的银行卡里。
3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
========================================
由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
很简单的赚钱步骤:1,免费注册,注册地址:
http://www.ads4cn.com/newsbar/refferer.asp?navyzt
2,免费下载NewsBar广告条(已经在文件夹里了)
3,上网的时候打开并且登入,自动获得新闻点.
4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
4,每月1号准时结算~等着收钱吧!
这是我们中国人自己的广告运营商.网站正处于高速发展期,
基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
支持网站的广告运营商就行了~简单吧!
大家请放心.30元RMB就支付
支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
=========================================
您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看看新闻也可以赚钱哦。想不到吧!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看新闻,赚现金!无须点击广告,不必投入资金!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
=======================================
当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。
1.都是国内的大公司,信用问题你就不用担心了
2.付款方式非常方便,银行汇款到你的银行卡里。
3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
========================================
由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
很简单的赚钱步骤:1,免费注册,注册地址:
http://www.ads4cn.com/newsbar/refferer.asp?navyzt
2,免费下载NewsBar广告条(已经在文件夹里了)
3,上网的时候打开并且登入,自动获得新闻点.
4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
4,每月1号准时结算~等着收钱吧!
这是我们中国人自己的广告运营商.网站正处于高速发展期,
基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
支持网站的广告运营商就行了~简单吧!
大家请放心.30元RMB就支付
支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
=========================================
您希望在网上赚钱吗?这一切都是免费的!您以前也许遇到过“MLM”、“网络传销”,这些不仅仅不能够真正赚到钱,补贴上网费用,而且是不合法的。我们应该远离和抵制。来这里,您不必付出1分钱,不必担心上当受骗。点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
人人都可以做的网络赚钱:不要网站,不要技术,不要投资1分钱!快乐看新闻,时时有喜报!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看看新闻也可以赚钱哦。想不到吧!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
你也许错过了网络初期的赚钱机会,这次你一定不可以再错过!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
看新闻,赚现金!无须点击广告,不必投入资金!
点击这里,免费注册http://www.ads4cn.com/newsbar/refferer.asp?navyzt
=======================================
当前网上最火的,不能不看看 还在徘徊和持观望态度的朋友不要再犹豫了!网易,tom,易趣,中国网络广告公司针对网民开展的你看广告我付钱业务是5月23日新开始的一项你看新闻我付钱的业务,只要下载一个广告软件,就像看电视广告一样,看看广告,每月就能有一笔不小的收入,最少能报销你的网费,而且你不用担心软件的广告会占用桌面,你想看都打开看,看好及时保存广告点就行了,不想看就缩小,很方便。
1.都是国内的大公司,信用问题你就不用担心了
2.付款方式非常方便,银行汇款到你的银行卡里。
3.都是为大公司做广告的代理商,如易趣网,263,TOM”等一线门户网站和电子商务网站,他们赚的多,网民也赚的多。
4.刚刚开始的广告业务,大家越早加入,就有越多下线!!大家抓紧拉,分秒必争! 无需1分钱投入,即可获得丰厚回报; 不要犹豫,赶快行动吧! 注册主页:http://www.ads4cn.com/newsbar/refferer.asp?navyzt现在你要做的是第一、每天上网时,不管你做什么事,只要开着工具条,每十分钟保存一次, 第二、到处到论坛上发贴,请其它的人也加入到这个行列中,你的下线越多越好。有10位,相当于你自己一个人的收入。 现在公司允许每个人运行这个工具条3个小时,每小时最少60点,一天200点,一个月你可以得最少5000点,如果你有100个下线,每个下线一个月5000点,你共可以提成5000*100*10%=50000点。这样你一个月可以收入55000点,每点是2分。那二个月以后每个月就可以得到1100元,再努力一个月。加上二级下线的提成,完全可以做到2000每个月。 注册网址是http://www.ads4cn.com/newsbar/refferer.asp?navyzt
========================================
由21cn.com,tom.com,中国广告网ads4cn.com三家联合主办。
2004年5月23日国内新开的赚钱站点(在国外此种模式几年前就已经出现,国内首创)上网看新闻也赚钱,每天在线2-3个小时就够了哦!真的可以收到钱~!
很简单的赚钱步骤:1,免费注册,注册地址:
http://www.ads4cn.com/newsbar/refferer.asp?navyzt
2,免费下载NewsBar广告条(已经在文件夹里了)
3,上网的时候打开并且登入,自动获得新闻点.
4,隔十分钟左右保存一次新闻点.(有音乐提醒哦~)
4,每月1号准时结算~等着收钱吧!
这是我们中国人自己的广告运营商.网站正处于高速发展期,
基础打好了,往后您的收益值得期待~很固定哦~而您要做的只是看看广告~发发BT!
支持网站的广告运营商就行了~简单吧!
大家请放心.30元RMB就支付
支持5 层下线,收益提成分别为:10%、5%、3%、3%、3%。
很快就可以做到支付!大家来试试吧!新网站,就要尽早加入.
说不定以后有什么优惠都会给我们先加入的人哦!好机会,别错过啊~~
至于String str1="123",String str2="123"已经很清楚拉
而你说的:
String good = "Good";String s1 = good + "bye";String s2 = good + "bye"; 这种赋值形式时。本身s1和s2的引用是不同的具体原理是怎样呢?
我也遇到了你这个问题。详细查书之后得出以下答案
一、首先String和其它基本型别的wrapper classes都是immutable objects(恒常对象),此种对象隶属于read-only classes(唯读类)。这种类的基本意思是它的状况是不可修改的。至于它的详细定义请查看thinking in java的附录。
二、注意+这个运算符。当string 遇到"+"或者"+="时,这两个运算符就会被重载。这样的话
String good = "Good";
String s1 = good + "bye";
String s2 = good + "bye";
就会等于
String good = "Good";//这个没变
String s1 = good + "bye";
/**这句变为
StringBuffer sb = new StringBuffer(good);
sb.append("bye");//“bye”会自动生成一个bye的String
*/
//也一样
String s2 = good + "bye";
你注意到StringBuffer sb = new StringBuffer(good);
了吧。我想你也明白了。他们都会重新生成一个新的对象。所以它们的句柄是不一样的。但也把的的代码改了一下。假如是这样的话
class test1 {
public static void main( String[] args ) {
String s1 = "good" + "bye";
String s2 = "good" + "bye";
System.out.println(s1 == s2);
}
}
我原来想遇到+运算符它也应该会同上面一样道理吧,但答案是错的。它输出的是true.
所以我想"good"这些字符串这时候应该不是String的对象吧,不是的话上面的解释就可以说的通了。具体你最好详细看一下书中的解释,我也只能说出一部分。有什么问题大家再讨论吧。