栈和堆、方法、缓存的笔记

栈和堆的区别
1.管理方式:栈自动释放,堆需要GC空间大小:栈比堆小
2.碎片相关:栈产生的碎片远小于堆
3.分配方式:栈支持静态和动态分配,而堆仅仅支持动态分配
4.效率:栈的效率比堆高
注意:
栈内存存储基本类型的变量和对象的引用变量
堆内存用于存放由new创建的对象和数组。每new一个对象就在堆内存中开辟一个新的存储空间存储此实例对象。
Person p = new Person()执行new命令时程序执行两步:a在堆内存中开辟一段空间,存储new出来的对象; b:在栈内存中添加一个变量p,p中存放的是该对象在堆内存中开始存放处的物理地址
p = null;执行此步骤时程序只是更改栈内存中的P变量所保存的地址,把地址指向null,并没有操作堆内存(把p所指向的对象实例清空回收)
无论是形参或者实参,执行XXX = null;操作时都是把XXX变量栈中存储的地址改为指向null的地址。不操作堆中的数据。
方法的分类
1.无参无返(没有参数列表,没有返回值)单纯的作为功能代码的聚合使用便于功能复用
2.无参有返(没有参数列表,有返回值)
3.有参无返(有参数列表没有返回值)适用于功能需要根据参数来进行计算的情况,但是计算的最终结果又无需返回处理
4.有参有返(有参数列表,有返回值)适用于功能需要根据参数来进行计算的情况,而且最终的结果需要返回处理
形参:是定义在方法声明上,用于指定该方法需要传递的参数类型的
实参:是调用方法时,实际传递的参数值
方法参数传递
基本数据类型作为参数传值:传值传的时值的内容,来到另一个方法空间之后,这个值和之前没有任何关系。
引用数据类型作为参数传值:传值传的时对象在堆的地址值,所以两个内容指向了同一空间是相互影响的。
基本数据类型的对象缓存
在lnteger中包含有一个缓存池,缓存值为-128到127之间。
定义Integer k1=12是先在缓存池中查找12这个对象,如果有则直接使用
new Integer(12)一定会引发对象的创建,而不管缓存池中是否包含这个对象

Integer k1 = 12;
Integer k2 = 12;
System.out.println(k1 == k2);//true,k1和k2都是引用类型,所以==比较的是地址
Integer k3=new Integer(12);
System.out.println(k1==k3);//false

字符串缓存池
String中包含一个缓存池,当使用某个字符串对象时会首先在缓存池中进行查找,如果存在则直接返回这个对象的地址;如果不存在则会在缓存池中进行创建,创建完成后返回地址。
注意:如果通过字串拼接所得内容和某个字串内容一致,但是地址不同。

string s1="abc";
String s2="abc";
String s3=new String("abc");//这里会创建2个对象,一个在缓存池中,一个是new导致的新创建对象
System.out.println(s1==s2) ; //true
System. out.println(s1==s3) ; //false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值