Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用“+”运算符的非字符串操作数后,生成的字符串是否会进入字符串池?_Java_String_Garbage Collection_Stringbuilder - Fatal编程技术网

Java 使用“+”运算符的非字符串操作数后,生成的字符串是否会进入字符串池?

Java 使用“+”运算符的非字符串操作数后,生成的字符串是否会进入字符串池?,java,string,garbage-collection,stringbuilder,Java,String,Garbage Collection,Stringbuilder,我正在学习和准备OCP 1Z0-815,我从这本优秀的准备书中读到: 德什穆克,哈努马特。OCP Oracle认证专业Java SE 11程序员一级考试基础1Z0-815:通过OCP Java 11开发者认证第1部分考试的学习指南1Z0-815 p。99恩图瓦雷。爱迪生·杜金德尔 在这种情况下,JLS第15.8.1节明确指出,编译器可以通过使用StringBuilder避免创建多个字符串。因此,不可能知道将创建多少字符串,以及有多少字符串有资格被垃圾收集 上面的语句…Java语言规范在第15.8

我正在学习和准备OCP 1Z0-815,我从这本优秀的准备书中读到:

德什穆克,哈努马特。OCP Oracle认证专业Java SE 11程序员一级考试基础1Z0-815:通过OCP Java 11开发者认证第1部分考试的学习指南1Z0-815 p。99恩图瓦雷。爱迪生·杜金德尔

在这种情况下,JLS第15.8.1节明确指出,编译器可以通过使用StringBuilder避免创建多个字符串。因此,不可能知道将创建多少字符串,以及有多少字符串有资格被垃圾收集

上面的语句…Java语言规范在第15.8.1节中提到,+运算符的非字符串操作数在运行时转换为字符串,但它没有明确说明该字符串是否进入字符串池。。。驱使我四处搜索,但我没有找到一个解释:因为我没有看到新的,我知道它确实进入了字符串池,所以它不是一个对象。因此,垃圾收集根本不是一件可悲的事。我说错话了吗

换句话说,据我们所知,每个循环都会在堆Java11的字符串池中生成一个常量字符串,而不是Java7。hello0、hello1、hello2等等,并且根本不会有任何候选垃圾收集。我知道垃圾收集会清理新操作符创建的对象,不会对字符串池起作用

根据结论段。。。第15.8.1节明确指出,编译器可以通过使用StringBuilder避免创建多个字符串。因此,不可能知道将创建多少字符串,以及有多少字符串有资格被垃圾收集。。。我假设它是说,在第二个代码示例wihtout循环中,我无法发现在字符串池中创建了多少个字符串,因为StringBuilder在场景后面使用,我们知道StringBuilder在内存中操纵串联,避免创建许多字符串文字。如果是这样的话,我仍然可以在第一段代码中假设每个循环都会产生一个文本字符串hello0,hello1。。。这将进入字符串池,实际上不符合垃圾收集的条件。我错了吗

PS.:您可以评论垃圾收集对字符串池的作用,但我理解,在实际的术语中,字符串池中的文字字符串驻留这么长时间,我们可以认为它在程序结束之前和在

之前是不适合垃圾收集的。 就我看不到新的内容而言,我理解它确实会进入字符串池,所以它不是一个对象

首先,Java语言规范没有特别提到字符串池。它实际上说的是,如果两个字符串值常量表达式相等,那么它们将是同一个对象。这包括字符串文字,但也包括字符串s=a+b等情况

字符串池是>>a 就我看不到新的内容而言,我理解它确实会进入字符串池,所以它不是一个对象

首先,Java语言规范没有特别提到字符串池。它实际上说的是,如果两个字符串值常量表达式相等,那么它们将是同一个对象。这包括字符串文字,但也包括字符串s=a+b等情况


字符串池>>aI真的希望他们停止将这些创建/符合垃圾收集条件的对象放入OCP和研究材料中。他们经常被问到模棱两可的问题,而且他们通常没有一个适用于所有Java实现的正确答案。我在这里谈论它只是为了让你们意识到这个问题。字符串混淆了垃圾收集的主题,因此在解释垃圾收集时使用字符串是个坏主意。你不必再花时间在这个话题上了。顺便说一句,我想了解我问题中提到的要点。正如在同一本书中提到的,…Java 7以后,字符串池中的字符串也可以被垃圾收集,但我有点困惑,特别是当涉及+时,我真的希望他们停止将这些创建/符合垃圾收集条件的对象的数量放入OCP和研究材料中。他们经常被问到模棱两可的问题,而且他们通常没有一个适用于所有Java实现的正确答案。我在这里谈论它只是为了让你们意识到这个问题。字符串混淆了垃圾收集的主题,因此在解释垃圾收集时使用字符串是个坏主意。你不必再花时间在这个话题上了。按t
他说,我正在努力理解我问题中提到的要点。正如在同一本书中提到的,…Java7以后的版本,字符串池中的字符串也可以被垃圾收集,但我有点困惑,特别是当+涉及到精巧的解释时。但是,也许因为我的专业水平不高,我仍然看不到我的主要问题的答案。我完全理解没有中间字符串会进入字符串池。结果呢?我说的是hello0,hello1,。。。你好?我想是的,除非你是说他…4是中间字符串。我很清楚,在循环结束后,它们将保留在弹簧池中,如果值得,可能是另一个问题,因为它们很可能不会再次使用,但它们确实会在字符串池中,对吗?与我的问题没有直接关系,但我相信值得一提的是,这让我非常惊讶:Java语言规范没有特别提到字符串池。嗯,因为字符串池不是第三个实现,例如,它是由Spring团队实现的,并且是Java的一个非常原生的主题,所以它被移动到Java 7中的Heap中,以处理常见的和众所周知的问题,即使是发行版也涉及到它,我想知道为什么它不是Java SE的一部分。也许我理解错了您的评论您的直接问题的直接答案是否。因为JLS要求+始终创建一个新字符串。如果它将结果放入字符串池,那么它并不总是一个新字符串。将字符串放入字符串池的唯一方法是显式调用intern。字符串池不是字符串的单独实现。事实上,在Java 8和更高版本中,它只是一个私有的重复数据消除数据结构,保存对普通字符串的引用。老实说,我不明白你真正的意思是什么……它只是一个私有的重复数据消除数据结构,保存对普通字符串的引用。。。。稍后我将研究术语重复数据消除数据结构。我将避免在此扩展此术语,因为它与我的问题无关,并且可能不需要对我的认证目标进行详细的解释。但是,也许因为我的专业水平不高,我仍然看不到我的主要问题的答案。我完全理解没有中间字符串会进入字符串池。结果呢?我说的是hello0,hello1,。。。你好?我想是的,除非你是说他…4是中间字符串。我很清楚,在循环结束后,它们将保留在弹簧池中,如果值得,可能是另一个问题,因为它们很可能不会再次使用,但它们确实会在字符串池中,对吗?与我的问题没有直接关系,但我相信值得一提的是,这让我非常惊讶:Java语言规范没有特别提到字符串池。嗯,因为字符串池不是第三个实现,例如,它是由Spring团队实现的,并且是Java的一个非常原生的主题,所以它被移动到Java 7中的Heap中,以处理常见的和众所周知的问题,即使是发行版也涉及到它,我想知道为什么它不是Java SE的一部分。也许我理解错了您的评论您的直接问题的直接答案是否。因为JLS要求+始终创建一个新字符串。如果它将结果放入字符串池,那么它并不总是一个新字符串。将字符串放入字符串池的唯一方法是显式调用intern。字符串池不是字符串的单独实现。事实上,在Java 8和更高版本中,它只是一个私有的重复数据消除数据结构,保存对普通字符串的引用。老实说,我不明白你真正的意思是什么……它只是一个私有的重复数据消除数据结构,保存对普通字符串的引用。。。。稍后我将研究术语重复数据消除数据结构。我将避免在这里延长这一期限,因为这与我的问题无关,而且可能对我的认证目标没有必要
String str = "hello";
for( int i = 0; i < 5; i + +) {
    str = str + i;
} 
String s = "hello";
int k = 100;
s = s + " 123" + k;
String a1 = new String("a");
System.out.println("a" == a1);   // prints "false"
   String str = "hello";
   for (int i = 0; i < 5; i++) {
       str = str + i;
   }