java中值类型与引用类型

今天遇到一个值类型和引用类型的问题,有点知道是什么意思但是表述不出来的感觉。所有下面我做了一个总结:

  • 值类型:在JVM内存中由栈内存保存,存放的内容是一个具体的值。

  • 引用类型:引用类型在JVM内存中由栈和堆两块区域共同存放,栈中保管的是这个值在堆中存放的地址,在堆中保存的才是这个值本身。例如数组,在栈内存中存放的是一个地址,指向堆内存的一块区域。

  • 总结:1. JVM中分为栈内存和堆内存。栈内存我们可以直接去访问,而堆内存我们不能直接访问。所以我们在栈中可以直接拿到我们的数据时,就是值类型,如果栈内存放的是一个地址需要去堆内存查找才能拿到数据的我们叫引用类型,所以在访问效率上值类型的访问效率比引用类型的访问效率要高,那Java中为什么还要提出引用类型这种概念呢?我是这样认为的:存在即是合理,我们都知道在Java中万物皆对象,而对象就是一个引用类型的。在我们创建对象的时候需要消耗的成本很大,如果放在栈中,我们就需要频繁的去new对象,这样效率是很低的。如果放在堆中,我们就可以通过地址去共享这个对象了,而对象的销毁是在这个对象在堆中已经没有任何引用,GC会去扫描这些对象进行回收。所以我们不需要频繁new对象消耗内存。

  • 在这里插入图片描述

  • 值类型:基本数据类型。四类八种。
    四类:整型,浮点型,字符型,逻辑型。
    整型:byte(1字节),short(2字节),int(4字节),long(8字节)
    浮点型:float(4字节),double(8字节)
    字符型:char(一般来说为2个字节表示)
    逻辑型:boolean(一般占1个字节)

  • 引用类型:除了四类八种类型外,其余类型都称为引用类型如:数组,类,接口,字符串。

  • 值传递:基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值。实参传递给形参,形参的改变不影响实参的值。

  • 引用传递:引用传递相当于传递对象的地址,形参的改变影响实参的改变。

*内存分配:值类型的数据存放在栈的内存空间中。直接存储数据本身。所以存储数据较快。
引用类型的数据存放在堆中。在堆中分配内存空间是不直接存储数据的,而是指向所要存储的数据,也就是堆中存储的值是一个指向地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。

扩展:1.Java中有垃圾回收机制,栈内存中的变量随着方法的结束内存自然销毁了,而用引用类型的时候,当方法结束的时候,这个引用对象可能被另一个引用类型所应用,不会销毁,只有当一个对象没有任何引用变量引用的时候,垃圾回收机制才会回收。
2.Java中为何有堆内存和栈内存之分?
答:当一个方法执行时,每个方法都会建立字节的内存栈,在这个方法内定义的变量会放入这个栈内存中,随着方法的指向结束,这个方法的内存栈也就自然销毁(java垃圾回收机制)。当我们在程序中创建一个对象时,这个对象被保存到运行时数据区中,以便反复利用(创建对象的成本很大),这个运行时数据区就是堆内存。堆内存中的对象不会随着方法的结束而销毁,即使方法结束后,这个对象还可能被其他引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在合适的时候回收它。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值