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

池何时更改?

孔俊友
2023-03-14
问题内容

我有两个问题:

public static void main(String[] args) {
  String s1 = "bla";
  String s2 = "b" +"l" + "a";
  String s3 = "b".concat("l").concat("a");

  if(s1 == s2) 
        System.out.println("Equal");
  else
        System.out.println("Not equal");
  if(s1 == s3) 
        System.out.println("Equal");
  else
        System.out.println("Not equal");
}
  • 为什么s1s2指向相同的对象,而s1s3不是?( 没有使用new关键字)。

  • 如果我从用户那里得到一个字符串并添加到上面的代码中,则这些行:

        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    String name=in.readLine();
    if(name.equals("test"))
        s1 = s1 + "xyz";

如果用户输入xyz程序将打印Notequal,当用户输入其他内容时程序将输出Equal。这是否意味着在整个程序执行过程中池会发生变化?优化程序在编译时是否可以
继续工作runtime


问题答案:

为什么s1和s2指向同一个对象,而s1和s3没有指向同一个对象?(没有使用new关键字)。

因为串联发生在编译时,所以完成的字符串因此与第一个示例相同地进入常量池。这是编译器“已知”的特例。这的确意味着,以这种方式在多行中连接的长字符串仍将获得与简单字符串常量相同的性能改进。

在第二个示例中,您将在运行时执行计算,因此它不会成为常量池的一部分。

但是请注意,在JLS中,字符串常量池中可以做什么和不能做什么的细节都是故意含糊的,因此不同的实现可能以不同的方式进行优化。它规定了一定的规则,以什么
在那里去,但不要依赖此行为是在不同的实现是一致的。



 类似资料:
  • 问题内容: 当设备的电池电量不足时,我想关闭我的应用程序。我在清单中添加了以下代码。 并在接收器中遵循以下代码 我正在模拟器上运行该应用程序,并使用telnet更改了电池电量。它会更改电池电量,但不会显示任何吐司或记录。 我想念什么?任何帮助表示赞赏!谢谢。 问题答案: 在代码中而不是在文件中注册您的接收器。 或使用接收器收听电池电量。

  • 我试图找到一个解决方案,如何将存储在数据库中的日期时间转换为yyyyy-mm-dd HH-mm-ss,并给它时区美国/Los_Angeles。 如果我更改时区,Carbon将自动从时间中减去7小时,这就是将时间从UTC更改为PST时发生的情况,但我的DB中的时间设置为PST时间。例如,我希望时间是今天上午10点,但如果我改变时区,碳将转换为今天凌晨3点。 如果时区改为PST,但仍然保持上午10点的

  • 问题内容: 我正在尝试检查文本字段何时更改,也等同于用于textView的功能- 到目前为止,我已经做到了: 哪种方法有效,但是只要在按下文本字段时就启用,我希望仅在实际键入文本时才启用它? 问题答案: 迅速 斯威夫特4.2 和 SWIFT 3和Swift 4.1 和 SWIFT 2.2 和 目标C 和textFieldDidChange方法是

  • 问题内容: 如何更改嵌入式Jetty 9中的线程池大小?为此,我们需要任何特定的组件吗? 问题答案: 从文档: 服务器实例提供了一个ThreadPool实例,该实例是其他Jetty服务器组件使用的默认执行器服务。线程池的主要配置是最大和最小大小,并在etc / jetty.xml中设置。 要么

  • 问题内容: 我正在与Artemis作为新的JMS提供程序一起提供的WildFly 10.1一起工作,但是我无法找到如何动态更改特定MDB的使用者线程数的方法。 我有一个队列,还有一个使用队列中消息的消息侦听器(MDB),现在我想动态控制域必须启动的使用者线程的最大数量。 如何使用CLI做到这一点? 问题答案: 要动态更新池属性,可以看一下这篇文章,该文章描述了如何使用jboss- cli或stan