美文网首页
Python C Java中字符串在内存中的存储

Python C Java中字符串在内存中的存储

作者: 爱跑步的coder | 来源:发表于2018-10-12 10:07 被阅读0次

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

相关文章

  • Python C Java中字符串在内存中的存储

    Python 昨天在讲Python的过程中,发现了一个小问题,当时课上没有解决,下面特意查阅资料解决了一下。 同样...

  • Java内存泄漏

    本文将会介绍: C++中的内存泄露 Java内存管理与垃圾回收 Java中的内存泄漏 一、C++中的内存泄露 在大...

  • python内存管理

    python是动态类型,对象是用于存储数据。在python中,各种数字,字符串,列表,字典都是对象,相当于java...

  • JVM学习笔记(2)---Java内存区域

    Java与C的内存管理区别 在C/C++中,需要使用 delete/free 等函数来手动释放内存;而在Java中...

  • volatile关键字详解

    1.Java内存模型 Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的...

  • volatile关键字

    Java内存模型 简单理解就是变量存储在主内存中,当开启个新线程是会有一个工作内存,线程使用的共享内存是从主内存c...

  • Java内存模型

    Java内存模型 Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处...

  • 字符串

    字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种: C-风格字符串(C-style str...

  • 为什么Volatile可以实现操作的可见性(《深入理解Java虚

    在java的内存模型中有区分为主内存和工作内存,Java内存模型规定所有变量存储在主内存中,每条线程都有自己的工作...

  • 认识 Java 中的 StringBuilder 类

    认识 Java 中的 StringBuilder 类 在Java中,除了可以使用 String 类来存储字符串,还...

网友评论

      本文标题:Python C Java中字符串在内存中的存储

      本文链接:https://www.haomeiwen.com/subject/eyswaftx.html