Python C Java中字符串在内存中的存储
2018-10-12 本文已影响0人
爱跑步的coder
Python
昨天在讲Python的过程中,发现了一个小问题,当时课上没有解决,下面特意查阅资料解决了一下。
a = "123"
b = "123"
print(id(a) == id(b)) #此处结果为True,也可以写成print(a is b)
c = "python.org"
d = "python.org"
print(id(c) == id(d)) #此处结果为False
同样都是字符串,为什么差别如此之大呢?
每次创建一个指向对象的变量(引用)时,都会创建一个新的对象。
所以在一般情况下,id值应该是不同的。但是有一些情况是例外的,例如文中提到的字符串暂留、部分整型数据缓存等。
https://medium.com/@tyastropheus/tricky-python-i-memory-management-for-mutable-immutable-objects-21507d1e5b95
C
C有几种存储字符串的情况,例如在栈区(char a[] = "123")、堆区(通过malloc内存,然后将字符串内容拷贝进去)、字符串常量区(
char *a = "123")。前两种情况这里不具体描述了,因为本质上都是变量,和Python有些类似。重点谈一下字符串常量区的情况。
char *s1 = "python.org.123";
char *s2 = "python.org.123";
printf("s1 is %02x\n", s1);
printf("s2 is %02x\n", s2);
打印结果如下所示:
s1 is 46a5794
s2 is 46a5794
Java
Java有两种存储字符串的情况。
一个是在堆区(产生了对象),代码如下所示:
String s1 = new String("python.org.123");
String s2 = new String("python.org.123");
System.out.println(s1 == s2); //结果为false
一个也是在字符串常量区,代码如下所示:
String s3 = "python.org.123";
String s4 = "python.org.123";
System.out.println(s3 == s4); #结果为true
刚才和群里同学交流,Java中Integer也存在小整数缓存的情况。具体来讲就是:
Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); #true
但如果是用new,结果就会变化
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(i1 == i2); #false
如果想进一步了解如何把对象的引用加入到字符串常量池,可参照下面的链接
https://m.jb51.net/article/59935.htm