public class How{
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(a==b); }
}结果是true,但是我加了一个"",结果就变成false了,求高手解释public class How{
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(""+a==b); }
}
(结果是false)
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(a==b); }
}结果是true,但是我加了一个"",结果就变成false了,求高手解释public class How{
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(""+a==b); }
}
(结果是false)
解决方案 »
- jax-ws发布WS,用axis的wsdl2java生成的客户端调用有问题
- netbean向导创建的桌面应用程序怎么重写paint,怎么调用repaint
- 一个简单问题,却引来群里大讨论。
- 谁提供一个完整的J2SE→J2EE→J2ME的流程
- 新手问两个问题,急!
- 如何重命名本地系统文件(重命名 目录和文件分方法吗?) 求方法名
- !!!使用EXE4J生成JAVA可执行文件,总是报错,明天就交论文了.!!!
- 请问JAVA有没有中文的帮助文档?
- 学习java的迷惑...望各位大侠指点迷经
- 一个SOCKET服务器端接受问题
- NetBean GUI设计两个问题:layout&source file
- Class<? extends Enum> 这是什么意思,为什么用问号
但是,""+a 这个表达式却一定要建立一个新的字符串,因为java里面字符串的拼接是重新分配一个新的地址空间,然后再依次复制当前要拼接的两个字符串,虽然前面的""依然的依然是一个空的,但毫无疑问,新的地址空间仍然要建立,最后生成的字符串地址就跟b 不一样了,所以是false.至于为什么 新生成的字符串与b内容一样,为何不也优化处理,我就不知道原因了.
以上属于个人见解,还是等高手回答.
相当于 System.out.println((""+a)==b);
这是运算符的优先级问题。没有啥好解释滴!
String a = "JAVA";创建一个a字符串对象值为“JAVA”
在遇到String b = "JAVA";时发同现b的值和a一样,java就让b引用a对象,
所以a==b 为 true(同一对象)
“”+a!=b:
对与java来说字符相加(“”+a)就是新创建对象,所以“”+a!=b
优先级 运算符 结合性
1 () [] . 从左到右
2 ! +(正) -(负) ~ ++ -- 从右向左
3 * / % 从左向右
4 +(加) -(减) 从左向右
5 << >> >>> 从左向右
6 < <= > >= instanceof 从左向右
7 == != 从左向右
8 &(按位与) 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>=
说明:
1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
楼主的想法就是这样的,值比较
public static void main(String[] args){
String a = "JAVA";
String b = "JAVA";
System.out.println(""+a.equals(b)); }String是final 类型的类 对String来说 ==是引用的对象的内存地址比较, 初始化A B 以后,都是引用的是“JAVA”这个对象的地址引用
一旦“”+a后,会JVM会重新为给“”+a指向一个内存地址,保存当前对象的引用和值,对象引用的内容发生了变化,
这个,我想了一下,不知道对不对,你参考一下,,b是字符串"java"的引用,这个不变。但是""和"java"拼接以后,会有一个新的地址来存储这个新的字符串,这个时候虽然内容与b引用的字符串是一样的,但是注意,这个时候java已经没有办法优化了,因为这个过程已经不是编译过程了,而是在代码的执行过程,是不会进行相同内容字符串地址的优化的,换一句话,编译器是不知道""+"java"和b指向的字符串是相同的,它默认的认为两个是不一样的。