当前位置: 首页 > 面试题库 >

在此示例中对比较字符串感到困惑

太叔富
2023-03-14
问题内容

我知道“ ==”比较引用,并且Java字符串是不可变的,并且使用字符串池缓存,但是在这个示例上我仍然感到困惑:

 final String fName = "James";
        String lName = "Gosling";
        String name1 = fName + lName;
        String name2 = fName + "Gosling";
        String name3 = "James" + "Gosling";
       System.out.println(name1 == name2);  // 1
        System.out.println(name2 == name3);

这给了我结果:

false
true

我仍然很困惑为什么System.out.println(name1 == name2); 给我一个错误,因为我知道两个值都应该缓存在字符串池中?


问题答案:

因为fName是final并使用文字字符串初始化,所以它是一个常量表达式

所以指令

String name2 = fName + "Gosling"

编译为

String name2 = "James" + "Gosling"

编译成

String name2 = "JamesGosling"

因此,在字节码中,您具有

String name2 = "JamesGosling";
String name3 = "JamesGosling";

因此,name2和name3都引用相同的文字字符串,该字符串是被嵌入的。

另一方面,lName它不是最终值,因此不是常量表达式,并且串联发生在运行时而不是编译时。因此,串联将创建一个新的非中断String。



 类似资料:
  • 按照我在C语言中的理解,char *x等于字符串x中第一个字符的地址。在下面的代码示例中,当我在调试器中运行程序时,l和m的值总是相同的地址,并且条件语句为真: 我不明白为什么这两个变量总是有相同的值(地址)

  • 我有这段代码,其中这个内联变量

  • 问题内容: 我在PHP中工作。我想在登录后将页面重定向到我要访问的最后一个页面,但是我仍在5小时内堆放在这里,但我仍然没有做到。这是架构,我有3个php文件。 我正在使用Cookie进行重定向。首先,我去了newest.php,然后我单击了按钮(转到thread.php)。然后thread.php看到您尚未登录,然后重定向到signin.php。在我填写登录表单之后,我单击了提交按钮(signin

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 我正在尝试提出一种解决方案,它涉及在连接操作之后应用一些逻辑,从多个中的中选择一个事件。这类似于reduce函数,但它只返回1个元素,而不是递增地返回。因此最终结果将是单个(,对,而不是一个 每个键保证只到达一次。 假设像上面这样的连接操作,它用4个生成了1个,成功地连接并收集在。现在,我想做的是,立即访问这些值,并执行一些逻辑以将正确匹配到一个。例如,对于上面的数据集,我需要(,和)。 将为每个

  • 所以我一直在读Kafka的语义学,我对它的工作原理有点困惑。 我理解生产者如何避免发送重复的消息(以防代理的ack失败),但我不明白的是,在消费者处理消息但在提交偏移量之前崩溃的情况下,一次是如何工作的。Kafka不会在这种情况下重试吗?