关于引用对象的使用的一点小理解


StringBuilder sbText=new StringBuilder("This var for store strings");//

StringBuilder  sbTextCopy
=StringBuilder();//②这里也属于语句②的一部分
new sbTextCopy=sbText;//

StringBuilder  sbTextCopy2
=sbText;//

看了上面的代码,或许你知道我接下来要讲什么?

            很多时候,我们都很随意并且随机的写出②、③那样的代码 。今天有人问我两句代码一样吗?初看都差不多,就是完成sbText内容的复制嘛。可细细推敲一下,两者果然不同,下面根据我的理解,对语句②,语句③逐句分析一下:

 

        语句②:同大学教科书一样这里有三个动作----

                        1、 在堆栈上分配sbTextCopy的引用存储空间(即:StringBuilder sbTextCopy)此空间占4个字节,
                        2、另一个工作就是,在内存的另一空间分配固定大小(又引用类型自身决定)的数据存储空间,这里是用来存实实在在的对象,而不是引用

                        3、把sbTextCopy得值设为第2点的存储空间地址

                        4、把sbTextCopy得值设为sbText存储空间地址(sbTextCopy=sbText)(覆盖了第3步)

                         

       语句③: 1、在堆栈上分配sbTextCopy2的引用存储空间。同上第1点

                      2、把sbTextCopy2得值设为sbText存储空间地址

如同上面分析:语句③较语句②少了:分配实体存储空间的步骤和将sbTextCopy设置为sbText的空间地址。他们的差距就不多说了,当访问频率不是很高的时候,性能是体现不出来的(我也只是猜测,没做过测试)。

   

      下面用图形来表达下我的理解:

  

原文地址:https://www.cnblogs.com/paulxie/p/2044153.html