Java与Python的”可变“与”不可变“变量(类型)的不同。
我的博客地址:http://www.changmeng.top/
Java
Java中,基本数据类型(如int、double和char等)是不可变的,一旦被定义和初始化就不能再改变它们的值。
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。其中基本数据类型都是不可变数据类型,例如int,如果一个int类型的数据发生改变,那么它指向了内存中的另一个地址,但是需要注意的是java缓存了所有-128到127的值。
可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型,当可变数据类型改变时它实际上是更改了内存中的内容。
创建不可变数据类型
例如,以下代码创建了一个整数变量x,该变量的初始值为5:
int x = 5;
你无法更改x的值,但你可以重新分配新的值给新的变量:
int y = x + 10; // y is now 15
对于引用数据类型,Java中的不可变类型包括String和所有其他的包装类(例如Integer、Double等),它们都是final类型。这意味着它们一旦被创建后,其内容就不能被修改。以下代码展示了使用字符串创建一个不可变对象:
String str = "hello";
如果要更改字符串,必须重新分配新的字符串变量,例如:
String newStr = str + " world"; // newStr is now "hello world"
创建可变数据类型
可变类型包括数组和自定义对象(如ArrayList、HashMap等)。这些变量可以通过添加、删除和更改元素来修改它们的内容。
例如,创建可变数据类型:StringBuilder
StringBuilder sb = new StringBuilder("a");
sb.append("b"); // "ab"
StringBuilder 是可变数据类型,更改它的时候sb始终指向一个位置
验证
public class MyClass {
public static void main(String[] args) {
String str1 = "a";
int hashCode = str1.hashCode();
System.out.println("The hash code of the string \"" + str1 + "\" is: " + hashCode);
str1 = str1 + "b";
hashCode = str1.hashCode();
System.out.println("The hash code of the string \"" + str1 + "\" is: " + hashCode);
StringBuilder str2 = new StringBuilder("a");
hashCode = str2.hashCode();
System.out.println("The hash code of the string \"" + str2 + "\" is: " + hashCode);
str2.append("b");
hashCode = str2.hashCode();
System.out.println("The hash code of the string \"" + str2 + "\" is: " + hashCode);
}
}
Python
与Java不同,Python变量的类型是动态推断的,并且所有的变量都是对象。在Python中,不可变变量包括数字、字符串和元组,而列表、字典和集合是可变的。
不可变变量(immutable variable):就是内存中内容不可以被修改的变量。当你创建一个不可变变量时,Python解释器会在内存里找是否已经创建过这个值,如果就就将已有的值赋值它,所以不可变变量的相同值是同一个地址。
可变变量(mutable variable):内存中内容可以被修改的变量。当你创建一个可变变量时,Python解释器不管是否已经创建过这个值,它都会开辟一个新的空间创建了一个新的值赋予。
以下代码创建了一个整数对象x,其初始值为5:
x = 5
与Java一样,你无法更改x的值,但你可以重新赋予新值:
y = x + 10 # y is now 15
Python字符串也是不可变的。以下代码演示了创建一个名为str的字符串变量:
str = "hello"
不可变变量的创建
x = 1
将刚才就创建好的1赋值给y。
python解释器会判断1在内存中是否存在,若不存在,python会分配内存,在内存中创建数字1,然后看变量x是否存在,若不存在就创建x,最后把1赋值给x。
y = 1
我们可以通过id或者is来判断是否在内存中是同一个地址。
print(id(x) == id(y))
# or
print(x is y)
可变变量的创建
a = [1,2,3]
python解释器不管内存有没有[1,2,3],都会重新在内存中开辟了一块新的空间,创建了一个新的[1,2,3]。
b = [1,2,3]
我们可以通过id或者is来判断是否在内存中是同一个地址。
a = [1,2,3]
b = [1,2,3]
print(id(a) == id(b))
参考
文章作者: 长梦
文章链接: http://www.changmeng.top/Java%E4%B8%8EPython%E7%9A%84%E5%8F%AF%E5%8F%98%E4%B8%8E%E4%B8%8D%E5%8F%AF%E5%8F%98%E5%8F%98%E9%87%8F%EF%BC%88%E7%B1%BB%E5%9E%8B%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
长梦!