首页 > 其他分享 >字符串常见操作

字符串常见操作

时间:2022-10-04 15:57:19浏览次数:53  
标签:String 常见 池中 字符串 操作 字节 永久 常量

String的底层结构

  

  而在jdk8中,String的底层是用的字符数组。jdk9里面做了更改,节约String占用的内存。一个char占用两个字节,而程序中绝大多数String只有Latin-1字符,这些Latin-1字符只需要1个字节就够了。

  

  一个final的字节数组,同时有一个coder用于对value中的字节进行编码的编码标识符。主要是LATIN1和UTF-16。如果发现字符串中只有Latin1字符就只需要给每个字符分配一个字节。

  

  为什么没有用UTF-8,因为UTF-8是不定长的,比如字母只有一个字节,汉字有三个字节,而String像数组一样可以charAt随机访问。

  这些都不是重点,重点在于 final 修饰了底层的value

  String的  不可变  性

    

 

    网上关于String不可变性很多帖子,我就记录一下我的理解吧

    1、重新给字符串 赋值 或者 拼接,会重新开辟内存空间,而不是改变原来的value

     

    2、还有String的replace()方法替换的时候也是重新开辟内存空间放新的字符串,而不是对原有的字符串修改。

JVM的一些概念和小调整

  永久代、元空间

    jdk6里面的方法区可以理解为永久代,放在堆空间中。对永久代设置大小很难,同时对永久代调优很难。jdk7将永久代也就是方法区中的静态变量和字符串常量池从永久代中独立出来在堆中,jdk8中将永久代取消改成元空间,放在物理机内存中,而字符串常量池和静态变量还是放在堆中。

      ——取自 哔哩哔哩 尚硅谷 宋鸿康老师的JVM课程(康师傅真的很细!!)

 字符串常量池

  String的字符串常量池底层就是一个Hashtable,jdk6中这个表长度是固定的1009,随着常量池中字符串增多,Hash冲突严重,导致链表的长度变得越来越长。判断池中是否有字符串的效率下降的很快。jdk7及以后默认长度是60013,长度可以设置。

  jdk6字符串常量池放在永久代,7及以后从永久代独立放在堆中。

  为什么要调整到堆中?

    因为放在永久代中,只有在full gc的时候才会对字符串常量池做回收,效率不高,而开发中,有大量的字符串被创建。

常见操作的原理

  几个重要方法

    StringBuilder中的toString方法——new了个String对象。

    

 

    new String(" abc ")—— String的构造器

      该方法会创建两个对象,一个在常量池中的abc,一个是new出来在堆中的对象。

 

    string.intern()方法

      jdk6:返回字符串常量池中这个字符串的地址,如果常量池中没有这个字符串就在池中创建这个字符串再返回池中字符串的地址。

      jdk7、8:返回字符串常量池中这个字符串的地址,如果池中没有这个字符串,就在常量池中创建一个指针指向堆中这个字符串,返回池中指针的地址。(这也是字符串常量池放入堆中的好处)

  字符串的拼接

    常量和常量

      拼接结果就在常量池中,并且是编译器优化。

      

      编译后查看.class文件中会发现

      

 

    有变量

      

      编译后查看.class文件

      

      使用jclasslib查看:

      

 

      有变量参与的字符串拼接远离是StringBuilder的append方法,最后调用toString方法返回一个String。但是这里的toString方法底层的new String和平常的new String不太一样,他只产生new的对象放在堆中,不会在常量池中产生对象。

 

 

 

 

 

 

 

 

 

 

  

      

 

标签:String,常见,池中,字符串,操作,字节,永久,常量
From: https://www.cnblogs.com/tyt0o0/p/16753784.html

相关文章

  • 盘点最常见且坑爹的Java事故现场,你中招了几个?
    前言jdk作为我们每天必备的调用类库,里面大量提供了基础类供我们使用.可以说离开jdk,我们的java代码寸步难行,jdk带给我们的便利可谓是不胜枚举,但同时这些方法在使用起来......
  • React中常见的TypeScript定义实战
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • 0567-6.1.0-非Kerberos环境下集群外跨操作系统的Gateway节点配置
    作者:李继武1文档编写目的用户在使用Hadoop集群的过程中需要将集群外节点且跨操作系统(suse)的服务器配置为CDH的Gateway角色。本篇文章Fayson主要介绍在Redhat7操作系统上运......
  • 字符串部分知识整理
    引入:字符串最长公共前缀(LongestCommonPrefix,LCP)普通求法利用hash。设需要求\(S,T\)字符串的LCP,则可以二分长度\(len\),求一个最大的\(len\)满足\(hash(S_1\sim......
  • 几个常见的javascript手写题,你能写出来几道
    实现new过程:要点:函数第一个参数是构造函数实例的__proto__指向构造函数的原型属性prototype函数剩余参数要挂载到一个实例对象上构造函数有返回值时,就返回这个返回......
  • Rust从入门到精通08-字符串
    Rust字符串相对于其它语言有点复杂,主要是跟所有权有关。Rust字符串涉及两种类型:&str和String1、&str-字面量str是Rust的内置类型,&str是str的借用。可以理解为字符......
  • 字符串分隔
    #include<iostream>#include<string>#include<cstdlib>usingnamespacestd;boolfindName(intsubindex,stringsubstring,string*name){ subindex=substring.f......
  • C++之字符串分割案例---数据分析-03
    stringdata="我叫李宇博,我今年13岁,我家住在不知道,今天是星期天," "我喜欢吃粑粑,我喜欢做打篮球,我的学校是太康三中,我的生日是1月1号," "我的语文成绩是:0分,我的......
  • flex布局常见问题
    flex布局常见问题问题描述在使用flex布局时,经常会设置justify-content:space-between,设置后最后一行样式会变成:解决办法最后一行也会向两边对齐,一般情况下,这并不是......
  • 常见问题汇总 --- Google Chrome浏览器翻译失败
    打开C:\Windows\System32\drivers\etc·目录下的hosts文件。添加下面两行203.208.40.66translate.google.com203.208.40.66translate.googleapis.com使用win+R键运行......