首页 > 其他分享 >String s = “hello“和String s = new String(“hello“)的区别

String s = “hello“和String s = new String(“hello“)的区别

时间:2024-07-18 20:08:00浏览次数:7  
标签:常量 对象 池中 字符串 new hello String

这涉及字符串加载到字符串常量池的原理:由于字符串字面量先在编译阶段加载到class常量池中,然后在类加载阶段从类常量池中加载到运行时常量池中,当字符串字面量被调用的时候,会检查字符串常量池中是否包含该字符串对象,如果已经包含,则直接返回该字符串对象的引用,如果没有,则创建该字符串字面量对应的对象。

String s = "hello"

结合上面描述的字符串常量池原理。String s = "hello"会创建0个或1个对象,首先字面量"hello"在编译阶段被加载到class文件中的类常量池中,在类加载到虚拟机的阶段,“hello”会被加载到运行时常量池中,当这句代码被执行的时候,JVM会检查字符串常量池中是否存在内容为"hello"的字符串对象,如果有则不会再创建该对象,如果没有,则会创建该对象。

String s = new String("hello")

在语句 String s = new String("hello"); 中,实际上可能会创建一个或者两个对象,具体取决于字符串常量池中是否已经存在相同内容的字符串。和上面分析一样,首先字面量"hello"在编译阶段被加载到class文件中的类常量池中,在类加载到虚拟机的阶段,“hello”会被加载到运行时常量池中,当这句代码被执行的时候,JVM会检查字符串常量池中是否存在内容为"hello"的字符串对象,如果有则不会再创建该对象,如果没有,则会创建该对象。

  1. 如果字符串常量池中不存在内容为 "hello" 的字符串对象:在这种情况下,会创建两个对象:

    • 一个是在堆内存中通过 new String("hello") 创建的新的字符串对象,这个对象在堆上分配内存。
    • 另一个是常量池中的 "hello" 字符串常量,会被创建并存储在常量池中。
  2. 如果字符串常量池中存在内容为 "hello" 的字符串对象`:在这种情况下,只会创建一个对象:

    • 仅会在堆内存中创建一个新的字符串对象,而字符串常量池中会重复使用已经存在的字符串对象。

标签:常量,对象,池中,字符串,new,hello,String
From: https://www.cnblogs.com/hashcodee/p/18310340

相关文章

  • c++ primer plus 第16章string 类和标准模板库,16.2.1 使用智能指针
    c++primerplus第16章string类和标准模板库,16.2.1使用智能指针c++primerplus第16章string类和标准模板库,16.2.1使用智能指针文章目录c++primerplus第16章string类和标准模板库,16.2.1使用智能指针16.2.3uniqueptr为何优于autoptr16.2.3unique......
  • c++ primer plus 第16章string 类和标准模板库,16.2.2 有关智能指针的注意事项
    c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项文章目录c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项16.2.2有关智能指针的......
  • .NET|--杂类|--json文件未释放, 就开始反序列化, 报错Newtonsoft.Json Unexpected cha
    前言一个看起来很莫名其妙的错误,json文件我打开看了下,格式也都正确,但是在vs中调试的时候,监视--查看--JSON可视化工具查看json字符串的话,会提示"字符串未设置为JSON格式","监视--查看--文本可视化工具",发现json格式确实看不出来任何问题.报错#报......
  • 4.java程序开发体验-hello-World
    四java程序开发体验--helloworldjava代码格式:有开始(class)---区间({})有结尾()1.将java代码编写到扩展名为.java的文件中去。编写源文件classdemo{ publicstaticvoidmain(String[]args) { System.out.print("hellojava"); }}2.通过javac命令对该java文件进......
  • Error: Expected ref to be a function, a string, an object returned by React.crea
    1、完整报错:Error:Expectedreftobeafunction,astring,anobjectreturnedbyReact.createRef(),ornull.atcoerceRef(react-dom.development.js:14873:1)atreconcileSingleElement(react-dom.development.js:15723:1)atreconcileChildFibers(re......
  • C. Binary String Copying
    原题链接题解假如两个区间经过操作之后得到的字符串一样,说明不规则仅出现在两个区间的重合处code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intl0[200005]={0};intr1[200005]={0};voidsolve(){intn,m;cin>>n>>m;strings;......
  • php中遇到new $a($b)的解法 imagick类的利用绕过open_basedir
    今天做题遇到一个新的知识点,接下来回顾下。源码<?phperror_reporting(0);ini_set('open_basedir',__DIR__.":/tmp");define("FUNC_LIST",get_defined_functions());classfumo_backdoor{public$path=null;public$argv=null;publ......
  • Java学习日历(String,StringBuilder,Stringjoiner)
     金额转换packageme.JavaStudy;importjava.util.Scanner;//币值转换publicclassCaptial{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入一个数字");intnumber=sc.ne......
  • 第一步 Hello world
    HelloWorld随便新建一个文件夹,存放代码新建一个java文件文件后缀名为.javaHello.java编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}编译javacjava文件,会生成一个class文件运行class文件,javac......
  • Java面试 : String
    串池:StringTable,可以理解为一个对象数组["a","b","ab"]每一个元素都是一个字符串对象1.常量池与串池的关系Strings1="a";Strings2="b";Strings3="ab";上述代码的运行过程:常量池中的信息会被加载到运行时常量池中,这时abab都是常量池中的符号,还没有变成Java......