关于java中String用==比较的问题
比如:String s1=="dd";
String s2=="dd";
System.out.println(s1==s2);//true
String s1=new Integer(1).toString();
String s2="1";
System.out.println(s1==s2);//true
String s1=new Integer(12).toString();
String s2="12";
System.out.println(s1==s2);//false
问题点数:20、回复次数:24Top
1 楼learnerkk(可可)回复于 2004-05-02 19:50:25 得分 0
why?Top
2 楼vongood((my c++))回复于 2004-05-02 20:14:08 得分 0
关注,不知为什么,小于11的都是true.Top
3 楼dfsdf36(dfsdf36)回复于 2004-05-02 20:17:50 得分 0
用“==”仅仅是比较引用是否相同,一般没什么意思。用int compareTo(String anotherString)才是比较值
例如 System.out.println("12".compareTo(new Integer(12).toString())==0);//true
至于上面的s1==s2有时true时false,原因应该在与编译器有时智能的把两个值相同string指向同一引用。Top
4 楼zsubear(熊)回复于 2004-05-02 22:49:28 得分 0
java中的String有值不变性,所以编译器会把String设为共享
但有些情况编译器无法分辨两个String是否应当共享
最常见的是+和substring返回的StringTop
5 楼dlxu(脱离纯粹Coding阶段)回复于 2004-05-02 23:00:26 得分 0
判断两个STRING是否相等要用equals方法Top
6 楼ai92(blog.csdn.net/ai92)回复于 2004-05-02 23:18:18 得分 0
markTop
7 楼realwf(洪都拉斯)回复于 2004-05-02 23:43:37 得分 0
比较两个Object(不含基本类型),当用==时,是比较引用是否相同,要用equals方法才可以比较值(但必须是标准程序库中的类,自己写的类要覆写equals方法)。
JAVA为了节约内存,相同内容的String(名字不同)其实可能会指向同一块内存(同一个引用),不太占空间的可能指向不同的引用(如1字节),所以有时比较引用会相同,但比较值时尽量还是应该用equals方法
Top
8 楼fishstudio(仓廪实,而知礼节)回复于 2004-05-03 00:43:17 得分 0
其实很简单,“==”这个操作符仅仅是判断这两个String是不是同一个东西
判断两个STRING是否相等要用equals方法,也就是说equals是看看String的内容
你只要这样比较,肯定有区别的!
至于 String s1=new Integer(12).toString();里面的内容
建议你还是首先输出以下,看看,应该不是你想象的内容Top
9 楼haoqingshi(飞翔)回复于 2004-05-03 04:39:06 得分 0
楼主,我先纠正一下你的错误,我在我的机器上都试过了(jdk1.4):
String s1=new Integer(1).toString();
String s2="1";
System.out.println(s1==s2);//false
String s1=new Integer(12).toString();
String s2="12";
System.out.println(s1==s2);//false
“==”操作符表示的是两个对象引用是否相同(也就说对象值的首内存地址)。
很明显这里new Integer(1)是生成的新的对象,所以它跟s2不可能是指向同一个内存地址,也就是常说的引用。
对于基本类型(int,char,……)以及字符串类型(String,StringBuffer),同时没有生成新的对象的情况下),JAVA为了节约内存,相同内容(名字不同)其实可能会指向同一块内存(同一个引用)Top
10 楼learnerkk(可可)回复于 2004-05-03 10:23:45 得分 0
首先,感谢大家的回答!^^
其次,提醒一下楼上的,我们的QQ讨论组里的人试出来都是大于10的integer是false,而且三楼的vongood((my c++))也说了“关注,不知为什么,小于11的都是true”可见你的“纠正”有些问题,看来其中还是有些什么玄机。
最后,我是SCJP,我不是要炫耀,只是有些类似“==是比较对象引用是否相同”和“数值和字符串应该如何进行内容比较才正确”的回答就不必了,我的本意不是想知道怎么比较才正确,而是要知道个为什么!为什么JavaVM是这样处理的呢?望高手指教!Top
11 楼jkit(不再灌水)回复于 2004-05-03 10:51:12 得分 0
请楼主说一下你的环境。
我是对这句话:“关注,不知为什么,小于11的都是true”绝对奇怪,在WinXP,JDK1.4.1_02环境下测试的,结果很正常,正如先前所料,是false!
测试代码如下:
String a1 = "1";
String n1 = new Integer(1).toString();
System.out.println(a1 == n1);
结果:falseTop
12 楼marvy(marvy)回复于 2004-05-03 12:51:21 得分 0
up!Top
13 楼yoyodd(蓝梦丁丁)回复于 2004-05-03 13:26:04 得分 0
看来我不用说什么了,楼上的说得很清楚了Top
14 楼marvy(marvy)回复于 2004-05-03 13:33:54 得分 10
public class TestString
{
public TestString(){
String s1 = "dd";
String s2 = "dd";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("-------------------");
String s3 = new Integer(1).toString();
String s4 = "1";
System.out.println(s3==s4);//true
System.out.println(s3.equals(s4));//true
System.out.println("-------------------");
String s5 = new Integer(11).toString();
String s6 = "11";
System.out.println(s5==s6);//false
System.out.println(s5.equals(s6));//true
}
public static void main(String[] args){
new TestString();
}
}Top
15 楼marvy(marvy)回复于 2004-05-03 13:34:30 得分 0
楼主很心细:~)
正在思考中 ...Top
16 楼marvy(marvy)回复于 2004-05-03 14:03:18 得分 0
看了一下源码,....new Integer(1).toString()....最终调用的是Integer类中的toString(int i)方法,此方法的实现是如下:
-------------------------------------------------------------------------------
public static String toString(int i) {
switch(i) {
case Integer.MIN_VALUE: return "-2147483648";
case -3: return "-3";
case -2: return "-2";
case -1: return "-1";
case 0: return "0";
case 1: return "1";
case 2: return "2";
case 3: return "3";
case 4: return "4";
case 5: return "5";
case 6: return "6";
case 7: return "7";
case 8: return "8";
case 9: return "9";
case 10: return "10";
}
char[] buf = (char[])(perThreadBuffer.get());
int charPos = getChars(i, buf);
return new String(buf, charPos, 12 - charPos);
}
// Per-thread buffer for string/stringbuffer conversion
private static ThreadLocal perThreadBuffer = new ThreadLocal() {
protected synchronized Object initialValue() {
return new char[12];
}
};
private static int getChars(int i, char[] buf) {
int q, r;
int charPos = 12;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
// Generate two digits per iteration
while (i >= 65536) {
q = i / 100;
// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
// Fall thru to fast mode for smaller numbers
// assert(i <= 65536, i);
for (;;) {
q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
return charPos;
}
-------------------------------------------------------------------------------
没有发觉会与整数大于11和小于11有关的地方。
正在思考...Top
17 楼learnerkk(可可)回复于 2004-05-03 21:25:15 得分 0
谢谢楼上各位的回答,我的环境是xp professional,j2sdk1.4.2
marvy(marvy)能解释一下你的代码吗?谢谢!Top
18 楼marvy(marvy)回复于 2004-05-04 17:54:40 得分 0
呵呵:~)
那不是我的代码,是JSDK的源码。我也正在考虑中...Top
19 楼ruangaofeng(高峰)回复于 2004-05-04 19:49:48 得分 0
我测试了楼主的代码:
public class TestString
{
public TestString(){
String s1 = "dd";
String s2 = "dd";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("-------------------");
String s3 = new Integer(1).toString();
String s4 = "1";
System.out.println(s3==s4);//true
System.out.println(s3.equals(s4));//true
System.out.println("-------------------");
String s5 = new Integer(11).toString();
String s6 = "11";
System.out.println(s5==s6);//false
System.out.println(s5.equals(s6));//true
}
public static void main(String[] args){
new TestString();
}
}
结果是这样的:
true
true
----------------
false
true
________________
false
true
你的猜测是没根据的Top
20 楼sportboys(多动男孩)回复于 2004-05-04 20:18:02 得分 0
我也测试了楼主的代码
public TestString(){
String s1 = "dd";
String s2 = "dd";
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
System.out.println("-------------------");
String s3 = new Integer(1).toString();
String s4 = "1";
System.out.println(s3==s4);//true
System.out.println(s3.equals(s4));//true
System.out.println("-------------------");
String s5 = new Integer(11).toString();
String s6 = "11";
System.out.println(s5==s6);//false
System.out.println(s5.equals(s6));//true
结果是:
true
true
-------------------
true
true
-------------------
false
true
真奇怪Top
21 楼sportboys(多动男孩)回复于 2004-05-04 20:39:19 得分 0
弱弱地问learnerkk(可可)
SCJP是什么啊Top
22 楼sportboys(多动男孩)回复于 2004-05-04 20:46:06 得分 10
其实我觉得,主要是大家的JSDK版本不同所引起的
我刚才还试了
String s3 = new Integer(-2147483647).toString();
String s4 = "-2147483647";
System.out.println(s3 == s4); //true
System.out.println(s3.equals(s4)); //true
这也跟那段JSDK中的代码相吻合了
所以请大家看看自己的JSDK的代码,应该和那个有关Top
23 楼marvy(marvy)回复于 2004-05-05 16:19:57 得分 0
同意sportboys(多动男孩) 。
可能是由于J2SDK的不同版本引起的。Top
24 楼maowu(猫呜)回复于 2004-05-05 16:54:17 得分 0
这是明显的事情,对于java规范没有要求的东西,不同的jdk或者虚拟机都有可能有不同的结果.
Top




