本文主要是介绍String类不可变性详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
String的不可变
String(字符串)是一个特殊的对象,一旦初始化就不可以被改变。
这里所说的不可变指的是什么,我们先看一个简单的程序:
public static void main(String[] args) {String s = "Hello";s = "World";System.out.println(s);
}
输出结果:
World
不可变是值"Hello"不可以被改变吗?按这个思路输出的应该还是Hello,但实际输出结果是World,为什么?
这里所说的不可变指的是创建的"Hello"字符串是在内存中不可变的,我们进行赋值其他字符串操作其实是将其他内存中的字符串赋给了s变量,我们用一个图来简单显示一下:
正如图所示一样,Hello这个字符串在内存中已经固定下来了,所以称它是不可变的,但String s变量本身可以指向另一个字符串。
String作为函数参数传递
String是特殊的引用类型,一旦初始化则是不可变的,可以当做是基本数据类型看待,因为基本数据类型也是不可变的。
String与基本数据类型作为参数传递时,传递的只是值的一个副本,在函数中对数据进行操作,不会改变原有的值,改变的只是副本值。
Java只支持值传递
但是我们又知道java机制是只支持值传递,那么传递一般的对象,那不应该传递的是引用吗?
其实,java认为,即使传递的是引用,也把他看成地址值看待,所以就是值传递,实际上可以说是引用传递了,只不过传递的是地址值。
将对象作为参数传递,函数中对对象进行操作时,实际改变的就是对象本身,不存在副本或拷贝的情况。
我们看一些案例,来加深理解:
public static void main(String[] args) {int i = 10;method1(i);System.out.println(i);String s = "Hello";method2(s);System.out.println(s);
}public static void method1(int i) {i = 100;
}
public static void method2(String s) {s = "World";
}
输出结果:
10
Hello
这个例子可以看出,String与基本数据类型一样,只是简单的一个变量副本传递,实际不会改变原来的值,仅仅改变局部副本变量的值。
public static void main(String[] args) {Student s = new Student(1002, "张三");method(s);System.out.println(s.toString());
}public static void method(Student s) {s.setId(1003);s.setName("李四");
}
输出结果:
Student [id=1003, name=李四]
这个例子可以说明,对象作为参数传递时,传递的是真正的地址,可以实际对对象进行操作。
这篇关于String类不可变性详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!