python和Java占用内存_python -java 数据内存解析

本文探讨了Python和Java在处理基本数据类型和引用数据类型时的内存管理方式。Python的整型、布尔型和字符串类似Java的常量池,但Python的列表、字典等复杂类型在内存管理上与Java有所不同,不会自动引用相同值的新对象。Java的变量分为局部变量和方法区内变量,而Python中,即使是相同字面量的复杂数据结构也会新开辟内存存储。
摘要由CSDN通过智能技术生成

最近使用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)的形式存储

48fc8374b1076768ad1bb7b4c9cb7d55.png

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

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

0fb67e1c5ccda65e09c58fe9810273da.png

10f72b69dad73fd489346f0bcb3128c7.png

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

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

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

d89e760efbfe8c828dc4bdbd627e2fe6.png

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

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

e98349a57d4646c6ea46b02166786216.png

b2ada6fedb487f3f21201e12b3c08cd3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值