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

Java如何处理内存中的String对象?

龚征
2023-03-14
问题内容

有人问我这个问题:

String s = "abc"; // creates one String object and one
          // reference variable
In this simple case, "abc" will go in the pool and s will refer to it.
String s = new String("abc"); // creates two objects,
                 // and one reference variable*

根据以上详细信息,在以下代码的println语句之前创建了多少String对象和多少参考变量?

String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);

我的回答是,此代码片段的结果是spring winter spring summer

有两个参考变量s1和s2。总共创建了八个String对象,如下所示:“ spring”,“ summer”(丢失),“ spring summer”,“
fall”(丢失),“ spring fall”(丢失),“ spring summer spring”(丢失)
),“冬天”(丢失),“春天冬天”(此时“春天”丢失)。

在此过程中,八个String对象中只有两个不会丢失。

这是正确的吗?


问题答案:

答案是:2个引用和8个对象。

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already)

String s2 = s1 + "summer "; //Two references and 3 objects

s1.concat("fall "); //Two references and 5 objects

s2.concat(s1); //Two references and 6 objects

s1 += "winter "; //Two references and 8 objects

System.out.println(s1 + " " + s2);

现在的问题是: Java如何处理内存中的String对象?

Java提供了两种创建类对象的方法String

  1. 字符串str1 =“ OneString”;

在这种情况下,JVM搜索字符串池以查看是否已经存在等效字符串。如果是,则返回相同的引用。如果不是,则将其添加到字符串池并返回引用。
因此,可能会创建一个新对象,也可能不会。

  1. 字符串str1 = new String(“ OneString”);

现在,JVM必须在堆上创建一个对象。由于 OneString字符串池中是否已存在都没关系。

您还可以将字符串放入池中:

您可以在String对象上调用intern()。如果尚未将String对象放入池中,则将其放入池中,并将对池字符串的引用返回。(如果它已经在池中,则只返回对该对象的引用)。

您可能希望查看以下链接:

什么是Java字符串池?“ s”与新的String(“
s”)有何不同?

有关Java的字符串池的问题



 类似资料:
  • 我正在尝试重新实现malloc,我需要理解对齐的目的。据我所知,如果内存对齐,代码将执行得更快,因为处理器不必采取额外步骤来恢复被剪切的内存位。我想我理解64位处理器读取64位逐64位内存。现在,让我们想象一下,我有一个有序的结构(没有填充):一个char、一个short、一个char和一个int。为什么short会错位?我们有区块中的所有数据!为什么地址必须是2的倍数。整数和其他类型的问题是一样

  • 我有一段代码,其中创建了一个PiggyBank对象。根据选择,有三个if语句。由于关键字new在堆中分配对象,我应该如何正确管理内存垃圾,因此当创建不同类型的构造函数时,旧的存钱罐将消失,如下代码所示:

  • 我想处理两个不同的客户。一种是发送字符串数据包的简单tcp客户端。另一个是http客户端,它发送httprequest消息。我是Netty的初学者,我不知道管道中的处理程序是如何流动的。 这是我的服务器编码: 这是我的服务器初始值设定项: 这是我处理httprequest和string的处理程序。但我的处理程序从不处理httprequest数据包。

  • null null 为了进行简单的开发,我使用在独立集群模式下(8个工作者、20个内核、45.3G内存)执行了我的Python代码。现在我想为性能调优设置执行器内存或驱动程序内存。 在Spark文档中,执行器内存的定义是 每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512M、2G)。

  • 本文向大家介绍如何在Java中创建String对象?,包括了如何在Java中创建String对象?的使用技巧和注意事项,需要的朋友参考一下 您可以通过以下方式创建字符串: 将包装在“”中的字符串值分配给String类型变量。 通过将字符串值作为其构造函数的参数传递,使用new关键字创建String类的对象。 将字符数组传递给String构造函数。

  • 问题内容: 如何从Java处理内存?我知道Java在它自己的JVM中运行,因此它不能直接访问进程内存。 我听说过JNA,可用于获取操作系统和Java代码之间的接口。 假设我要操纵纸牌得分。尝试将是这样的: 得到纸牌的过程 获得对单人纸牌的记忆 找出分数存储在存储器中的位置 在地址中写下我的新值 Java本身无法访问该内存,那么如何使用JNA做到这一点? 问题答案: 您需要使用JNA库。下载两个Ja