对String值不可变的理解以及String类型的引用传递问题

今天复习java时,突然注意到了一句以前没有注意过的一句话,String 是final修饰的,其值是不可变的。当时看的一脸懵逼,String str = "abc"; str = "abcde"这两行代码没有任何的错误的。上网百度了许久,还是整理下来防止以后忘记吧。

首先要理解的是,string说的不可变是其值不可变,比如String str = "abc",不可变值得是abc不可变,当我们str = “abcde”时,abc没有被销毁,仍然存放在常量池中,只不过是让str指向了“abcde”的内存地址。所以就算不停的赋值,改变的也只是str引用的地址问题,右边的值是不改变的。就举个String类型的引用传递来详细说明下吧

public class Test {
	
	public static String appStr(String a){
		a += "bbb";
		return a;
	}
	
	public static StringBuilder appSb(StringBuilder sb){
		sb.append("bbb");
		return sb;
	}
	
	public static void main(String[] args) {
		String s = "aaa";
		String s2 = Test.appStr(s);
		//注意这边打印的是s,不是s2
		System.out.println(s);
		
		StringBuilder sb = new StringBuilder("aaa");
		StringBuilder sb2 = Test.appSb(sb);
		//注意这边打印的是sb,不是sb2
		System.out.println(sb.toString());
	}
}
上输代码的输出结果是

aaa
aaabbb

下面来分析一下当运行到Test.appStr(s)时,将s(实参)的地址传递给a(形参),此时a="aaa",a+="bbb"之后,a="aaabbb",但是由于string是不可变的,所以在内存上就会重新分配一片内存空间给aaabbb,然后a指向该地址;而s的指向地址却没有发生改变,所以s的值打印出来仍然是aaa;

同理分析StringBuilder,也是引用类型,传递的是地址值,当形参sb传递给实参sb之后,方法对sb进行了修改,sb的值发生了改变(并不像string一样值不可变,重新分配空间),所以运行之后sb的指向值就发生了改变,随后打印的就是aaabbb了。

这样应该就可以理解String的不可变了。

### 回答1: 在许多编程语言中,包括Java、Python和C#等,字符串string)通常被设计成不可的,这意味着一旦字符串被创建,就不能修改它的内容。这是因为字符串在内存中被存储为一系列字符,而这些字符通常被分配在一个连续的内存块中。如果允许修改字符串,那么可能需要更改内存块的大小,这可能会导致性能问题和内存分配问题。 另一个原因是字符串不可性的优点是它可以使代码更安全。如果字符串是可的,那么可能会在多个地方修改同一个字符串对象,这可能会导致意想不到的结果。例如,如果两个线程同时修改同一个字符串,就可能会导致数据竞争和并发问题。而如果字符串不可的,那么它就可以被视为是线程安全的,因为多个线程可以同时访问同一个字符串对象,而不会对其产生任何副作用。 最后,字符串不可性也有助于提高代码的可读性和维护性。因为不可字符串可以确保其不会在代码的其他部分中被意外地更改,从而使代码更加可预测和易于理解。 ### 回答2: string不可的,是由于以下几个原因。 首先,字符串不可性使得其在使用过程中更加高效和安全。由于字符串不可的,所以可以被多个量同时引用,而不会发生修改引起的错误。这也意味着字符串在拷贝和传递时只需引用指针,而不必进行真正的复制,这样可以节省内存空间和计算资源。 其次,不可性保护了字符串的数据完整性和安全性。如果字符串是可的,那么任何引用该字符串量都可以修改其内容,这可能会导致数据被意外改变或被不可信的代码篡改。而不可性保证了字符串的数据不会被修改,避免了这些潜在的问题。 另外,字符串不可性还使得字符串可以被用作哈希表的键。由于不可性保证了字符串不会被改变,所以字符串可以通过其来进行哈希计算,保证了哈希表的键的唯一性和可靠性。 因此,字符串不可的是为了提高字符串的效率、保护数据的完整性和安全性,以及提供字符串作为哈希表键的能力。这些特性使得字符串在很多编程语言中都选择将其设计为不可数据类型。 ### 回答3: String不可的,主要有以下几个原因。 首先,String被设计为不可的,是为了增加程序的安全性。当String对象被创建后,其就不能再被修改。这意味着,一旦一个String对象被赋后,它的内容就不会再被改变。这样的设计可以避免在程序中意外地对String对象进行修改,保护程序的稳定性和正确性。 其次,不可String对象在多线程环境下更加安全。在并发编程中,如果多个线程同时修改一个可字符串对象,可能会引发数据竞争和线程安全问题。而不可String对象在被创建后,其不会被修改,因此可以在多线程环境下共享而不需要额外的同步措施。 第三,不可String对象有助于提升程序的性能。由于String对象不可,所以可以被缓存,以便在内存中重复使用。这样可以减少字符串的创建和销毁次数,降低内存的占用和垃圾回收的压力,从而提高程序的执行效率。 最后,不可String对象提供了更好的字符串安全性。由于字符串常常用于储存敏感信息,如密码、密钥等,不可的特性可以避免敏感信息被修改和篡改。在安全敏感的应用中,使用不可String对象可以更好地保护数据的机密性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值