为什么字符串在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