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

© MMM521 中级黑马   /  2017-4-4 23:58  /  902 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么字符串类String是不可变?比如说int long 的变量都是可以再赋值的,  而string  为什么赋值了就不能改变了

8 个回复

倒序浏览
string 赋值后可以改变吧
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所表示的是这个字符串在堆区中的地址,例如你定义一个String a = “A”。其实这个字符串“A”是存储在内存的堆区中,而a这个变量是在内存的栈区中开辟的空间用于存储“A”在堆区中的地址的,“A”在堆区中存储好了之后,存储它的这块区域会生成一个地址(地址名随机的,假设是0x0088),然后这个地址就会返回给栈区中的a,所以a这个引用型变量里面实际存储的是0x0088这个地址,而不是字符串“A”,所以你不能拿一个字符串赋值给它,因为字符串存储在堆区中,a在栈区中不存字符串,存的是个地址
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
回复 使用道具 举报
因为iString这个类型是特殊的类型  老师没有给你画原理图吗?还有现在学的是1+1=2  java里面就是这么定义的  就不要这么纠结了
回复 使用道具 举报
支持2楼,不变的是地址值,但是具体的字符串是可以改变的,楼主问的问题有问题!!凡是储存在堆里的引用数据类型,类,接口,数组,枚举,都是以一个指向栈内存的地址!!这个地址是你一旦创建对象就不会改变的!
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
zeng1002 发表于 2017-4-5 00:10
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所 ...

A不是在常量池中么
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
zeng1002 发表于 2017-4-5 00:10
因为String是引用型变量,凡是引用型变量,它的值都是存储在内存的堆区中的,而你定义的String那个变量名所 ...

对的,这个毕老师的视频里也有说
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
阿利24 发表于 2017-4-5 00:45
A不是在常量池中么

是在常量池中的,但是字符串比较特殊,可以那样用,但是不建议,还是建议用字符串名.contentEqauls(字符串)来判断两个字符串是否相等的
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马