黑马程序员技术交流社区

标题: 关于string的小问题 [打印本页]

作者: MMM521    时间: 2017-4-4 23:58
标题: 关于string的小问题
为什么字符串类String是不可变?比如说int long 的变量都是可以再赋值的,  而string  为什么赋值了就不能改变了

作者: Hp_Yx    时间: 2017-4-5 00:03
string 赋值后可以改变吧

作者: zeng1002    时间: 2017-4-5 00:10
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所表示的是这个字符串在堆区中的地址,例如你定义一个String a = “A”。其实这个字符串“A”是存储在内存的堆区中,而a这个变量是在内存的栈区中开辟的空间用于存储“A”在堆区中的地址的,“A”在堆区中存储好了之后,存储它的这块区域会生成一个地址(地址名随机的,假设是0x0088),然后这个地址就会返回给栈区中的a,所以a这个引用型变量里面实际存储的是0x0088这个地址,而不是字符串“A”,所以你不能拿一个字符串赋值给它,因为字符串存储在堆区中,a在栈区中不存字符串,存的是个地址

作者: 情不知所起    时间: 2017-4-5 00:10
可以变啊!

作者: DreamBoyMrsLin    时间: 2017-4-5 00:10
因为iString这个类型是特殊的类型  老师没有给你画原理图吗?还有现在学的是1+1=2  java里面就是这么定义的  就不要这么纠结了
作者: 南山南    时间: 2017-4-5 00:18
支持2楼,不变的是地址值,但是具体的字符串是可以改变的,楼主问的问题有问题!!凡是储存在堆里的引用数据类型,类,接口,数组,枚举,都是以一个指向栈内存的地址!!这个地址是你一旦创建对象就不会改变的!

作者: 阿利24    时间: 2017-4-5 00:45
zeng1002 发表于 2017-4-5 00:10
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所 ...

A不是在常量池中么

作者: 想New一个女朋友    时间: 2017-4-5 07:10
zeng1002 发表于 2017-4-5 00:10
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所 ...

对的,这个毕老师的视频里也有说

作者: zeng1002    时间: 2017-4-5 09:38
阿利24 发表于 2017-4-5 00:45
A不是在常量池中么

是在常量池中的,但是字符串比较特殊,可以那样用,但是不建议,还是建议用字符串名.contentEqauls(字符串)来判断两个字符串是否相等的





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