当前位置: 技术问答>java相关
很简单的问题,关于String的
来源: 互联网 发布时间:2017-04-03
本文导语: public class TestB { public static void main(String[] args) { String s1 = new String("1"); String s2 = new String("1"); String s3 = "1"; String s4 = "1"; System.out.println(s1); System.out.println(s2); System.out.println(s1 == s2); System.out.p...
public class TestB
{
public static void main(String[] args)
{
String s1 = new String("1");
String s2 = new String("1");
String s3 = "1";
String s4 = "1";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3);
System.out.println(s4);
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
s3 = "1";
System.out.println(s3 == s4);
s3 = new String("1");
System.out.println(s3 == s4);
}
};
谁可以解释一下为什么是这个执行结果。
在 s3 = "1"; 的时间,没有使用new运算符分配空间,s3是否重新分配了内存空间,s3到底分配到什么地方去了?
为什么
在 String = "String"的时间,==比较的结果永远为true.
{
public static void main(String[] args)
{
String s1 = new String("1");
String s2 = new String("1");
String s3 = "1";
String s4 = "1";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3);
System.out.println(s4);
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
s3 = "1";
System.out.println(s3 == s4);
s3 = new String("1");
System.out.println(s3 == s4);
}
};
谁可以解释一下为什么是这个执行结果。
在 s3 = "1"; 的时间,没有使用new运算符分配空间,s3是否重新分配了内存空间,s3到底分配到什么地方去了?
为什么
在 String = "String"的时间,==比较的结果永远为true.
|
但 jvm 会优化代码
把程序里相同的 常量 ( "1" )
合并成一个对象
正规 并 安全的方法 还是 .equals()
把程序里相同的 常量 ( "1" )
合并成一个对象
正规 并 安全的方法 还是 .equals()
|
obj==obj比较的是对象的引用
obj.equals(obj)比较的是值(注意,这里的obj是系统的class,不是用户自己定义的class)
所以当
String s3 = "1";String s4 = "1";的时候
s3和s4都是指向同一个对象"1"的引用,所以无论是引用还是引用所代表的值,都是相等的
obj.equals(obj)比较的是值(注意,这里的obj是系统的class,不是用户自己定义的class)
所以当
String s3 = "1";String s4 = "1";的时候
s3和s4都是指向同一个对象"1"的引用,所以无论是引用还是引用所代表的值,都是相等的
|
String s1 = new String("1);String s2 = new String("1);
这样声明的时候,在内存里产生了2个不同的对象(虽然值是一样的)。s1和s2的reference是不同的,尽管他们的值是相同的(用equals方法返回true)。也就是说这时有2个不同的实例。
而String s1 = "1", s2 = "1";
由于"1"是literal string,在分配内存空间的时候,声明s2的时候会找内存空间中是否已经存在,存在了就指向同一个地方,也就使得这种声明的变量(如果值一样的话)作比较的时候始终返回true。
这样声明的时候,在内存里产生了2个不同的对象(虽然值是一样的)。s1和s2的reference是不同的,尽管他们的值是相同的(用equals方法返回true)。也就是说这时有2个不同的实例。
而String s1 = "1", s2 = "1";
由于"1"是literal string,在分配内存空间的时候,声明s2的时候会找内存空间中是否已经存在,存在了就指向同一个地方,也就使得这种声明的变量(如果值一样的话)作比较的时候始终返回true。
|
weimenren(愚人碼頭):
对于Integer类型不知道你是不是同样的理解,类似上面:
Integer s1 = new Integer("1");
Integer s2 = new Integer("1");
这时如果比较s1==s2 结果肯定是false;
但是如果使用:s1.intValue()==s2.intValue();结果同样也一定是true;
因为Integer(整数类)转变成了int(整数类型),当然我的理解没有考虑内存分配方面.
对于Integer类型不知道你是不是同样的理解,类似上面:
Integer s1 = new Integer("1");
Integer s2 = new Integer("1");
这时如果比较s1==s2 结果肯定是false;
但是如果使用:s1.intValue()==s2.intValue();结果同样也一定是true;
因为Integer(整数类)转变成了int(整数类型),当然我的理解没有考虑内存分配方面.
|
我自己有一个个人的理解,不过不好说!
反正用==时,System.out.println(s1.intern()==s2.intern());
绝对是正确的结果!
反正用==时,System.out.println(s1.intern()==s2.intern());
绝对是正确的结果!
|
对于String类来说 String s="1";和String s=new String("1");都创建了新对象,==比较的是序列号
|
String 对象一旦产生就不能改变
任何(加减)操作都会有一个新的对象
任何(加减)操作都会有一个新的对象
|
== 运算应用于对象时比较的 是引用本身 不是指向的对象
如果两个引用指向的是同一个对象 结果就是 true
如果两个引用指向的是同一个对象 结果就是 true
|
标识 对象的 序列号?
|
String s1=new String("1");
创建了一个字符串类的实例S1,
String s1="1"
创建的是一个字符串类型变量!
==比较对象,似乎是不行的!
这是个人理解!
创建了一个字符串类的实例S1,
String s1="1"
创建的是一个字符串类型变量!
==比较对象,似乎是不行的!
这是个人理解!