Code Bye

有关字符串的疑问

 

下面是我写的一个有关字符串的测试类
class Test
{
public static void main(String[] args)
{
String s1=”abc”;
String s2=”abc”;
if(s1==s2)
{
System.out.println(“==”);
}
else
{
System.out.println(“!=”);
}
if(s1.equals(s2))
{
System.out.println(“equals”);
}
else
{
System.out.println(“!equals”);
}
}
}
输出是==和equals
我的想法是s1和s2都是在栈内存中的啊,字符串是在堆中的,为什么会==呢?
String s=”a”和String s=new String(“a”)在内存分配上有什么区别么?

String s1=new String(“a”)
String s2=new String(“a”)这样是在栈中有两个引用s1和s2,它们的值不同,分别指向堆中的两个对象,对象的值都是a.
而String s1=”a”;
String s2=”a”;在栈中有几个引用呢?在堆里有几个对象呢?它们是怎么指向的啊?
1分
关注
1分
s1和s2他们指向的是同一个”a”,所以==。如果
String s1=new String(“a”)
String s2=new String(“a”)
就是s1!=s2,因为s1,s2的分配的内存地址不同了。
1分
UP~~~~
我今天看了JDK的帮助,它说String str = “abc”;等价于char data[] {“”a””, “”b””, “”c””};
String str = new String(data);我又测试了下这个:
class Test
{
public static void main(String[] args)
{
char data[] = {“”a””, “”b””, “”c””};
      String s1 = new String(data);
      char data1[] = {“”a””, “”b””, “”c””};
      String s2 = new String(data1);
         if(s1==s2)
         {
System.out.println(“==”);
}
else
{
System.out.println(“!=”);
}
if(s1.equals(s2))
{
System.out.println(“equals”);
}
else
{
System.out.println(“!equals”);
}

}
}

为什么输出是!=和equals呢?

1分
学习
1分
String s1=”abc”;
String s2=”abc”;
结果s1==s2?巧合?
以前只听说
String s1=”abc”;
String s2=s1;
这种情况下s1==s2
但是我试了几次都是==
1分
使用new String()构造字符串,总会在内存中新辟空间存放内容
所以地址是不一样的
用==判断总是不同的
equals判断内容相同所以能相同
1分
用String s1=”abc”,”abc”是一常量放在串池中
当再声明一个String s2 = “abc”时s2指向的地址与s1指向的地址是一样的
所以用s1==s2判断时,返回值为true ;
用equals 就不用说了内容一样返回true ;
1分
同意SADOCom的观点
1分
同意SADOCom() 
JAVA是“懒”,看到已经存在“abc”这个字符串,就在String s2时直接拿来引用了。
1分
楼上高见
== 判断地址 equals判断内容 明白否?
楼上的兄弟高招简洁明了啊!
== 判断地址 equals判断内容

=========================

简明 易懂

用String s1=”abc”,”abc”是一常量放在串池中
当再声明一个String s2 = “abc”时s2指向的地址与s1指向的地址是一样的
java不会再开辟空间给字符串abc的哦,所以字符串还是以前的字符串,所以String s1=”abc”,String s2=”abc”,就是s1指向了abc字符串,s2也指向了abc字符串,==用来比地址,对于同一个abc字符串,地址显然是一样滴嘛。
关注

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明有关字符串的疑问