在深入了解字符串类之前,我们首先了解JVM如何处理新字符串。当您知道字符串的初始化详细信息时,您可以写或等待或等待代码。
首先,您必须了解字符串常量池的概念,让我们输入以下文本。
将经常使用的数据留在特定内存中,避免频繁的数据创建和破坏,实现数据共享并改善系统性能。
除了八种基本数据类型外,还达到了恒定的池技术。
以下是对三行代码的初步理解,使每个人都建立对字符串常量池的初步理解:
让我们看一下第一行代码
(字符串S1 =“ Hello”)字符串字符串的方式,Virtual Machine首先转到字符串常数池(如果存在)。如果存在存在,则将参考直接返回。如果没有存在,将在堆内存中创建字符串对象,然后在字符串常数池中注册字符串。
上面的代码中的虚拟机(字符串S1 =“ Hello”)将首先转到字符串常数池以查找与字符串相对应的引用。找到该字符串,在发现后,将在该字符串中有一个字符串对象(内存地址0x0001)堆内存,然后在字符串常数池中使用0x0001的注册地址为0x0001,也就是说,添加方向参考。第一次将字符串对象返回到S1。
让我们看一下
当我们使用新关键字创建字符串对象时,JVM不会查询字符串常数池。它将直接在堆内存中创建一个字符串对象,并返回到附属变量。
因此,S1和S2指向两个完全不同的对象。判断S1 == S2时,将返回false。
查看以下示例:
第一行代码的执行过程是这样:
执行第一行代码后,内存就是这样:
第二行代码
调用呼叫方法时,首先转到常数池以查找与字符串相对应的引用,如果有的话,请直接返回字符串;
如果没有,您将在常数池中注册对字符串的引用,然后返回到字符串。
由于第一行代码使用一种创建字符串的新方法,因此相应的引用未保存在字符串常数池中。虚拟机会在恒定池中注册。注册后的内存示意图如下:
第三行代码
首先,虚拟的机会检查字符串常数池并发现有尖的引用。然后返回字符串直接指向变量的引用。
执行第三行代码后,内存示意图如下:
如图所示,S1和S2指向同一对象,因此在判断S1 == S2时返回true。
总结:
坦率地说,字符串常数池提供了字符串的重复使用函数。除非我们要创建一个新的字符串对象,否则我们将仅维护同一字符串虚拟机的一个副本。
让我们看看另一个例子:
首先,第一行和第二行是常规的字符串对象。他们将在堆内存中创建字符串对象,并在字符串常数池中注册。
影响我们判断的是第三行代码。我们不知道创建新字符串后是否会在字符串常数池中注册。
简而言之:我们不知道这条代码是否以双引号的形式声明为字符串,或者是新的关键字创建字符串。
然后,让我们看一下此终端的反编写代码:
只要看要点:
可以通过上述源代码看到它:S3通过新关键字获得字符串对象。
回到主题,也就是说,字符串常数表中没有存储参考。当S4以引号标记形式声明字符串时,因为在字符串常数池中找不到相应的引用,它将是在HEAP内存中新创建的。a String object.so s3和s4不是同一字符串对象,结果是错误的。
阅读本文后,我相信您对字符串初始化的理解更高。跟我说,我是一个专注于共享Java知识的新时代移民工人。
作者:第一次思考和初恋