JavaRush /Java 博客 /Random-ZH /喝咖啡休息#93。String 类在 Java 中的工作原理。了解如何用 Java 实现 Web 界面

喝咖啡休息#93。String 类在 Java 中的工作原理。了解如何用 Java 实现 Web 界面

已在 Random-ZH 群组中发布

Java 中 String 类的工作原理

来源:DZone 我最近在论坛上遇到了以下问题:“这里创建了多少个String对象?一个或两个?”。
String langName = new String("Java");
我很好奇其他人如何回答这个问题,因为我知道这是一个复杂的问题,特别是如果一个人不太了解 String在 Java 中如何工作的话。于是,我就一头扎进了评论区。 喝咖啡休息#93。 String 类在 Java 中的工作原理。 了解如何用 Java 实现 Web 界面 - 1令我惊讶的是,评论者中有选择“一”作为正确答案的人,但更多人选择了“二”。有那么一瞬间,我什至开始怀疑自己对String 的了解。正确的答案是,这一切都取决于具体情况。问题不够明确,有争论的余地。我会这样重新表述:

1.执行该语句时,内存中创建了多少个Java String对象?

只有一个答案。

执行此语句后,内存中将剩余多少个 Java String 对象?

答案是两个。希望当我使用上面示例中的语句检查程序的内存转储时,不确定性就消失了。 喝咖啡休息#93。 String 类在 Java 中的工作原理。 了解如何用 Java 实现 Web 界面 - 2上图中的程序内存转储显示存在两个具有相同内容的String对象。这证明调用String类构造函数并传递字符串文字作为参数会导致两个对象被添加到内存堆中:一个位于常规(非池)内存中,另一个位于字符串常量池 (SCP) 中,内存中的区域也是堆的一部分。添加后就开始出现困难。调用构造函数总是会导致新对象被放置在非池区域中。但构造函数参数是一个字符串文字,也是一个对象,它是在类加载期间创建并存储在 SCP 中的,前提是字符串池不包含相同内容的字符串。Java语言规范指出“字符串文字——或者更一般地说,作为常量表达式值的字符串(第 15.28 节)——被“实习”以使用 String 方法 . intern共享唯一实例。” 由于 Java 中的字符串是文字,因此表示常量表达式的值,因此它被池化。为了使这一点更加明显,让我们将文章开头提供的代码重写如下:
String java = "Java";
String langName = new String(java);
现在让我们回到主要问题。下面的语句会创建一个还是两个String对象:
String langName = new String("Java");
为了回答这个问题并消除任何怀疑,让我们看一下 main 方法的字节码:
public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    NEW java/lang/String
    DUP
    LDC "Java"
    INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
    ASTORE 1

   L1
    LINENUMBER 14 L1
   FRAME APPEND [java/lang/String]
    GOTO L1

   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
    MAXSTACK = 3
    MAXLOCALS = 2
在第 6 行,您可以看到 LDC(负载常数)命令。它将字符串常量池中的元素加载到堆栈上。这意味着在调用构造函数时,Java 文字(也是一个对象)已经被添加到池中。这是在加载类时发生的。因此,使用字符串文字调用String类构造函数只会创建一个对象并将其放置在非池化内存位置中。

了解如何用 Java 实现 Web 界面

来源:Dev.to JavaScript 世界提供了有用且有趣的 Web 框架,这是毫无疑问的。对于 Java 开发人员来说,有一个有趣的替代方案 -开源Vaadin框架。有了它,您可以仅使用 Java 编程语言而不使用其他语言轻松实现Web图形用户界面(GUI)。您无需编写一行 HTML 或 JavaScript。一张图片胜过千言万语: 喝咖啡休息#93。 String 类在 Java 中的工作原理。 了解如何用 Java 实现 Web 界面 - 3

瓦丁是如何工作的?

在屏幕截图的左侧,您可以看到一个 Java 类。此代码在 Apache Tomcat、Eclipse Jetty 或任何其他 servlet 容器等服务器上运行。您可以使用平台提供的 API 来创建用户界面 (UI)组件,例如文本字段、组合框、数据网格、日期选择器、上传字段等。您可以组合这些组件来创建视图(也称为页面或 UI),使用布局垂直、水平或使用 CSS 的任何其他方式排列用户界面 (UI) 组件。在前面的示例中,我们通过将TextFieldButton添加到VerticalLayout来创建它们。视图准备就绪后,您可以使用@Route注释通过 URL 打开它。在此示例中,我们使用@Route("hello")在 http://localhost:8080/hello 上提供它。Vaadin 应用程序是 Java 中的 Web 应用程序。该框架提供了一个 Servlet 实现 ( VaadinServlet ) 来为您处理 HTTP 请求和响应。该 Servlet 扫描标有@Route注释的 Java 类,以在浏览器中显示正确的视图。当首次请求 Vaadin 应用程序时,Vaadin 会使用充当客户端引擎的轻量级 JavaScript 文件进行响应。该引擎负责处理浏览器中的事件并将它们作为 JSON 消息发送到服务器。VaadinServlet对象处理请求并类似地将 JSON 响应返回给客户端引擎。然后,引擎使用此消息来更新页面上需要更新的元素(如果有)。Vaadin 使用 HTTP 会话来存储包含用户界面状态的组件树。诸如组件之类的东西形成了表示及其状态(启用/禁用、标题、值等)。这一切都提供了值得一提的安全级别。由于用户界面逻辑位于服务器上,因此攻击者无法访问。检查是在服务器上执行的。例如,如果使用setEnabled(false)禁用按钮,那么这不仅仅是浏览器中的装饰功能 - 服务器不会在添加到禁用按钮的单击侦听器中运行任何逻辑,从而防止攻击者利用浏览器中的开发人员工具更改启用状态或调用VaadinServlet来模拟鼠标单击(单击事件)。

Vaadin 可以免费使用吗?

是的。Vaadin 是一个在 Apache License 2.0 下发布的开源框架。您无需购买任何东西即可使用它创建成熟的 Web 应用程序。有一些商业组件可以提高性能,但它们不是必需的。例如,有一个可视化设计器和一个 CRUD 组件可以帮助您更快地创建视图。您可以在订阅之前免费试用这些组件。

Vaadin 是 JSP 和 JSF 的替代品吗?

是的。它可以用作 JSP、JSF 甚至 Angular 等 JavaScript 框架的替代品。许多 Vaadin 客户已成功从这些技术迁移到 Vaadin。

Vaadin 支持 Spring 和 Jakarta EE 吗?

是的。Vaadin 已与 Spring 和 Jakarta EE(以前称为 Java EE)正式集成。使用 Spring Initializr 创建新的 Spring Boot 项目时,您可以添加 Vaadin 作为依赖项。对于 Jakarta EE,您可以下载使用 Jakarta EE 的简单 Hello, World 示例。在撰写本文时,仅支持 Jakarta EE 版本 8。

谁使用 Vaadin?

许多财富 500 强公司以及成功的初创公司和全球超过 20 万名开发人员都在使用 Vaadin。查看快速入门指南和其他Vaadin 文档。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION