python -java 数据内存解析

最近使用python 做了下跟业务相关的复杂数据类型处理,碰到很多变量引用的问题,这里的东西还是蛮多的,跟java 管理内存的方式有很多地方一样但又有不同,此处记录一下。

1.了解下基本数据类型和引用数据类型

  1.1java 有八种基本数据类型,byte short int long char float double boolean 对于基本数据类型的比较,都是用==来比较两者的值是不是相等。

  1.2 引用数据类型。(equals object 方法不是运算符,只能被对象使用,== 是运算符)
  一般情况下,equals和==是一样的,都是比较的两者的地址值是不是一样。但是也有特殊情况,比如,我们都知道所有类都是继承自Object基类,Object中的equals方法中是使用==来实现的,即比较的是两者的地址值。但是,Object的子类可以重写equals方法,比如Date、String、Integer等类都是重写了equals()方法,比较的是值是否相等。例如,在String类的equals()源码中,先比较是不是指向同一个地址,如果不是再比较两者是不是值相等。这个时候,equals和==所表达的含义显然就不一样了。(开发过程中很多场景需要重写equals 方法来比较两个对象)

  1.3 python有 数字、字符串、列表、元组、字典、集合这六种基本数据类型。在此基础上,python提供封装了其他的数据类型(datetime,calendar,collections,enum,pprint,heapq,bisect)

2.基本数据类型的内存管理

  1.对于python来说,整型,布尔型,字符串是以常量池(java)的形式存储

  

 

  可以看到,将a,b 都赋值为1 ,但是a,b 的地址都指向相同的内存地址,这个原理跟java 是不同的

  但是,float dict  list  数据类型会分配不同的存储地址

  

 

   

  2. java 的变量分为局部变量和方法区内变量(静态区 和 常量池 )

    2.1 方法内部声明的变量的引用都放到了栈内存中,由于java 所有的赋值操作放到了类中,那么int a = 1 ; int b = 1 这个操作会在堆空间中运行时分配加载

    2.2 Object a = Person("zhang");Object b = Person("zhang")

      

 

     p1 p2 虽然实例化传值一样,但是还是会指向两个不通的 对象 object


 

     总结:暂时可以简单理解为python 整型 布尔型 字符串的定义和引用全部都放到了 常量池(不可变性,会自动检测是否有相同数值,有的话就指针指向,没有则新增指针指向),而复杂的数据结构如 list  dict set  float 放在了堆,即使字面量赋值一样也不会自动引用,而是重新开辟内存存储。如果不是字面量赋值,而是通过append 或者 dict[key] = value 方式则操作的是原来的数据。这里跟java不同,也是python 特有的优点,利用这个特性,在处理数据结构时通过这个技巧可以做出很多酷操作。

    

 

     

 这里有一篇文章对 javascirpt  内存管理讲的挺好的 一起分享下  https://www.cnblogs.com/lsgxeva/p/7976019.html

posted @ 2020-04-17 14:15  风中的沙~~  阅读(374)  评论(0编辑  收藏  举报