java String类的内存解析及类的内存解析

java String类的内存解析

    • 1.关于Stirng类
    • 2. 为什么要这样这种设计
    • 3.由字符串内存解析引申到引用类型和基本数据类型在内存中具体情况。

内存解析进阶String类的内存解析:终极

1.关于Stirng类

  1. 测试demo
String str1 = "AA";
String str2 = "AA";
String str3 = new String("AA");

System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true

System.out.println(str1 == str3);//true 感谢提醒,这里应该为false,因为==比较的首地址值
System.out.println(str1.equals(str3));//true
// 想知道为什么会出现这种结果,请往下看。
  1. 内存解析图
    java String类的内存解析及类的内存解析_第1张图片

  2. 按照程序执行步骤分析

    第一行声明代码:String str1 = “AA”;
    1.jvm先在栈空间写入一个str1的引用
    2.判断方法区字符串常量池里的是否存在AA,如果有,将AA的首地址值赋001x给引用str1,如果没有,新建一个AA,再将首地址值赋给str1

    第二行声明代码:String str2 = “AA”;
    1.jvm先在栈空间写入一个str2的引用
    2.判断方法区字符串常量池哩的是否存在AA,因为方法区的字符串常量池有AA,直接把AA的首地址值001x赋给str2

    第二行声明代码:String str2 = new String(“AA”);
    1.jvm先在栈空间写入一个str3的引用
    2.在堆空间开辟了一个叫new Strin()区间
    3.把new Strin()首地址值002xx赋给了引用str3
    4.把字符串常量池里的AA的首地址存在new String()的区间里

2. 为什么要这样这种设计

  1. 字符串在java编程使用的频率非常高,其实声明的时候,最终指向的的地址都是在字符串常量池的AA,极大节省了内存空间。

3.由字符串内存解析引申到引用类型和基本数据类型在内存中具体情况。

  1. demo
Person p1 = new Person("AA",12);
Person p2 = new Person("AA",12);
System.out.println(p1 == p2);//false
System.out.println(p1.equals(p2));//true equals()已经被重写
System.out.println(p1.name == p2.name);//true 底层赋值为 = 号赋值
  1. 内存解析图
    java String类的内存解析及类的内存解析_第2张图片
  2. 分析
    请看第二部分的分析
  3. 基本数据类型,直接存在堆空间,引用数据类型会存在方法区的常量池中,其实从名字就可以知道了。
  4. 如果这个看了不是很理解,先看我另一篇博客,可能会比较好理解一点。
    == 和 equals的详解
    6.赋值时 = 和 new 的区别,也是在这里理解。

你可能感兴趣的:(java String类的内存解析及类的内存解析)