java字符串问题 求大神详细解答

java字符串问题  求大神详细解答

问题描述:

String s1="a";
s1+="b";
System.out.println(s1=="ab");//结果为false

        这个是什么原因?

==比较的是对象地址,你的s1和“ab”是两个不同的对象,虽然对象的值一样,但是地址不同,s1.equals("ab")才会比较值返回true

java字符串比较用equals

equals 是比较的两个字符串的值是否一样
比如 “ab”.equals(“ab”)==true;
"==" 它比较的是两个引用地址
比如:
String a=new String ("a");
String b=new String ("a");
System.out.println(a==b)它就输出false了
因为它们的引用地址不同(虽然都指向a,但是是两个箭头指向a);

一般的来说
基本数据类型比较用 ==就可以了
引用数据类型比较 大多用equals

“==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】

【特别注意】Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

"=="比"equal"运行速度快,因为"=="只是比较引用.

一个在堆,一个在常量池

使用equals来比较吧,毕竟一个是在堆中,一个是常量

equals 是比较的两个字符串的值是否一样
比如 “ab”.equals(“ab”)==true;
"==" 它比较的是两个引用地址
比如:
String a=new String ("a");
String b=new String ("a");
System.out.println(a==b)它就输出false了
因为它们的引用地址不同(虽然都指向a,但是是两个箭头指向a);

一般的来说
基本数据类型比较用 ==就可以了
引用数据类型比较 大多用equals

用equals()方法吧

知道啥是面向对象不?知道啥是封装继承多态不?如果不知道就按其他人的理解……如果知道…那么恭喜你你可以看看object和string的源码了…你得知道引用和实例的区别…String a=new String(“b")对于这行代码…等号左边是引用在内存中的值是一个十六进制的字符串表示一个地址…等号右边是个实例对象在内存的某个地址中放着…这里是在a的值所指向的地址。
而Java中==就是判断运算符两边的引用的值是不是指向同一个地方,不是当然返回false,你可以看看object的源码,里面的equals方法就是这样写的,而String的equals方法实现却不同,他先比较地址,再比较值,如果都不相同,才返回false。