java中的字符串问题
publicclassCompare{publicstaticvoidmain(String[]args){Strings1="abc";Strings2=newStri...
public class Compare {
public static void main(String []args) {
String s1 = "abc";
String s2 = new String ("abc");
String s3 = "ab" + "c";
String s4 = new String(s2);
String s5 = s1;
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s2==s4);
System.out.println(s5==s1);
}
}
输出结果是: false false false true 为什么??? 展开
public static void main(String []args) {
String s1 = "abc";
String s2 = new String ("abc");
String s3 = "ab" + "c";
String s4 = new String(s2);
String s5 = s1;
System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s2==s4);
System.out.println(s5==s1);
}
}
输出结果是: false false false true 为什么??? 展开
9个回答
展开全部
你这里 == 号是用来比较2个字符串的在java堆栈的引用地址,
而不是用来比较字符串的值,比较值的话如楼上所说 用s1.equals(s2) 这种比较方法
你申明的变量中 S2 属于new出来的值 在内存中间声明了一块新的地方, 所以二个地址不相等
和S4类似.
S3 是属于申明了另一个字符串,虽然S3和S2 在堆栈中值一样但是它们属于二块内存区, 指向的地址也不一样. 你这里比较指向地址 所以为false
S5 是直接把S1的地址赋值给它, 所以为true.
祝你学习进步, 纯手打, 忘采纳!!!
而不是用来比较字符串的值,比较值的话如楼上所说 用s1.equals(s2) 这种比较方法
你申明的变量中 S2 属于new出来的值 在内存中间声明了一块新的地方, 所以二个地址不相等
和S4类似.
S3 是属于申明了另一个字符串,虽然S3和S2 在堆栈中值一样但是它们属于二块内存区, 指向的地址也不一样. 你这里比较指向地址 所以为false
S5 是直接把S1的地址赋值给它, 所以为true.
祝你学习进步, 纯手打, 忘采纳!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
equals是对字符串值的比较 所以:
s1.equals(s2): true;
==是字符串地址的比较 所以
Java中,==用来比较两个引用是否指向同一个内存对象.对于String的实例,运行时JVM会尽可能的确保任何两个具有相同字符串信息的String实例指向同一个内部对象,此过程称为”驻留”(interning),但它不助于每个String实例的比较.一个原因是垃圾收集器删除了驻留值,另一个原因是String所在的位置可能被别的String实例所取代.这样的话,==将不会返回预想的结果.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-06-18 · 知道合伙人数码行家
关注
展开全部
您好,提问者:
System.out.println(s1==s2); //因为s2 new了一次,所以地址不同,输出false
System.out.println(s2==s3); //还是因为s2 new了一次
这里如果把s1 == s3比较的话返回是true,因为String本身是char类型的,它会去内存中找,如果内存中常量池中有,那么就指向常量池这个,如果new了的话就不一样了,new的内容会有产生新的内存地址,所以是false,如果比较内存中的内容的话用equals()。
System.out.println(s1==s2); //因为s2 new了一次,所以地址不同,输出false
System.out.println(s2==s3); //还是因为s2 new了一次
这里如果把s1 == s3比较的话返回是true,因为String本身是char类型的,它会去内存中找,如果内存中常量池中有,那么就指向常量池这个,如果new了的话就不一样了,new的内容会有产生新的内存地址,所以是false,如果比较内存中的内容的话用equals()。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String类型比较特殊,是引用类型。
引用类型的特点就是它是一个地址,指向一块内存区域
当做比较时,是比较他们的指向的地址是否是同一个,所以
s5和s1指向的是同一个内存地址所以是true
其余的都不是相同地址所以是false
如果将==改成。equal()那么都是true了因为equal是比较值
然后,如果将String改写成string(大小写不同),都是true了
string是比较特殊的,即有引用类型的特点,同时又有值类型的特点
引用类型的特点就是它是一个地址,指向一块内存区域
当做比较时,是比较他们的指向的地址是否是同一个,所以
s5和s1指向的是同一个内存地址所以是true
其余的都不是相同地址所以是false
如果将==改成。equal()那么都是true了因为equal是比较值
然后,如果将String改写成string(大小写不同),都是true了
string是比较特殊的,即有引用类型的特点,同时又有值类型的特点
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询