String st=“abc”;和String st=new String(“abc”)的区别
比如
String st1=“abc”;
String st2=“abc”;
st1==st2 是trueString st1=new String(“abc”)
String st2=new String(“abc”)
st1==st2 是false
比如
String st1=“abc”;
String st2=“abc”;
st1==st2 是trueString st1=new String(“abc”)
String st2=new String(“abc”)
st1==st2 是false
String st2=“abc”;
st1==st2 是true st1和st2是同一块内存,String st2 在内存里找到st1赋值给了st2
所以st1==st2
String st1=new String(“abc”) //st1 new了一块内存
String st2=new String(“abc”) //st2 有新new了一块内存
st1==st2 是false
好像就是这样~~·
String st2=“abc”;
这里的st1和st2指向的是同一个常字符串,他们拥有的值。故st1==st2 是true
String st1=new String(“abc”)
String st2=new String(“abc”)
这里的st1和st2分别是两个不同的string对象,他们在内存中的位置不同,而“==”判断的是连个对象是否相等,所以为“false”,如果想比较他们的内容是否相等,可以用boolean e=st1.equals(st2);
没有每天一帖就很。
Orz
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
在JAVA对对象的初始化通常有两种方法:
1.基本数据类型:如:int i=5;
2.普通类型:入God g=new God();
但是String是其中比较特殊的一个问题。可以用以上两种方法来初始化!
String st=“abc”;和String st=new String(“abc”);而且前者是更通用的一种简单方法。
至于二者为什么不相等,其实是JAVA中另外一个问题:JAVA中“==”的用法。
说到这个问题又牵涉到深层COPE的问题。太复杂,这就就用最简单的话,尽力把事情说明,希望楼主能明白就可以了!JAVA中“==”比较的是其两边的对象的物理地址是否相同。
String st1="abc";String st2="abc";并没有创建一个真正的内存对象,只是将两个String型的引用指向了存放于同一个内存地址的同一个对象“abc”而已。而String st1=new String("abc");String st2=new String("abc");则不同,我们知道,JAVA中new 就是用来开辟一个新的内存空间,然后在这个空间上创建new处理的对象。所以这个引用st1和st2指向的是两个位于不同的内存空间的两个独立的对象。所以他们指向的物理地址是相同的。所以“==”返回true。另外,额外的提醒一下,我们进行操作的时候通常操作的都是"引用",而不是“对象”。这点经常导致一些难以发现和理解的错误,所以必须要留意!
而如果你想比较内容是否相同,可以用equals()方法
楼主可以看一下
String s1="abc";
String s2="abc";
String s3=new String ("abc");
String s4=new String("abc");
System.out.println(s1==s2);
System.out.println(s3==s4);
System.out.println(s1.equals(s2)+" "+s3.equals(s4));
System.out.println(s1.equals(s3)+" "+s2.equals(s4));
结果是
true
false
true true
true true
我还有几个问题 问下7楼
用堆和栈 考虑。 引用是放在栈里的吧。存放的值放在堆里的吧
String st=abc st是在栈里的,那abc 是否是在堆里?
我问过一个C的高手,他说不实例化的都在栈里那== 是判断 栈里的引用值是否相等,还是判断引用所指向堆里的地址是否相等呢?
st为一个引用,在栈内存中,"abc"实际是一个匿名对象,开辟在堆内存中,同时使这个堆内存的地址等于st的内容,完成了st对他的引用
String st2=new String(“abc”)
st1和st2的hasCode不同.
String st1=“abc”; String st2=“abc”; 那么在内存里存储的是同一个“abc”,只是被不同的2个对象引用。
如果开发者想要用2个不同的“abc”,那就用楼主所说的new 吧。
而后两个分别创建了两个对象,在堆空间分配了两块儿内存分别由两个对象指向,==是比较地址中的内容
而恶quals()是比较两者值是否相等
String st2=“abc”; 内存分为堆和栈st1,st2为栈中的一个变量
"abc"为堆中的一个匿名对象
第2个"abc"也是一个对象,但是前者已经存在所以它在常量池中,所以st1和st2引用的地址相同!这里就有了常量池的概念!~String st1=new String(“abc”)
String st2=new String(“abc”) st1与st2引用了不同的地址所以它们不可能相等
你想知道这个知识点的内幕,你要花2分钟了解一下,String常量池的概念了
Sting s="abc" JVM会先在Sting常量池中查找,如果找到了,就不会new了(当然可以找到),如果找不到,就会new一个,并且添加到Sting常量池.
如果你在给个语句 Sting s1="abc",那么这次肯定是在String常量池中找到s引用的"abc"了
所以他们是对同一个对象的引用后面那个就很简单了,2个new出来的对象当然不能简单的"=="