让你彻底明白JAVA中堆与栈的区别, 以及==与equal的区别

让你彻底明白JAVA中堆与栈的区别

 Java把内存划分成两种:一种是栈内存,一种是堆内存。

        栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

        堆内存:用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

 

       栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

 

分出堆于栈的原因无非就是由于在读取速度与可操作性灵活性之间不断地选择,根据你的需求去选择,很多都是这么个原理。

 

Java中的数据类型有两种。

一种是:基本类型(primitive types),即int, short, long, byte, float, double, boolean, char。

一种是包装类数据:如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new()语句来显式地告诉编译器,根据我的理解其实就是对象,存在对内存之中,不能引用,但是灵活的拓展。

 

上述就是堆栈的理解:栈中存起基本类型变量,其实就是指针性质,可重复的引用,存取速度快,毕竟是指针,没有就开辟内存。堆其实就是放对象的,我们见到的String,Integer,这些其实都是装箱的,我的理解其实就是对象性质。但是String是比较特殊的。

Integer Integer1 = new Integer(12);
Integer Integer2 = new Integer(12);
Integer Integer3 = new Integer(127);
int int1 = 12;
int int2 = 12;
int int3 =127;

System.out.print(int1==int2);//t
System.out.print(int1==Integer1);//t
System.out.print(int2==Integer1);//t
System.out.print(Integer2==Integer1);//f
System.out.print(Integer3==int3);//t

这是关于封装对象的测试,可以自己看看。

==与equal的区别

 String有两种比较方式,== 与equal,简单的说“equal”比较的是指基本类型比较的是指针最终指向的是数值(看源码是先比比较地址,不是再比较数值;有一个满足就相等),"=="比较的是对象地址。这是根本的区别。

这样看的话equal 包含==;

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2);//f
System.out.println(str1.equals(str2));//t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhangJiQun&MXP

等到80岁回首依旧年轻

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值