什么是常量?
常量就是在程序执行过程中不可改变的量,在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时间不长,这是我对常量池一些简单的理解,对于不到位和不足的地方,希望大家见谅。