java 字符串 为什么不可变
展开全部
a只是字符串的引用,并不是对象本身,所以可以被修改。a=“age”只是将a的引用指向了字符串age,原先的字符串name并没有被改变。
Java中String类是不可变的意思是当String对象被创建后,这个对象的状态就不能被改变,包括对象内的成员变量等都不能被改变。
Java把String设计为不可变,有以下优点:
当创建一个字符串常量时,判断该字符串是否在常量池中,如果存在,返回已经存在的字符串引用,如果不存在,新建一个字符串返回其引用。例如String a=“abc”;String b=“abc”;。变量a和b其实引用的是同一个字符串对象abc,如果String是可变的,有需要再创建一个新的变量。
在Java中常常要用到Hash值,String不可变总能保值Hash值不变,并缓存起来,不用每次都计算Hash值。
正因为String是不可变的,他们可以在多个线程中共享,是线程安全的。
展开全部
为什么不可变,回答这个问题,你就要理解把它设计为不可变的好处,String作为java中最常用的一种类,提供了很多操作方法。把它设计为final有以下好处:
1:稳定性和节省内存开销
final型会在jvm进行类加载的时候就直接进行实例化,这样就节省以后去不断new带来的内存开辟成本了。实例化后固定不可变了,这样它就是很稳定的。java程序员每天都在使用String,如果String不稳定,你想java最基本的操作还能实现吗?
2:防篡改
final是无法被继承的,这样它是独立存在的,自身封装的很好,就不会有子类去修改它本身的方法,不会有外界来打扰它,自身结构也不会被篡改了。
3:安全性:
这和它不能被继承这个息息相关,没有任何类可以继承它,就不会暴露给外部访问它内部方法的机会,这样它自身就比较安全了。
4:方便jvm优化
比如:String str1=“a"+"b"+1; String str2="ab1";为final的话,jvm就可以很方便的把str1的内容优化为str2,并指向同一个引用。这样就不用再去内存中new了。
当然还有很多好处了,java设计者这样做的根本目的就是为了保证java体系基本类的稳固和安全。
1:稳定性和节省内存开销
final型会在jvm进行类加载的时候就直接进行实例化,这样就节省以后去不断new带来的内存开辟成本了。实例化后固定不可变了,这样它就是很稳定的。java程序员每天都在使用String,如果String不稳定,你想java最基本的操作还能实现吗?
2:防篡改
final是无法被继承的,这样它是独立存在的,自身封装的很好,就不会有子类去修改它本身的方法,不会有外界来打扰它,自身结构也不会被篡改了。
3:安全性:
这和它不能被继承这个息息相关,没有任何类可以继承它,就不会暴露给外部访问它内部方法的机会,这样它自身就比较安全了。
4:方便jvm优化
比如:String str1=“a"+"b"+1; String str2="ab1";为final的话,jvm就可以很方便的把str1的内容优化为str2,并指向同一个引用。这样就不用再去内存中new了。
当然还有很多好处了,java设计者这样做的根本目的就是为了保证java体系基本类的稳固和安全。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a只是字符串的引用,并不是对象本身,所以可以被修改。a=“age”只是将a的引用指向了字符串age,原先的字符串name并没有被改变。 Java中String类是不可变的意思是当String对象被创建后,这个对象的状态就不能被改变
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |