A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© waterlee 初级黑马   /  2015-4-4 18:17  /  658 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 waterlee 于 2015-4-4 18:29 编辑

Java中的String类非常重要,功能强大,这里我们只谈它的内存分配。

物理的内存是线性结构,并不存在拥有不同功能的不同区域。
编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存可以分为栈,堆,静态域和常量池等。(可能有不同的叫法,但逻辑是一致的)

不同内存区域的功能和特点:
栈区:存放局部变量(变量名,对象的引用等)特点:内存随着函数的调用而开辟,随着函数调用结束而释放。
堆区:存放对象(也就是new出来的东西)特点:可以跨函数使用,每个对象有自己对应的存储空间。
静态域:存放在对象中用static定义的静态成员。
常量池:存放常量。(常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。)

定义String的方法:
1,String str1 = "hello";
2,String str2 = new String("hello");
第一种方法:引用str1被存放在栈区,字符串常量"hello"被存放在常量池,引用str1指向了常量池中的"hello"(str1中的存放了常量池中"hello"的地址)。
第二种方法:引用str2被存放在栈区,同时在堆区开辟一块内存用于存放一个新的String类型对象。(同上,str2指向了堆区新开辟的String类型的对象)
如下图:


这两种方法的区别是什么?

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

String str1 = "hello";

String str2 = "hello";

示意图如图1


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

String str1 = new String("hello");

String str2 = new String("hello");

示意图如果2



下面用代码来测试:

public class Test

{

    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

        System.out.println(str3.equals(str4));//true


        System.out.println(str1 == str3);//false

        System.out.println(str2.equals(str3));//true

    }

}


Tip:String不属于8种基本数据类型,一个字符串常量(如"hello")可直接当作String类的对象来使用。

这里涉及到==和equals方法的区别,请看我的另一篇文章: 《Java中, equals 与 == 的渊源http://bbs.itheima.com/thread-183583-1-1.html

8 个回复

倒序浏览
回复好牛。。
回复 使用道具 举报
我靠,这太经典了,解释的好详细,赞一个
回复 使用道具 举报
赞一个!
回复 使用道具 举报
很详细啊
回复 使用道具 举报
理解好深刻啊。。。
回复 使用道具 举报
佩服啊,加油
回复 使用道具 举报
  这个必须赞一个,好东西啊!!!!!
回复 使用道具 举报
学到了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马