String s0 = "abc";
String s1 = "abc";
String s2 = new String("c");
String s3 = new String("c"); System.out.println(s0==s1);
System.out.println(s2==s3);
运行结果是:
true
flase谁能解释一下原因?
String s1 = "abc";
String s2 = new String("c");
String s3 = new String("c"); System.out.println(s0==s1);
System.out.println(s2==s3);
运行结果是:
true
flase谁能解释一下原因?
解决方案 »
- jsp中关于请求的提交
- =======有谁知道,像sun的网页上发布的那些软件架构图,有立体感的那种,是用什么软件画出来的?
- (JPanel)getContentPane()問題,高手指點
- new 的作用?
- Servlet中取到的中文参数为乱码,如何解决?
- java1.4.2安装完成后,控制台不能启动,带进程中确有javaw.exe
- 如何用eclipse开发console程序
- 我看完了<think in java>(第2版)后,该学什么。请各为高手指点一下学习顺序。无比感谢!!!!!!!
- 60分!.jar文件在linux下不能双击执行!为什么?怎么才能让其能双击执行?
- 求解, 不难的问题, 散分
- 今天我这个菜鸟来跟大家讨论一个问题
- 这个程序为什不能编译?怎样修改,怎样设置负值?
false 是两个不同的对象
在字符串中,"abc"是字面值,java虚拟机处理机制中,会将其放在字符缓冲池中,对于引用指向时候,只要字符缓冲池中有"abc",直接引用对象,不会再创建对象"abc",所有s0,s1指向同一个对象,所以不管是==或者equals()结果都会返回true.
String s2 = new String("c");
String s3 = new String("c");对于这只要new一次就对在堆中创建一个String对象,值是c
所以是两个对象,==地址 equal是内容比较,所以返回的false
String s1 = "abc";
同时指向的是常量池中的地址
String s2 = new String( "c ");
String s3 = new String( "c ");
是在堆内存分配的两个对像
简单解释一下吧,在Java中,只有我们new一个对象时才会在内在中开辟新的空间。“==”测试的是左右两边的对象是不是同一个对象,对于s0和s1,因为我们没有new,所以它们都指向了"abc"这个对象,所以打印出来就是true。而s2和s3,由于两个变量所指的对象都是new出来的,所以虽然它们的内容相同,但是两个对象对应的内在中的地址是不同的。如果想要比较它们的内容,请使用String对象的equals方法。System.out.println(s2.equals(s3))打印出来的结果就是true了。
String s0 = "abc";
String s1 = "abc";
String s2 = new String("c");
String s3 = new String("c");
在JAVA或其他语言中,会将字符串常量分配到一个叫做全局静态的内存区域。
假设 “abc”的分配到的地址为:0x1234
则 s0跟s1都是指向这个地址的,java不会对两个相同的字符串常量分配不同的地址空间;
而 String s2 = new String("c");
String s3 = new String("c");
这2个是通过new操作符在堆中分配一块空间来存储字符串。每new一次都会返回一个新的空闲的对空间的首地址回来。
因此可以知道s2跟s3指向了不同的地址空间。
故:s0==s1 -----》true;
s2==s3------>>false;(注:==在这里只是判断引用的地址是否相同,而不是字符串的内容)
如果这样判断:s2.equals(s3) -----> true;
1、首先要明白:这里的“==”不是判断值的大小的,是判断是否是同一个对象。
2、其次:
String s0 = "abc";//在内存中开辟一个空间(我们称在为A空间),这是s0指的就是A空间里的对象。
String s1 = "abc";//上面的“abc”静态字符串常量,常量明白吧,因为前面已经有了这个常量“abc”所以s1也指向A空间。所以s0和s1是指的同一个对象哦~String s2 = new String("c");
String s3 = new String("c");//new 的话,每次都新制造一个String对象,每次都分配一个新的空间,所以
s2分配了一个新的空间B来存放“c”这个值,s3也被分配了一个新的空间C,用来存放“c”这个值。s2和s3指向不同的空间,但存储的值是一样的。有点像C++里面的指针后引用了,哈哈~
这下应该明白了吧~
第二个是false 因为:通过new关键字 在堆内存内创建了2个不同地址值,不同指向的对象详细解释,去我的博客:
http://blog.csdn.net/ding_gs/article/details/7578571
还不明白,可以给我留言,我们讨论
2.s2和s3都是用new的,都会在堆内存中创建一个新的对象,两个引用指向的是不同的对象,所以是false。
而s2和s3是分别new出来的,在堆中,两个对象分别指向不同的东西,地址不同所以返回false了。