String a = "ab"+"c"; 这时候生成的"abc"会放入StringPool(正解), String a="ab"; String c=b+"c"; 由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。 即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。
agree. and if you want to compare 'equalsIgnoreCase' and '==' oprator, you can use code following to test. String a = "abc"; String b = String.valueOf(new char[] {'a', 'b', 'c'}); //String b = "a" + "b" + "c"; System.out.println(a==b); System.out.println(a.equalsIgnoreCase(b)); results: false truethe value of b is the address of string representation of instance 'new char[]'.
肯定会是false,a和b是对象的地址,肯定是不等的。equal的话很难说
应该是false吧 ==是对比内存地址
应该是false吧 ==是对比内存地址
考试常考的东西,就是==与 equal()函数的区别... 答案为false
String a = "ab"; String b = "a" + "b"; System.out.println(a==b); 这个是true String a = "abc"; String b="ab"; String c=b+"c"; System.out.println(a==c); 这个是false 因为a变量引用的的地址是“abc“,而c引用的地址是b引用的地址,所以a和c不相同我提个问题 String a=new String("abc"); String b="abc"; System.out.print(a==b); true 还是false
我记得这个问题在《Thinking in Java》中的一个例题出现过,当时我也很奇怪,后来baidu了一下,正如61,62l的解答。
String a = "ab"; String b = "a" + "b"; System.out.println(a==b); 这个是true String a = "abc"; String b="ab"; String c=b+"c"; System.out.println(a==c); 这个是false,如果说c引用地址是b引用的地址的话,那么System.out.println(b==c);应该是什么结果呢 我觉的c不是引用的b的地址。而是当一个对象+字符生成对象的时候会另建地址的
public class test1 { public static void main(String[] args) { String a="ab"; String b="a"+"b"; String f=b; System.out.println("a==b is "+(a==b)); System.out.println("a==f is "+(a==f)); String c="abc"; String d="ab"; String e=d+"c"; System.out.println("c==d is "+(c==d)); System.out.println("c.equals(e) is "+(c.equals(e))); }} 结果: a==b is true a==f is true c==d is false c.equals(e) is true 结论: 在JAVA中,进行字符串比较,还是用equals()保险。
String b="ab";
String c=b+"c";
System.out.println(a==b);
true or false?
String b="ab";
String c=b+"c";
System.out.println(a==c);
true or false?上面写错了
这个有意思 我把b和c都输出了 结果都是abc
可答案是false
有意思
我还是认为是true,但是编译下来是false.....
加上了
System.out.println(a);
System.out.println(c);
输出均是abc
为什么是false,求解
这样就应该好懂些 ,也学的深入些
不要局限于这个具体的题目
要由此题目进行引申
而a和c在内存中保存的首地址是不一样的
String a = "abc";
String b="ab";
String c=b+"c";
System.out.println(a==c);好像a是表示的是值,c是对象句柄,所以a==c就是false,不知道这个解释是否正确?
是true...刚才忘记按保存就直接编译了...汗死...不知道我13楼的解释正确否?LZ可以出来说下不?
结果true个人认为这个可能和sun公司的对一些基础的内存的地址分配有关系。
请LZ给出正确解释
String a = "ab"+"c";
这里会被编译器自动优化成a = "abc";它是存在在栈中的
String a="ab";
String c=b+"c";
这里,实际上a是一个对象了,那么+操作符会把结果放到堆内存中,这样,两块内存是不一样的,虽然内容是一样的
所以它们比较就得到false了.
虽然现在在某个jre环境上得到某个值,如果将来编译器能够优化代码中的多余语句,情况又可能不一样;
而且,如果项目中谁用这个方法来比较字符串是否相同,通常是要抓出来批斗的!
这个问题主要是让大家了解String的工作方式
String a = "ab"+"c";
这时候生成的"abc"会放入StringPool,
String a="ab";
String c=b+"c";
由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。
String a = "abc";
String b="ab";
String c=b+"c";
System.out.println(a==c);
System.out.println(a.equals(c));
a = "ab";
b="a"+"b";
System.out.println(a==b);
即使不在java区翻已存在的提问,google下也不至于吧<(  ̄︿ ̄)︵
Java codeString a = "abc";
String b="ab";
String c=b+"c";
System.out.println(a==c);
true or false?a,b,c都是对象的引用名称,显示用"=",是比较a,b,c是否引用同一个对象,使用"+"连接b,c,会在String 池里生成一个新的对象c,显然和a的引用对象不同,false.
改为
String a = "abc";
String c="abc";
System.out.println(a==c);
true or false?结果为true。当有可以共享的字符串对象时,会先搜索String池,"abc"已经存在,所以在创建c时候,直接返回,a,c引用相同的对象
a和c在内存中是两个东西,而楼主的那两个是常量,存放在常量池中,比较方式不同
String a = "ab"+"c";
这时候生成的"abc"会放入StringPool,
String a="ab";
String c=b+"c";
由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。】
呵呵,确实是一种缓冲池技术,一些基本类型的封装类也有用的,这主要是内部如何实现的 问题
String a = new String("ab");
String b = new String("a" + "b");
System.out.println(a == b);
这么写就是false
会是true还是false呢?
会是true还是false呢?
String a = "ab"; //第一句在堆栈区放入一个名字为a,其内容指向数据区的一个字符串常量"ab"的地址。
String b = "a" + "b"; //先计算"a" + "b" 其返回值必为字符串"ab",于是编译器就在数据区找是否已经存在"ab",显然已经存在,于是就把已有"ab"的传给堆栈区的b。
System.out.println(a==b);//比较a与b存放的地址是否相同,经上面的分析得相同。
见笑了!!
也许某一天这个帖子里的某位高人,自己实现了一个JVM,测试这个程序返回的就和大家现在的结论不一致,但是这绝不违反java规范!
这时候生成的"abc"会放入StringPool(正解),
String a="ab";
String c=b+"c";
由于和字面量"c"进行+运算的是一个对象而不是字面量,这样Java虚拟机就会在堆里面生成一个新的对象并返回该对象引用,此时变量a和变量c指向了两个不同的地址。
即使String a = new String("abc"),虽然这样一来a和c都是指向堆的,但她们还是指向两个不同的对象,因为b+"c"会新生成一个对象。
毕竟我觉得他们指向了2块不同的内存地址。
agree.
and if you want to compare 'equalsIgnoreCase' and '==' oprator, you can use code following to test. String a = "abc";
String b = String.valueOf(new char[] {'a', 'b', 'c'});
//String b = "a" + "b" + "c";
System.out.println(a==b);
System.out.println(a.equalsIgnoreCase(b));
results:
false
truethe value of b is the address of string representation of instance 'new char[]'.
String b = "a" + "b";
System.out.println(a==b);
这个是true
String a = "abc";
String b="ab";
String c=b+"c";
System.out.println(a==c);
这个是false 因为a变量引用的的地址是“abc“,而c引用的地址是b引用的地址,所以a和c不相同我提个问题
String a=new String("abc");
String b="abc";
System.out.print(a==b);
true 还是false
因为String 是一个类
类与类的比较是比较它们的内存地址,a 和c分别存在两个不同的地方
结果也不会是一样的
String str2="AAAA";
这种做法虽然变量名变来变去,但内存中对象仍只有一个,这种方法可以有效地节省内存空间和提高运行效率。String str1=new String("AAAA");
String str2=new String("AAAA");
这个了就是生成两个不同的对象
所以if(str1==str2){} 的结果应该是 false
string _base = "ab";
string _ext1 = "c";
string _ext2 = "other";
string comp1 = _base + "c";
string comp2 = _base + _ext1;
string comp3 = _base + _ext2;
_base += _ext1;sysout(comp1 == comp2);
sysout(comp1 == comp3);
sysout(comp1 == _base);
[code]
String b = "a" + "b";
System.out.println(a==b);
这个是true
String a = "abc";
String b="ab";
String c=b+"c";
System.out.println(a==c);
这个是false,如果说c引用地址是b引用的地址的话,那么System.out.println(b==c);应该是什么结果呢
我觉的c不是引用的b的地址。而是当一个对象+字符生成对象的时候会另建地址的
public static void main(String[] args) {
String a="ab";
String b="a"+"b";
String f=b;
System.out.println("a==b is "+(a==b));
System.out.println("a==f is "+(a==f));
String c="abc";
String d="ab";
String e=d+"c";
System.out.println("c==d is "+(c==d));
System.out.println("c.equals(e) is "+(c.equals(e)));
}}
结果:
a==b is true
a==f is true
c==d is false
c.equals(e) is true
结论:
在JAVA中,进行字符串比较,还是用equals()保险。
beyond !
不过,刚才在机器上试了一下,竟然两个结果都是true,有点不理解了。
为什么结果会与jdk的版本有关,真是搞不懂了