走进java_触摸常量池

什么是常量?

常量就是在程序执行过程中不可改变的量,在Java中主要是利用final关键字来定义常量,在应用程序中就无法再次对这个常量进行赋值,

比如:final double PI=3.1315926。


堆:位于RAM中,用于存放所有Java的对象。

栈:位于RAM中,引用就放在栈中。

静态区:位于RAM中,用于存放static修饰的变量。

常量区:位于ROM中,存放常量。


Java中的常量池技术是为了在一定程度上方便操作,和节省时间。常量池也就是一个内存空间,但是和堆空间是有一定的区别的。常量池

用来存放字符串常量和基本类型常量(public static final)。 常量池通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。


先从创建一个对象开始说起


执行这行行代码的时候,会在堆当中开辟一个内存空间来放new 出来的对象 接着创建一个引用s,但是这个引用s是存放在栈当中的。s指向Student对象。(初学的时候一直以为s就是创建出来的对象,实际则不是,个人理解这里s相当于C语言里面的指针,指向Student对象,s的值就是Student对象的内存地址)。 

说起常量池的先提一个例子

执行第一个语句,Integer m=10;  执行这个的时候会在栈里面开辟一个空间 存这个m, 然后它会在常量池当中寻找有没有10如果没有它会在常亮池中开辟个空间存放10。

然后m指向10。执行第二条语句, Integer n=10; 它也会也在栈当中开辟一个空间存放 n, 然后继续在常量池中寻找,找到10,n也会和m同时指向10,所以结果为true.


再看


为什么会输出false?  原因是因为在Inteter 类的内部定义了一个内部类,定义了-128到127的所有数字,如果超出范围了,只能去创建新的对象。

这5种的基本数据类型有 Byte, Short, Integer,Long,Character,Boolean;

值得注意的两种浮点数的包装类Double和Float没有实现常量池技术:


继续往下走


先别管它为什么会输出false,先得明白一个小知识点==的含义基本数据类型之间比较是比较数值,而复合数据类型之间比较是比较它们在内存当中的地址

。搞清楚这个之后来看他们为什么就不想等了?  那这个原因就很简单了,刚才我们说过每进行一次new都会创建一个对象,也就是都会在堆里面开辟新的

空间,x和y指向不同的地址。所以会输出false.



再看String类和常量池


s3和s4都是字符串常量,他们在编译的时候就已经确定了(存放再常量池),所以解雇欧威ture;



用new String() 创建的字符串就不是常量了,它是字符串对象,会存放在堆当中,所以它不会再放在常量池当中了,既输出false.


最后再说一下equals 和 == :

equals 方法被用来检验两个对象是否相等,就是对象的内容是否相等。

而== 在比较基本数据类型是,是判断两个值是否相等,如果相等结果为true.

但是在比较引用是是比较引用是否指向内存中同一个对象。


学习Java时间不长,这是我对常量池一些简单的理解,对于不到位和不足的地方,希望大家见谅。























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值