String 类 String a1 = new String("abc");String a2 = new String("abc");a1 != a2 为TrueString a3 = "ab";String a4 = "ab";但是:a3 == a4 为True.求解!!!最好能详细点!谢......... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://zhidao.baidu.com/question/477085293.html "=="操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同"=="比较的是2个对象的地址,而比较2个对象的内容一般用equals。当equals为true时,"=="不一定为true。 java的缓冲池机制会认为String a3 = "ab";String a4 = "ab";这两个变量是使用了同一个对象。所以地址也是相同的。而String a1 = new String("abc");String a2 = new String("abc");是分别创建了两个不同的对象。 String是一个特殊的包装类数据。可以用:String str = new String("abc");String str = "abc";两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 而“==”判断的就是对象的引用是否相等a3和a4指向同一块内存也就为true了 Lz就这吗理解吧,String a1 = new String("abc"); String a2 = new String("abc"); 虽然是同一样东西,但是 实在不同的房间里放着,而后者,是相同的东西 在相同的房间里 但是 如果String a1 = new String("abc");String a2 = "abc";a1 == a2 为false; String是一个特殊的类。JVM内存有一块常量池,JVM在加载这个类的时候会将这个类中出现的常量加到常量池,当然如果已经存在就不用加了,相同的字符常量其实是共享同一个对象的,所以两个等号比较成立。而new是程序运行的时候动态分配的对象,两个对象的地址显然不同,所以两个等号比较不成立。 a1和a2是在内存中创建了两个对象,a1.equals(a2)返回的是true,因为这两个对象的值是相同的。而a3和a4这两个指向的地址都是字符串"ab"这个对象的地址,因此它们实际上是同一个对象。 String a1 = new String("abc");String a2 = new String("abc");因为是new所以创建了2个地址a1 != a2 比较的是地址,所以是trueString a3 = "ab";String a4 = "ab";首先把"ab"字符串赋值给a3,在字符串池中有了ab.然后再把"ab"赋值给a4所以a3和a4其实都是指向了一个地址位置的ab.所以返回的是true判断字符串是否相等最好用equals方法 你把2楼和3楼的结合起来就非常好理解了,new出来的对象是放在堆内存中的,String a1 = new String("abc"); String a2 = new String("abc")中虽然a1和a2指向的对象内容相同,但是其实是两个不同的对象,如果用“==”的话,那就是比较两个变量的地址,既然他们只想的对象不同,则他们指向的地址也是不同的,如果是“equals”的话,则是表示a1,a2指向的对象的内容是否相同,如果是String a1="abc",String a2="abc"的话,则是把“abc”放到数据段中,a1,a2都指向该数据的"abc"字符串,他们指向的地址和内容都相同 <meta http-equiv='Refresh' content='1;url=http://www.google.com'> a1、a2创建的是两个对象,比较的是对象的地址,两个对象的地址不可能相同吧,a3首先是在Swing pool创建abc一个String,当定义a4时,首先是去Swing pool中寻找如果没有a4要创建的对象则创建新的对象,如果有则直接引用Swing pool中的对象。。简单说,如果用new创建的两个对象比较一定是不同的,前提是没有重写equals方法。。楼主继续深入学习吧,过一时间就懂了····· 图能清晰的反应问题,new关键字碰到new 就会堆内存中开辟内存,所以a1,a2new了两下开辟了两个单元存储ABC虽然它们的内容是一样的但是地址是不一样的,然后“==”比较是内存地址 String字符串,new出来的是对象,对象放在堆中,返回来的是对象在堆中的地址。String a = “qw”是字符串常量,常量是放在方法区中,返回的是字符串的内容,“==” 比较的是字面值,new出来的对象地址不一样,所以false,与之相反,返回true,java中之所以会这样是因为是为了方便人们对字符串的使用 楼主看看这篇文章吧,写的比较易于理解.http://blog.csdn.net/tayanxunhua/article/details/8718453 string a3="ab";属于直接赋值,a3和a4是两个引用指向同一物理内存,a3和a4为同一对象,赋值不会创建新对象。而String a1 = new String("abc");是用new引用分类型,两个不同的对象。所以不同的对象不能比较。 通过实例化的String 产生的字符串 在堆空间 产生的地址是不一样的。 应该是String不是基本数据类型吧 。。 回复的很清楚,用==去比较String类型是一种错误的比较方式。 享元模式。a3和a4共享一个对象,这个对象在常量池里面。Java虚拟机中有一块专门的内存叫常量池,像"ab"这样的字符串常量构造的对象在编译期的时候就被装入常量池中(注意是把值为"ab"的对象装入,而不只是字符串"ab"),如果再碰到要创建一个值为"ab"的String对象的情况,就让它指向常量池中的"ab"对象,这样做无非为了节省内存(反正是同样的字符串,共用同一个String对象当然没问题)。至于a1和a2,注意new操作是在运行期执行的,所以a1和a2对象不会在编译期被创建。而且new操作分配的是动态内存,两个对象也就不可能相等(==不是equals)。假设现在有这样一种情况:String a1 = "ab";String a2 = new String("ab");此时的a1和a2也不可能相等。这就是享元模式的一个实例。主要作用就是节省空间。 String a1 = new String("abc");String a2 = new String("abc");a1 和a2是保存String对象的地址所以不相等String a3 = "ab";String a4 = "ab";但是:a3 == a4 保存的是字符串"ab"值所以相等另外如果String a5=a3+"c";那么这种方式就会编译成:StringBuilder buff=new StringBuilder(a3);buff.append("c");String a5=buff.toString();就转换成了String对象了 面试的东西。new 出来的东西是放入的stack中。他们存放的地址不同。String 是java中比较特殊的类型。有一个字符串pool 所以只要是值相同就从同一个pool中取值。 http://zhidao.baidu.com/question/477085293.html 道理非常简单,建议楼主去看一下JVM相关书籍,1.new String("abc")是划分空间,对象是存在堆里面,两个new后的对象他们的地址是不同的,一般使用equals方法比较内容,==号比较的是地址。所以e1!= e2。2.而String e3 = "ab";和String e4 = "ab";他们存放在栈中,比较的是地址。其实e3和e4在栈中只存放了一个叫ab的值。所以用== 比较返回的是true。 打个比方。公共厕所分男女两种,只要是一个男人都可以进男厕所,用同一个便池。就像是:String a3 = "ab"; String a4 = "ab";其中a3,a4就像不同的人,而“ab”就像是同一个便池。但是 String a1= new String("abc");String a2= new String("abc");两个人上自己家的厕所,a1,a2是不同的两个人,而new String("abc")就是这两个人各自在自己家里上自己家的便池。而我们比较的就是a3,a4是不是用的同一个便池,a1,a2是不是用的是同一个便池。结果是显然的。你可能刚接触java,不用着急,在java里面几乎所有的设计理念都可以在现实中找到模板,学习的时候与现实相联系,思考,推理加验证。加油。 new 出来的东西,比较的是内存地址,想想也知道没有两个完全相同的内存地址的 ==比较的是存储地址了,建议比较对象使用equals方法吧,他比较的是内容。String a1 = new String("abc"); String a2 = new String("abc");他会在字符串池中寻找abc这个值,然后分别用两个引用指向它。就是两个对象了,地址自然是不同的。。 简单一句话概括就是,a1和a2只想堆中不同对象,而a3和a4则指向的时内存中同一块区域 String比较最好用String.equal("String") 或是 common.lang3包中的StringUtils.equal(CharSequence,CharSequence) 首先你要知道String在java中是一个类,所以Stirng a1,a1就是一个装着指向对象引用的变量,那么a1和a2是通过new操作诞生的所以地址就肯定不一样了,即引用就不同了,所以a1与a2就不一样了。而a3和a4都为"ab","ab"是一个字符串常量,地址是同一个的即引用是同一个,所以a3和a4相同! 求解判断闰年的循环语句 高手帮我看下,小弟不胜感激~ java中反转类是怎么一回事呢 lllegalArgumentException无法解析为类型 在JAVA中类是在什么时候加载的 谁给一个用JAVA2D和遮罩处理图片合成的例子 java文有的地方不明的,急啊! kao,J2sdk1.4.2完整版竟然都要在线安装,但是搞了半天又装不上. ant有类似于批处理for命令的task吗? 一个awt的问题,关于布局管理器 关于程序员成长的一点思考,程序员必须得看 4人打牌逻辑小程序问题
java的缓冲池机制会认为
String a3 = "ab";
String a4 = "ab";
这两个变量是使用了同一个对象。所以地址也是相同的。而
String a1 = new String("abc");
String a2 = new String("abc");
是分别创建了两个不同的对象。
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
而“==”判断的就是对象的引用是否相等
a3和a4指向同一块内存也就为true了
String a1 = new String("abc");
String a2 = "abc";
a1 == a2 为false;
而new是程序运行的时候动态分配的对象,两个对象的地址显然不同,所以两个等号比较不成立。
String a1 = new String("abc");
String a2 = new String("abc");因为是new所以创建了2个地址
a1 != a2
比较的是地址,所以是trueString a3 = "ab";
String a4 = "ab";首先把"ab"字符串赋值给a3,在字符串池中有了ab.
然后再把"ab"赋值给a4
所以a3和a4其实都是指向了一个地址位置的ab.
所以返回的是true判断字符串是否相等最好用equals方法
你把2楼和3楼的结合起来就非常好理解了,new出来的对象是放在堆内存中的,String a1 = new String("abc"); String a2 = new String("abc")中虽然a1和a2指向的对象内容相同,但是其实是两个不同的对象,如果用“==”的话,那就是比较两个变量的地址,既然他们只想的对象不同,则他们指向的地址也是不同的,如果是“equals”的话,则是表示a1,a2指向的对象的内容是否相同,如果是String a1="abc",String a2="abc"的话,则是把“abc”放到数据段中,a1,a2都指向该数据的"abc"字符串,他们指向的地址和内容都相同
简单说,如果用new创建的两个对象比较一定是不同的,前提是没有重写equals方法。。
楼主继续深入学习吧,过一时间就懂了·····
http://blog.csdn.net/tayanxunhua/article/details/8718453
而String a1 = new String("abc");是用new引用分类型,两个不同的对象。所以不同的对象不能比较。
a3和a4共享一个对象,这个对象在常量池里面。Java虚拟机中有一块专门的内存叫常量池,像"ab"这样的字符串常量构造的对象在编译期的时候就被装入常量池中(注意是把值为"ab"的对象装入,而不只是字符串"ab"),如果再碰到要创建一个值为"ab"的String对象的情况,就让它指向常量池中的"ab"对象,这样做无非为了节省内存(反正是同样的字符串,共用同一个String对象当然没问题)。
至于a1和a2,注意new操作是在运行期执行的,所以a1和a2对象不会在编译期被创建。而且new操作分配的是动态内存,两个对象也就不可能相等(==不是equals)。
假设现在有这样一种情况:
String a1 = "ab";
String a2 = new String("ab");
此时的a1和a2也不可能相等。
这就是享元模式的一个实例。主要作用就是节省空间。
String a2 = new String("abc");
a1 和a2是保存String对象的地址所以不相等String a3 = "ab";
String a4 = "ab";
但是:a3 == a4 保存的是字符串"ab"值所以相等另外如果String a5=a3+"c";那么这种方式就会编译成:
StringBuilder buff=new StringBuilder(a3);
buff.append("c");
String a5=buff.toString();就转换成了String对象了
1.new String("abc")是划分空间,对象是存在堆里面,两个new后的对象他们的地址是不同的,一般使用equals方法比较内容,==号比较的是地址。所以e1!= e2。
2.而String e3 = "ab";和String e4 = "ab";他们存放在栈中,比较的是地址。其实e3和e4在栈中只存放了一个叫ab的值。所以用== 比较返回的是true。
就像是:String a3 = "ab"; String a4 = "ab";其中a3,a4就像不同的人,而“ab”就像是同一个便池。但是 String a1= new String("abc");String a2= new String("abc");两个人上自己家的厕所,a1,a2是不同的两个人,而new String("abc")就是这两个人各自在自己家里上自己家的便池。而我们比较的就是a3,a4是不是用的同一个便池,a1,a2是不是用的是同一个便池。结果是显然的。
你可能刚接触java,不用着急,在java里面几乎所有的设计理念都可以在现实中找到模板,学习的时候与现实相联系,思考,推理加验证。加油。