问一个java的问题

来源:百度知道 编辑:UC知道 时间:2024/05/18 06:09:35
import java.util.*;
class StringTest{
public String hello ="Hello";
public String hel ="Hel";
public String lo ="lo";
}
class MyTest{
public MyTest(){}
public static void main(String[] args){
StringTest st = new StringTest();
String str1 ="Hello";
String str2 ="Hel";
String str3 ="lo";
String str4 ="Hel"+"lo";
String str5 =str2+str3;
String str6 =st.hel+st.lo;

(1)System.out.println(str1==str4);
(2)System.out.println(str1==str5);
(3)System.out.println(str1==st.hello);
(3)System.out.println(str1==str6);
}
}
(1)和(2)为什么不一样呢? (3)和(4)为什么不一样?
我知道==是比较地址 我想知道为什么(1)和(2),(3)和(4)的结果不一样 忘了说了输出的结果是true false true false

String str1 ="Hello"; //在字符串缓冲区中创建个常量"hello"。
String str4 ="Hel"+"lo"; //字符串是常量;它们的值在创建之后不能改变。但是可以共享。str4 指向字符串缓冲区中的"hello"。
String str5 =str2+str3; //相当于new("Hello")、相当于new("Hel"+"lo"),此时"hello"对象分配在堆内存而不是字符串缓冲区中的"hello"。
下班了不说。看看api自己理解吧。

lz的意思是,这段代码的执行结果是:
true
false
true
false
这是为什么,对吧?

这里的关键是str1,它是一个直接被赋了字符串值的变量
(1)当str1和也是被直接赋了字符串值的str4比较时,应该是内容比较,所以是true
(2)str5 =str2+str3,后台应该把这个语句解释为了str5 =new Stirng("Hel")+new Stirng("lo"),既然作为对象new了,那肯定是引用比较,所以肯定是false
(3)这个是我最费解的,只能解释为没有操作的情况下,st.hello不是一个引用,而只是一个值……
(4)同2

判断字符串是否相等 要用 equals方法
你用的==只能判断他们的内存地址是否相同 内存地址不同 就返回false

简单说来 '=='在你的程序里比较的是 4个字符串的地址。
如果要比较内容要用
str1.equals(str4)

你判断的是字符串的相等与否,应该是用equals方法。
一定要注意基础知识的掌握