JVM内存分配及String常用方法

JVM内存分配及String常用方法

作者:奋进的小样 2019-09-04 15:31:04

云计算

虚拟化 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的。JVM将内存分为多个不同的区域,这些区域都有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。

[[275905]]

 一,JVM内存分配和常量池

​ 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的。如下图所示(注意:在jdk1.8之后便没有方法区了):

 

​ 如上JVM将内存分为多个不同的区域,这些区域都有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。

区域名称的说明:

1.1,方法区:

​ 属于数据共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

1.2,虚拟机栈

​ 虚拟机栈就是我们通常说的栈,是Java执行方法的内存模型,每当执行一次方法时,都会创建一个栈帧。把栈帧压入栈,当Java方法调用时返回正常的结果或者捕获异常时,栈帧出栈。

​ 栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接。

1.3,本地方法栈

​ 从功能上来说与虚拟机栈类似,但是虚拟机栈执行的是字节码,而本地方法栈调用的是Native方法,并且它是线程独享的。

1.4,程序计数器

​ 程序计数器是线程独享的,它是记录当前线程执行的字节码行号。在多线程执行时,CPU会来回在线程之间进行切换,那么当再次回到一条线程时,是如何得知线程的存储单元及执行指令。而程序计数器便会进行存储下一条存储单元的地址,执行完毕后程序计数器自动加 1 ,以此循环直到程序结束为止。

1.5,堆

​ 说到堆这个概念想必都不陌生,它是内存中的重要角色。它主要是用来存储被创建出来的对象,通过关键字new实例出来的,是所有线程共享的一块最大的区域。

​ ==特别注意:在JDK1.7及以后,常量池移动到堆内存中。==

​ 堆还包括一个==常量池==,用来存储编译期间生成的==字面量和符号==引用。这部分内容在类被加载后,都会存储到方法区中。同时,运行时产生的新常量也可以被放入常量池中,比如 String 类中的 intern() 方法产生的常量。

​ 常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用。

二,常量池

2.1,什么是常量:

​ 常量是指被final修饰的变量,值一旦确定就无法改变。

​ final可以修饰静态变量、方法、实例变量和局部变量。

​ 常量池分为两种形式:静态常量池和运行时常量池

2.2,静态常量池

​ 即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池用于存放字面量和符号引用量。

2.3,运行时常量池

​ 指JVM虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。同样运行时常量池一个重要的特征就是具有动态性,指并不需要常量只有在编译期才会产生,在运行期也会将新的常量保存到常量池中,如String类中的intern()方法。

三,== 和equals

3.1,两者之间区边

​ ==:

​ 对于基本类型来说:==表示数值的比较

​ 对于引用类型来说:==表示地址值的比较

​ equals:

​ 比较的是两者之间值是否相等,但是Java中的类都是直接或者间接继承Object类,而equals不也例外。其实在equals源码中也是使用==进行比较的,如下源码:

  1. ![](https://img2018.cnblogs.com/blog/1655301/201909/1655301-20190902223856542-1095893842.png) 

​ 那么问题来了,这和==又有什么区别呢?

​ 上面说到equals也是继承自java.lang.Object,因此可以对equals进行重写来定义我们自己的比较方式。

​ 请参看以下代码:

  1. String str1 = "abc"
  2.         String str2 = "abc"
  3.  
  4.         char[] strArray = {'a','b','c'}; 
  5.         String str3 = new String(strArray); 
  6.  
  7.         String str4 = "abc"
  8.  
  9.         System.out.println(str1 == str2);    
  10.         System.out.println(str1 == str3);    
  11.         System.out.println(str2 == str3);    
  12.         System.out.println(str4.equals(str1));  

​ 以上运行结果为:

  1. true 
  2. false 
  3. false 
  4. true 

​ 接下来我们依次分析上面的结果:

​ 1,str1与str2比较的是字符串对象地址,因为它们的值是相同的,所以地址值也是相同的。

​ 2,str3是new出来的示例对象,在堆内存中会开辟一块新的内存地址,它并不在常量池中。所以返回结果为false。

​ 3,同理str2与str3比较也是一样的结果。

​ 4,equals比较的是值是否相同,所以返回的结果为true。

如图所示:

 

四,String常用方法

​ 首先声明字符串:

  1. String str1 = "abc"

4.1,int length()

  1. int length = str1.length(); 
  2.  System.out.println(length); 

4.2,char charAt(值)

  1. String str= "abc"
  2. char c = str.charAt(1);   
  3. System.out.println(c);  

4.3,char toCharArray()

  1. String str= "abc"; 
  2. char c[] = str.toCharArray();   
  3. for (int i = 0; i < c.length; i++) { 
  4.       System.out.println("转为数组输出:" + c[i]); 

4.4,int indexOf(“字符”); int lastIndexOf(“字符”)

  1. String str="axcdefgabc"
  2. int a1 = str.indexOf("a");  
  3. int a2 = str.indexOf("x",  2); 
  4. int a3 = str.lastIndexOf("c");  
  5. System.out.println("你的位置为:" + a1);  
  6. System.out.println("为的位置为:" + a2); 
  7. System.out.println("点最后出现的位置为:" + a3); 

4.5,字符串大小写转换

​ toUpperCase(); 转换成大写

​ toLowerCase();转换成小写

  1. String str = "hello world"
  2. String str1 = "HELLO WORD"
  3. System.out.println("将字符串转大写为:" + str.toUpperCase()); 
  4. System.out.println("将字符串转换成小写为:" + str1.toLowerCase()); 

4.6,String[] split(“字符”)

  1. String str = "abc,def,123"
  2. String[] arr1 = str.split(","); 

4.7,boolean equals(Object anObject)

  1. String str = "abc"
  2.  String str1= "123";   
  3.  if(str.equals(str1)) {   
  4.       System.out.println("相等");  
  5.  }   
  6.  else
  7.       System.out.println("不相等");   
  8.  } 

4.8,String trim()

  1. String str = "       abc         ";   
  2. System.out.println("去掉左右空格后:" + str.trim()); 

4.9,字符串替换

  1. String replace(char oldChar,char newChar) 
  2. ​ String replaceAll(String,String)将某个内容全部替换成指定内容 
  3. ​ String repalceFirst(String,String)将第一次出现的某个内容替换成指定的内容 
  4.  
  5. String str = "abcdefgabdc";   
  6. System.out.println("替换:" + str.replace("abc""123"));  
  7. System.out.println("替换全部:" + str.replaceAll("ab""12"));  
  8. System.out.println("替换第一次出现:" + str.repalceFirst("a""a"));  

4.10,String substring(int beginIndex,int endIndex)

  1. String str = "abcdefg";   
  2.  // 截取0-3个位置的内容, 不含3  
  3.  System.out.println("截取后的字符为:" + str.substring(0, 3)); 
  4.  // 从第3个位置开始截取, 含2 
  5.  System.out.println("截取后字符为:" + str.substring(2)); 

4.11,boolean equalsIgnoreCase(String)

  1. String str = "ABC"
  2. String str1 = "abc"
  3. if(str.equalsIgnoreCase(str1)){ 
  4.        System.out.println("相等"); 
  5. else
  6.        System.out.println("不相等"); 

4.12,boolean contains(String)

  1. String str = "ABCDEF"
  2. String str1 = "ABC"
  3. if(str.contains(str1)){ 
  4.        System.out.println("str内容中包含ABC"); 
  5. else
  6.        System.out.println("str内容中不包含ABC"); 

五,总结

​ 1,对于JVM内存的分配,在jdk6中存在方法区,jdk8中便没有方法区,改成元区域。

​ 2,jdk6中常量池存在方法区中,jdk7以后常量池移动到堆中。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/250012.html<

(0)
运维的头像运维
上一篇2025-04-28 07:44
下一篇 2025-04-28 07:45

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注