String内存地址划分:重要

String内存地址划分:重要

  • 物理的内存是线性结构,并不存在拥有不同功能的不同区域;

    • 编译器(JVM)为了更高效地处理数据,会用不同的算法把内存分布为各种区域;不同的区域拥有各自的特性;

    • Java中,内存可以分为栈,堆,静态域和常量池等;

       

  • 不同内存区域的功能和特点:

    • 栈:

      • 存放局部变量(变量名,对象的引用等);

      • 特点:内存随着函数的调用而开辟,随着函数调用结束而释放;

    • 堆:

      • 存放对象(也就是new出来的东西);

      • 特点:可以跨函数使用,每个对象有自己对应的存储空间;

    • 静态域:

      • 存放在对象中用static定义的静态成员;

    • 常量池:

      • 存放常量;

      • 常量池:指的是在编译期被确定,并被保持在已编译的.class文件中的一些数据;

 

  • 定义String方法:


    String str1="hello";
    String str2=new String("hello");

    /**
    第一种方式:
    引用str1被存放在栈区,字符串常量"hello"被存放在常量池;
    引用str1指向了常量池种的"hello";
    str1中存放了常量池中"hello"的地址;

    第二种方式:
    引用str2被存放在栈区,同时在堆区开辟一块内存用于存放一个新的String类型对象;
    str2指向了堆区新开辟的String类型的对象;


    */

     

  • 这两种方式的区别:

    /**
    第一种:
    常量池的字符串常量不能重复出现,也就是说在定义多个常量时,编译器先去常量池查找该常量是否已经存在;
    如果不存在,则在常量池创建一个新的字符串类型;
    如果存在,那么新创建的String类型引用指向常量池中已经存在的值相同的字符串常量;
    (也就是说,不会在常量池新开辟内存)

    String str1="hello";//str1存放的是"hello"的内存地址(所以内存地址都是一样的)
    String str2="hello";//str2存放的是"hello"的内存地址(所以内存地址都是一样的)


    第二种:
    在堆中创建新的内存空间,不考虑String类型对象的值是否已经存在;也就是说,不管它的值是多少;
    第二种方法的操作已经会产生新的结果:
    在堆中开辟一块新的内存,用来存放新定义的String类型的对象;

    String str1=new String("hello");
    String str2=new String("hello");


    */

     

  • 测试代码:必会

    public class Person {
       public static void main(String[] args) {

           String str1="hello";
           String str2="hello";

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

           String str3=new String("hello");
           String str4=new String("hello");
           System.out.println(str3==str4);//false
           
           //String对象重写了equals方法,比较的是value值
           System.out.println(str3.equals(str4));//true


      }
    }

 

posted @   gzs1024  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示