String底层在jvm中的具体执行与优化过程

本文探讨了Java字符串在JVM中的工作原理,包括字符串常量池的位置变化、内存分配、不可变性以及优化策略。通过实例分析了字符串创建、拼接的效率问题,建议在循环中避免使用`+`操作符,并推荐使用StringBuilder。同时,对比了String、StringBuffer和StringBuilder的区别,强调了线程安全和性能的权衡。还提到了字符串的空串和null的差异,以及常用的方法和转换操作。
摘要由CSDN通过智能技术生成

java字符串底层在jvm中的具体执行与优化过程

在这之前必须附上两张图进行参考
在这里插入图片描述

说明:栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢

字符串在这里插入图片描述


  • Unicode编码的字符序列
  • java没有内置的字符串类型,而是在java类库中预定义了一个类
  • 每个双引号引起来的就是一个实列
  • 可以通过直接赋值或者new创建字符串
  • 从JDK1.7开始,我们可以使用string作为switch的条件
  • String没有用于修改字符串的方法,被称作不可变字符串(不可变字符序列),定义声明为final class ,但是我们可以修改字符串变量,让它指向改变
    在这里插入图片描述
    serializable接口:表示字符串支持序列化的
    comparable接口:表示String可以比较大小
    内部定义的value数组用于存储字符串数据
    列如:
String s1 = "abc";
String s2 = "abc";
//下面这条语句过后s1和s2指向不同的内存区域
s1 = "hello";

s1 == hello;
s2 == abc

在这里插入图片描述
在这里插入图片描述
1.8之后常量池在方法区,具体在方法区的元空间

  • 为提高内存利用率jvm提供了字符串常量池,java会先查找里面是否存在,存在则直接对象的引用,不存在则创建并返回他的引用
  • 使用new和一般的直接赋值不同,String类提供了intern()方法,调用该方法时候会首先去常量池查看是否有该字符串存在则直接返回引用不存在,则在常量池中添加并返回引用
    String s5 = "hel"; String s4 = s5.intern(); System.out.println(s4);//hel
  • java8中将字符串常量池放在堆中,而且默认缓存大小也在不断扩大,java8中的PermGen被MateSpace替代

String 对象的创建

		String s8 = "hellohelloworldworld";
        String s9 = new String("hellohelloworldworld");
        System.out.println(s8 == s9);//false
        System.out.println(s8.equals(s9));//true


		String s1 = "LittleMagic";
        String s2 = "LittleMagic";//在常量池中
        String s3 = new String("LittleMagic");//没在常量池中
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值