为什么字符串在java是不可变的或final
首先,我们将了解可变性和不变性的概念。
1)可变的
当我们创建一个对象时。如果我们能够更改现有对象,则此行为仅是StringBuffer的可变性。
本质上,StringBuffer类是不可变的。
示例
class mutable{ public static void main(String[] args){ StringBuffer sb = new StringBuffer("Preeti"); sb.append("Jain"); System.out.println(sb); } }
输出结果
D:\Java Articles>java mutable PreetiJain
在上面的示例中,仅创建了一个对象,只要我们对现有对象执行任何更改,更改都会得到反映。这意味着我们将得到类似PreetiJain的结果。
2)不可变
当我们创建一个对象时。如果我们不能在现有对象中进行更改,则此行为仅是String的不变性。
字符串类本质上是不可变的。
示例
class immutable{ public static void main(String[] args){ String s = new String("Preeti"); s.concat("Jain"); System.out.println(s); } }
输出结果
D:\Java Articles>java immutable Preeti
在上面的示例中,仅创建了一个对象,该对象指向原始字符串,并且每当我们在现有对象中执行任何更改时,更改都不会得到反映。这意味着我们将获得类似Preeti的结果。
为什么String是不可变的?
对于String,多个引用可以指向同一个对象。如果任何参考进行了任何更改,则其他参考将受到影响。因此,字符串本质上是不可变的。
每当我们尝试通过键访问键值时,要将字符串对象存储为哈希表中的键,这就是字符串本质上是不可变的原因。每当更改现有对象时,就创建一个对象,而不是更改现有对象。
示例
import java.util.*; class Immutability{ public static void main(String[] args){ Hashtable ht = new Hashtable(); ht.put("preeti",10); ht.put("Rahul",20); ht.put("Rajeev",30); ht.put("Avinash",40); int getValue = (int)ht.get("preeti"); System.out.println("value of 1st key value :"+getValue); } }
输出结果
D:\Java Articles>java Immutability value of 1st key value :10