黑马程序员技术交流社区

标题: 关于String [打印本页]

作者: 罗海云    时间: 2013-2-27 08:39
标题: 关于String
本帖最后由 罗海云 于 2013-2-27 10:14 编辑

如果说我定义一个数组
String s = "abc"   是不是就等价于char[] arr = {'a','b','c'};  然后再String ss = newString(arr);    前面那个就相当于自动装箱了....但是我看String也不是基本数据类型...啊.他为啥还有一个new String呢..岂不是多此一举吗?


作者: 杨明明    时间: 2013-2-27 09:04
char[]是基本类型,所以arr存储在堆里,然后用new String(arr)获得arr对象,String ss=new String(arr)是在栈内存里申请一个ss变量(类似于c中的指针)指向堆中的arr,这样的好处是可以定义多个不同变量指向同一个堆内存对象,如还可以String sss=new String(arr);这样sss和ss都指向同一个堆内存对象arr,为了使用方便,所以不是多此一举,看你有什么用途了,all啦!
作者: 杨明明    时间: 2013-2-27 09:04
char[]是基本类型,所以arr存储在堆里,然后用new String(arr)获得arr对象,String ss=new String(arr)是在栈内存里申请一个ss变量(类似于c中的指针)指向堆中的arr,这样的好处是可以定义多个不同变量指向同一个堆内存对象,如还可以String sss=new String(arr);这样sss和ss都指向同一个堆内存对象arr,为了使用方便,所以不是多此一举,看你有什么用途了,all啦!
作者: 杨杨    时间: 2013-2-27 09:42
String s = "abc"   是不是就等价于char[] arr = {'a','b','c'};   首先 不等价char[] arr = {'a','b','c'};  基本类型 String s = "abc"引用类型
String 类不是基本类型没有装箱这一说
作者: 宋朋山    时间: 2013-2-27 10:05
1、Srtring类型非基本类型,但是值会通基本类型一样存放在栈内存的常量池中。每次生成前都会检查,是否已存在该值,若有则直接返回地址而不重新生成。
2、String s = "abc" :栈内存生成String的引用s,直接指向常量池中"abc”的地址;
3、String ss = newString(arr);    动作分解如下:1、在栈内存开辟名为ss的String类型的引用。2、在堆内存生成String对象(通过调用String类中cha[]参数的构造方法生成本对象)3、将新生成的String对象的值在常量池中搜索,发现已存在"abc”,则将"abc”的地址赋给String对象;4、将该String对象的地址值赋给ss引用。
   把这个过程看懂了,你的问题就解决了。
作者: 刘治广    时间: 2013-2-27 11:03
String ss = newString(arr);       ss是放在栈的相当于我们的门牌号,而arr的值却是存放在堆里的,

41.jpg (23.63 KB, 下载次数: 23)

如图

如图





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2