一、引子

  在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分。

二、例子

  先举一个简单的例子,就很容易看懂接下来的定义了。

int a; //变量
final int b = 10; //b为常量,10为字面量
string str = “hello world!”; // str 为变量,hello world!为字面量

三、各定义以及区分

3.1 变量

  有些数据在程序运行中可以变化或者被赋值,这称为变量。例如:

int a;
String b;

3.2 常量

  java中是指以final关键字修饰的变量(C语言中是constant关键字),在初始化的时候必须被赋值,并且此值和类型不能再发生改变。例如:

final int a;
final String b;

3.3 字面量

  在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(natation)。

  是不是还是看不懂?我一般采用一个特殊的区分方法:等号右边的八种基本类型的值、字符串值、声明为final的常量的值。例如:

final int a = 10; //a为常量,10为字面量
string b = “hello world!”; // b 为变量,hello world!为字面量

四、Integer的缓存机制

注意,有个容易误解的地方:关于Integer在-128到127之间的缓存问题。

这个问题很多人其实都知道——如果值在-128到127之间,Integer对象的引用地址是相等的。身边很多朋友都说是字面量在常量池中缓存的原因。

其实并不是的,这是Integer的缓存机制

在Integer类中,定义了一个私有的静态类IntegerCache,这个类是用来支持Integer缓存的,它的作用是把一部分Integer类型的对象在Integer类加载的时候一起创建出来并放在一个cache数组中,以便以后循环使用。通常这个范围是-128-127,然而这个范围的最大值是可变的,可以通过-XX:AutoBoxCacheMax=<size>参数去修改这个值,在JVM初始化的时候,这个值被写入sun.misc.VM class系统私有配置文件中,并加载。(因为会一次性全部创建出来,所以这个数值会影响到启动性能)

【Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。】

    ...
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
...

然后在调用valueOf(int i)方法的时候(自动封装就是调用这个方法),就会判断 i 是否在这个范围之内,是的话就会返回这个静态类维护的cache数组里对应的对象。所以说在这个范围内值相同的对象的引用是相同的。

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

示例:

        Integer integer1 = new Integer(121);
Integer integer2 = 121; // 编译器编译成调用valueOf(int i)
Integer integer3 = Integer.valueOf(121); System.out.println(integer1 == integer2); // false
System.out.println(integer2 == integer3); // true

可见new出来的对象并不会从Integer缓存中去取。

最新文章

  1. angularjs $emit $on $broadcast 父子 兄弟之间传值
  2. python getopt使用
  3. VS中的活动debug和活动cpu
  4. JavaScript instanceof 运算符深入剖析
  5. 2016HUAS暑假集训训练题 D - Find a way
  6. android学习者优秀网址推荐
  7. 怎么设置 mysql 多主复制
  8. Android Dev
  9. struts通过Ajax返回数据时,例如对象类型,没有执行Ajax的回调函数
  10. nginx网站架构优化思路(原)
  11. AdapterView及其子类之三:基于ListView及ArrayAdapter实现列表
  12. js匀速运动停止条件
  13. AutoTile 自动拼接(三) 学习与实践
  14. 文本离散表示(二):新闻语料的one-hot编码
  15. WIN10REALTEL高清音频管理器如何调音?调音无效怎么办?
  16. selinux基本
  17. MFC读写配置ini文件
  18. 机器学习之 XGBoost和LightGBM
  19. Mad LIbs小游戏
  20. PAT 1029 旧键盘

热门文章

  1. ORA-01153: an incompatible media recovery is active
  2. 三维凸包求其表面积(POJ3528)
  3. java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式和其他常见Excel中数据转换问题
  4. python操作redis详解
  5. freemarker 判断写法
  6. Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
  7. java 并查集
  8. 菜单和按钮-EasyUI Menu 菜单、EasyUI Linkbutton 链接按钮、EasyUI Menubutton 菜单按钮、EasyUI Splitbutton 分割按钮
  9. EasyUI Droppable 可放置
  10. linux系统进入单用户模式