String 内存分配

String:



final两层含义,1-不可以被继承,2-不可变。

最经典的比较:

String s1 = new String(“myString”); //编译期间不能确定,运行去堆中开辟空间。

String s2 = “myString”;

String s3 = “my” + “String;

System.out.println(s2 == s3);--->true,都取自常量池

System.out.println(s1 == s2); --->false,不是说String数据存储在常量池中么?切常量池中的内容不重复.....

此处要补充一个常量池特点:

       常量池(constant pool)指的是String在编译期确定的,就会放到常量池中一份。

              此处有两个点:1-编译期间,也就是说new这个创建对象是在运行期间才能执行的代码,在编译期间是不能被确定的。2-被确定,是说在编译期间就能确定变量是不是常量(eg:String a = "my"+new String("123") 此处new的就是不能被确定的)。

              编译期间:将.java--->.class  .class文件是jvm能直接运行的文件。 .class文件结构:魔数、版本号、常量池、访问符、类-超类-接口、字段、方法、属性等。其中常量池

内存分配图:


疑问:图中红色线是否存在?String堆和常量池的关系?

String中有个intern()方法,取的是常量池中的字符串。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,516评论 0 3
  • java笔记 Main.java文件中的入口类(即包含main方法)的访问权限不一定非要设定为public,不加p...
    御风逍遥阅读 620评论 1 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  •   需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...
    Geeks_Liu阅读 14,076评论 5 44
  • JAVA中常遇到的几种常量池的区别 1. Class文件常量池 Class文件中除了有类的版本信息,字段,方法,接...
    cwjbest阅读 259评论 0 1