一、引子

  在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在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缓存中去取。

java中字面量,常量和变量之间的区别(附:Integer缓存机制)的更多相关文章

  1. Java中String、StringBuffer和StringBuilder之间的区别

    String在Java中是字符串常量 例如 String str = "abc"; str = str + 1; System.out.println(str); 结果将是abc1 ...

  2. java中静态代理跟动态代理之间的区别

    文章转载于:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另 ...

  3. Java中Scanner类和BufferReader类之间的区别

    java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...

  4. 转:Java中Scanner类和BufferReader类之间的区别

    原文地址:https://blog.csdn.net/u014717036/article/details/52227782 java.util.Scanner类是一个简单的文本扫描类,它可以解析基本 ...

  5. 01-JS中字面量与变量

    01-JS中字面量与变量 一.直接量(字面量) 字面量:英语叫做literals,也做直接量,看见什么,它就是什么. (一)数字的字面量 数字的字面量,就是这个数字自己,并不需要任何的符号来界定这个数 ...

  6. Java中String字符串常量池总结

    最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...

  7. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  8. Java中的字符串常量池,栈和堆的概念

    问题:String str = new String(“abc”),“abc”在内存中是怎么分配的?    答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...

  9. JAVA 基础基本语法---常量与变量

    JAVA 基础基本语法---常量与变量 语法:计算机能够识别的语言的规则: 0. 基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hel ...

随机推荐

  1. Dij二级最短路

    hdu1245 Saving James Bond Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. C++ list容器系列功能函数详解

    C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进 ...

  3. javascript关闭网页的几种方法

    js关闭当前页面(窗口)的几种方式总结,需要的朋友可以参考一下: 1. 不带任何提示关闭窗口的js代码 <a href="javascript:window.opener=null;w ...

  4. UVA 624 ---CD 01背包路径输出

    DescriptionCD You have a long drive by car ahead. You have a tape recorder, but unfortunately your b ...

  5. virtIO之VHOST工作原理简析

    2017-07-19 一.前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据 ...

  6. 提高myEclipse的开发效率和外观,这些你都设置了吗?

    [前言] 为什么我的myeclipse开启速度那么慢,为什么别人能哗啦啦几个快捷键打出一片代码?刚开始使用myeclipse的时候,相信大家都有这个疑问,慢慢的,也懂得一些配置,我也不例外,在此,把常 ...

  7. mysql 删除表

    删除表 DROP TABLE 表名;

  8. mysql 数据操作 单表查询 group by 介绍

    group by 是在where 之后运行 在写单表查询语法的时候 应该把group by 写在 where 之后 执行顺序 1.先找到表 from 库.表名 2.按照where 约束条件 过滤你想要 ...

  9. LeetCode——Palindrome Number

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  10. 在一台server上部署多个Tomcat

    版权声明: https://blog.csdn.net/u011518709/article/details/27181665 在一台server上配置多个Tomcat的方法: 这几天因为在研究OGS ...