文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java String的深入理解

2023-05-31 03:26

关注

java String的深入理解

一、Java内存模型 

按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。    

JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。

简单来说,非堆包含方法区、JVM内部处理或优化所需的内存(如 JITCompiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。     

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。

堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。   

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。     

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。   

对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在Method Area,而不是堆中。常量池中保存着很多String对象; 并且可以被共享使用,因此它提高了效率 

二、案例解析

public static void main(String[] args) {          String s1 = "abc";       //↑ 在字符串池创建了一个对象     String s2 = "abc";       //↑ 字符串pool已经存在对象“abc”(共享),所以创建0个对象,累计创建一个对象     System.out.println("s1 == s2 : "+(s1==s2));      //↑ true 指向同一个对象,     System.out.println("s1.equals(s2) : " + (s1.equals(s2)));      //↑ true 值相等     //↑------------------------------------------------------over          String s3 = new String("abc");     //↑ 创建了两个对象,一个存放在字符串池中,一个存在与堆区中;     //↑ 还有一个对象引用s3存放在栈中     String s4 = new String("abc");     //↑ 字符串池中已经存在“abc”对象,所以只在堆中创建了一个对象     System.out.println("s3 == s4 : "+(s3==s4));     //↑false  s3和s4栈区的地址不同,指向堆区的不同地址;     System.out.println("s3.equals(s4) : "+(s3.equals(s4)));     //↑true s3和s4的值相同     System.out.println("s1 == s3 : "+(s1==s3));     //↑false 存放的地区多不同,一个栈区,一个堆区     System.out.println("s1.equals(s3) : "+(s1.equals(s3)));     //↑true 值相同     //↑------------------------------------------------------over          String str1 = "ab" + "cd"; //1个对象     String str11 = "abcd";      System.out.println("str1 = str11 : "+ (str1 == str11));     //↑------------------------------------------------------over          String str2 = "ab"; //1个对象     String str3 = "cd"; //1个对象                         String str4 = str2+str3;                        String str5 = "abcd";      System.out.println("str4 = str5 : " + (str4==str5)); // false     //↑------------------------------------------------------over          String str6 = "b";     String str7 = "a" + str6;     String str67 = "ab";     System.out.println("str7 = str67 : "+ (str7 == str67));     //↑str6为变量,在运行期才会被解析。     final String str8 = "b";     String str9 = "a" + str8;     String str89 = "ab";     System.out.println("str9 = str89 : "+ (str9 == str89));     //↑str8为常量变量,编译期会被优化     //↑------------------------------------------------------over   }

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯