0 0

string两个引用相等判断true/false原因求解5

(1)String s1 = "a" +"b";
String s2 = "ab"; 
System.out.println(s1 == s2);

(2)String s = "a";
String s1 = s +"b";
String s2 = "ab"; 
System.out.println(s1 == s2);
结果
(1)true
(2)false
我不知道原因啊,为什么会是这样的结果呢,求解?

 

2014年9月24日 14:41

7个答案 按时间排序 按投票排序

0 0

采纳的答案

这个帖子有人回答了,JVM编译时等都OK了,我再复制一份我在另一个帖子的说法吧!我也希望@静夜独窗 不要在问题贴里面发这些内容了,因为这样会影响大家正常的交流,这些问题如果从点上去较真,本身就输了。


关于这个问题并不是本书的重点,我们只是通过这个小话题展开一些探讨和思考,逐步理解更多的东西。


关于@williamhoward 提到的问题,我说下,hashCode一样不代表值一样,样章当中也有提到,简单说呢String的hashCode并不是和它的地址或标志位相关的,而是与它存储的字符有关系,因为String已经重写了原始的hashCode方法,原始的hashCode值是对象头部部分二进制位的数字信息,可以在一定程度上标志对象,但不是地址,重写后的hashCode具体由用户决定,这也在Hash相关的算法中,如hashMap、HashSet、ConcurrentHashMap里面有用到,这几个对象里面用它的方式也差不多,尤其是HashSet就是对HashMap的包装,呵呵,你自己写一个算法要用它也行,细节不多说了,或许可以看下样章,里面有一些解释,呵呵!


@静夜独窗 这个问题的关键是Hotsport VM编译时的合并,然后在字节码文件中就已经是一个常量了,到真正运行时,自然string_table中是同一块空间,引用不论来自那里,保存的地址都是同一个。另外,这些内容在JDK 1.6及以下的版本是在所谓的永久代的常量池中,但是JDK 1.7以上的版本就不是了,是在堆当中,在一些字符串的处理上会有所区别,有些结果也会发生改变(书的光盘中有一个testForJDK17的代码,如果运行在1.7的环境可以试下),所以为结果较真没多大用途,它也在不断变化,这个话题只是一个小引导,我希望你学会一种不断去了解问题内在的习惯,有些东西需要迭代去思考和探讨就不断清晰了,如果一味为这个结果来扣的话,可能会扣得走火入魔,呵呵!这没多大必要,因为你我都不是虚拟机的编写者,有太多的细节,有太多的版本,有太多的改变了。


2014年9月26日 00:17
0 0

看一下楼主发的另一篇提问,就知道这是个书托。

饭有饭托,书有书托啊

2014年9月26日 08:35
0 0

我是这么理解的,+号表示连接符,在正则中你可以看到a+b正则匹配的字符串是ab,因此String s1 = "a" +"b"; String s2 = "ab";   
s1 == s2
等价于"a" + "b" = "ab"
由于+表示连接字符串,等价于"ab" = "ab"
但是S是变量,变量+字符串"b"不等于"ab"
好像JS中也是这样的,具体不清楚,可以试试~
另外,如果改成这样就可以等价了String s1 = (s +"b").intern();
想过为什么吗?再深层次的我也不懂了~呵呵,浮于表面

2014年9月26日 08:32
0 0

比较讨厌的就是这类人,打着技术的幌子,行推销的勾当.

此类帖子,如果你不是真的有疑问或者想热心帮人解答,而是故弄玄虚的广告贴,只能更让人厌烦,书有多烂不知道,但是此类的推销会让人对书的评估减分,这点是无益的.

很多技术类的论坛,基本全是被这些广告贴搞跨的,这样的例子比比皆是.

2014年9月25日 09:38
0 0

推广特种兵真是无所不用其极啊哈哈。。。。。。

2014年9月24日 16:06
0 0

首先 == 比较的是地址
s1 = "a" +"b"; 
在java编译前,他就会变成s1="ab";
这时jvm的预加载处理,它会帮你提交处理好一些简单的程序
所以,s1和s2是相等的

(2)String s = "a"; 
String s1 = s +"b"; 
String s2 = "ab";  
System.out.println(s1 == s2);
这个是因为,s是个变量,jvm不知道s的值到底是多少,所以不会在编译前有结果
在编译的时候对s2重新赋值,导致结果不一致

2014年9月24日 15:40
0 0

答案主要是jvm的编译对静态常量的处理

学一下javap的使用把

2014年9月24日 15:08

相关推荐

    大学计算机VB程序设计考试题目.doc

    如果判别式大于零,则显示方程有两个不相等实根;如果判别式等于零,则显示方程有两个相等实根。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click...

    JAVA实现求1到1万之间所有回文数

    3. 初始化两个指针,一个指向字符串的开头,另一个指向末尾。例如,`int start = 0`和`int end = str.length() - 1`。 4. 使用循环,当`start`小于`end`时,不断比较`str.charAt(start)`和`str.charAt(end)`是否相等...

    LINGO软件的学习

    #eq#是逻辑运算符,用来判断是否“相等”,可参考§4. &1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有成员;&2可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,……,...

    蓝桥杯练习系统算法训练习题加答案java版本.pdf

    k好数问题要求判断一个数N的k进制表示中,任意相邻的两位数字都不相等的性质。动态规划算法能够将问题分解为更小的子问题,并在解决子问题的过程中构建一个解的结构。通过对子问题的求解,最终求得原问题的解。Java...

    2021-2022计算机二级等级考试试题及答案No.12544.docx

    冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。在最坏的情况下,...

    中兴 IT 笔试题

    - **解答**:在Java中,`equals()`方法用于比较两个对象的内容是否相等。默认情况下,`Object`类中的`equals()`方法比较的是对象的引用是否相同。`File`类重写了`equals()`方法,使其比较两个`File`对象所代表的...

    JAVA经典算法50题

    为了求解这个问题,我们可以使用递归或循环的方式。 **代码实现**(递归方式): ```java public class Fibonacci { public static void main(String[] args) { for (int i = 1; i ; i++) { System.out.println...

    数据结构经典算法大全

    八皇后问题是将八个皇后放置在一个8×8的棋盘上,要求任何两个皇后都不能处于同一行、同一列或相同的对角线上。 **解法:** 八皇后问题通常通过递归回溯算法来解决。从棋盘的第一行开始,尝试放置皇后,然后递归地...

    中兴笔试题专辑(含答案)

    - **解答**:`equals()`方法用于判断两个对象的内容是否相等,而不是判断引用是否指向同一个对象。`==`操作符用于判断两个引用是否指向同一个对象。`File`类重写了`equals()`方法,使其能够比较两个不同对象的内容...

    java 面试的常见算法题

    根据给定文件中的内容,我们可以总结出以下几个与Java面试相关的算法知识点: ### 1. 输出九九乘法表 在Java面试中,考察基础的循环结构是非常常见的,例如输出九九乘法表就是一个典型的问题。 #### 代码示例 ```...

    Java基础英语单词表.pdf

    21. **boolean** - 布尔类型,只有两个值:`true` 和 `false`。 22. **true** 和 **false** - 逻辑真和逻辑假,用于逻辑判断。 23. **else** - 与`if`语句配合使用,表示当条件不满足时执行的代码。 24. **case**...

    数论模板精心整编

    扩展欧几里得算法不仅可以求出两个整数的最大公约数,还可以找到满足 \(ax + by = gcd(a, b)\) 的一组 \(x\) 和 \(y\) 的值。这对于解决线性同余方程等问题非常有用。其实现代码如下: ```c++ void ex_gcd(int a, ...

    第六届全国信息技术应用水平大赛复赛试题

    // 函数用于判断一个数是否为素数 bool isPrime(int n) { if (n ) return false; for (int i = 2; i * i ; i++) { if (n % i == 0) return false; } return true; } int main() { int maxLen = 0; int start...

    基础编程机试复习

    - **亲密数**:两个数的因子之和(除自身外)正好是对方的数。 - **众数**:一组数据中出现频率最高的数值。 - **中位数**:将一组数据从小到大排列后处于中间位置的数。 - **较难概念** - **连写数**:未知...

    《Java语言程序设计(一)》课后习题答案(课程编号04747)

    - 遍历两个字符串,寻找最长的相同字符序列。 **4.12 字符串空白符处理** - 删除前后空白符,并合并中间多余的空白符。 **4.13 大整数类的实现** - 实现一个类用于表示和处理大整数。 - 提供基本的算术运算方法...

Global site tag (gtag.js) - Google Analytics