为啥final类型的map或者arraylist可以修改数据 而final类型的String变量不可以修改数据呢

hellojava888 2015-06-17 08:19:03
比如 final Map map =new HashMap(); 可以往map里put数据
final List list =new ArrayList(); 可以往list里add数据
但是 final String s =“123”; 然后s就不可修改数据了
同样是final 为啥map和list可以修改 但是string不可以修改呢
...全文
4080 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
未来窥视者 2017-03-08
  • 打赏
  • 举报
回复
进来学习了,很同意一楼的回答
ryuugu_rena 2017-03-08
  • 打赏
  • 举报
回复
其实都不可以修改,map是引用不可变,就是map变量的地址。而字符串本来就是不可变的。字符串的引用不能变的话,其内容当然不可以变。这你懂了吧?不懂也没关系,不太重要,都是底层的东西,了解下就行了
loren-encoding 2017-03-08
  • 打赏
  • 举报
回复
刚遇见,学习了
掌心的溫度丶 2017-03-08
  • 打赏
  • 举报
回复
final 类型的map活arrList中 put 或添加数据并不是修改原有变量的内存指向地址。只是给这个地址中加了更多的值而已。 但是 final String s ="123" s = " 456"; 这等于指向了两个内存地址。 final的意思是不可变最终的 是指他内存中所指向的内存地址是不可变是最终的
finemi 2015-06-19
  • 打赏
  • 举报
回复
引用 7 楼 Raffin 的回复:
共进步嘛
鸣鸣Amadues 2015-06-19
  • 打赏
  • 举报
回复
引用 6 楼 finemi 的回复:
4楼不要误导人呀,什么叫“String本身就代表内容,是个值,所以不能改了” final的意思是一个已初始化的变量不能再指向另外的值/对象,你所举得几个例子他们的所谓不可改变上没有区别 final String b = "";和final Person p = new Person("张三");在这点上是完全一样的。 定义之后, b能改吗?不能: b = "1"; //报错 p能改吗?不能: p = new ArrayList();//报错 但是p的属性是可以修改的: list.setName("王五");//没有问题,所以final指的他所修饰的变量所指向的地址不能被更改 如果String有提供修改属性的方法或者公开了他的field的话,假设一下: b.setValue("修改String的值"); 可是实际情况是:String没有提供任何修改自身值的方法,他是一个不可变类
谢谢指正。 我认为有的时候把String当成基本类型来理解更加简单的,其实我觉得String这种既带有基本类型又带有类的特点的存在并不好。
鸣鸣Amadues 2015-06-17
  • 打赏
  • 举报
回复
map和list只是个地址,final的意思是地址不能改,但是地址指向的内容当然可以改。 String本身就代表内容,是个值,所以不能改了。
S117 2015-06-17
  • 打赏
  • 举报
回复
final 只是表示引用不可以修改, 如果你先写final Map map =new HashMap(); , 再写 map =new HashMap(); 同样会报错
oh_Maxy 2015-06-17
  • 打赏
  • 举报
回复
对List或map的add或put操作,没有修改引用。而对字符串的修改,是整个引用都要指向一个不同的字符串了。
豫让_______ 2015-06-17
  • 打赏
  • 举报
回复

                final List<String> list =  new ArrayList<String>();
		List<String> list1 = new ArrayList<String>();
		List<String> list2 = new ArrayList<String>();
		list1 = list2;
		list = list1;//这行是不能通过编译的
list定义为final是指该引用是final啦,但是list里面的值不是final的,所以可以修改。
finemi 2015-06-17
  • 打赏
  • 举报
回复
4楼不要误导人呀,什么叫“String本身就代表内容,是个值,所以不能改了” final的意思是一个已初始化的变量不能再指向另外的值/对象,你所举得几个例子他们的所谓不可改变上没有区别 final String b = "";和final Person p = new Person("张三");在这点上是完全一样的。 定义之后, b能改吗?不能: b = "1"; //报错 p能改吗?不能: p = new ArrayList();//报错 但是p的属性是可以修改的: list.setName("王五");//没有问题,所以final指的他所修饰的变量所指向的地址不能被更改 如果String有提供修改属性的方法或者公开了他的field的话,假设一下: b.setValue("修改String的值"); 可是实际情况是:String没有提供任何修改自身值的方法,他是一个不可变类
xiaohuashenshou 2015-06-17
  • 打赏
  • 举报
回复
,str是一个引用对应,存放了堆内存中对象的首字节的地址,这样的话如果是final类型的,引用的地址是不可以改变的,你给他重新赋值会指向另外一个对象

67,540

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧