日期:2014-05-20  浏览次数:20681 次

有关java字符比较

public static void main(String[] args) {
String str1 = new String("hello");
String str2 = "hello";
if (str1 == str2) {
System.out.println("123");
}
if (str1.equals(str2)) {
System.out.println("234");
}
}

为什么只打印出234,而不是123呢!话说==和equals到底有什么不同,我网上查了一下,说的全部是一模一样的,全都是站粘贴复制过来的答案,说的很是不明白,也没说java代码中是如何进行比较的,求大神指导一下,不胜感激!
java string

------解决方案--------------------
==比较的是内存地址值,
equals比较的是字符串的值
至于为什么这样,建议看一下老紫竹的博客,就是咱们java版的大版主。
http://blog.csdn.net/java2000_net
里面又一遍专门介绍这个的
------解决方案--------------------
== 判断两个引用是否指向同一个实例
equals 判断两个引用指向的实例内容是否相同。
------解决方案--------------------
String的equals方法重写了Object中的equals方法,在String中的equals的方法比较的是其中的值,而==比较的是对象内存中的地址,String str1 = new String("hello");  String str2 = "hello";
(str1 == str2比较的是Str1和str2的地址,明显这两个不是同一个地址
------解决方案--------------------
== 比较的是两个对象的内存地址,比如你的str1的内存地址是0x00000000,str2的内存地址是0x00000001.那这两个值是不同的,所以返回false。
但是equals是比较两个string的值是否相同。所以你的代码里是true
------解决方案--------------------
引用:
Quote: 引用:

==比较的是内存地址值,
equals比较的是字符串的值
至于为什么这样,建议看一下老紫竹的博客,就是咱们java版的大版主。
http://blog.csdn.net/java2000_net
里面又一遍专门介绍这个的

这两个内存地址有什么不同?如果使用了new的是在内存中开辟出一块地方给他,那么未进行new的则存储在哪里呢?这一点不是很明白啊!引用变量存储在堆中,只想栈中的对象,我认为两个是一样的啊!
不带new的是在字符串池中创建,然后把引用赋给str,带new的是直接在内存中创建对象
------解决方案--------------------
String str1 = new String("hello");
        String str2 = "hello";
        if (str1 == str2) {
            System.out.println("123");
        }
        if (str1.equals(str2)) {
            System.out.println("234");
        }
通过new出来的对象,存放在堆内。所以str1在堆内,是堆中数据的引用。String str2 = "hello",这种形式是把str2存放在栈内了。str2代表的是一个栈中的数据的引用而已。

jdk说明,==比较的是:两个引用是否指向了同一个对象。显然str1和str2指向的不是一个引用。equals比较的是字符串的值。虽然引用不一样,但是值一样。
------解决方案--------------------
对应的安装目录下都有src.zip的,可以关联下就能看源码了。

看java官方说明。