Java--常量和常量池的设计

Java之常量和常量池设计

前言

这篇是基于static和final 的常量设计,属于基础知识点,如果还不知道static和final的朋友,可以先熟悉和了解一下static和final哦。

常量设计

常量我们都知道是一种固定不能改变的变量,当使用final修饰变量,变量不能修改,当使用static修饰变量后,变量不能修改且只有一份,只读。那么Java中的常量,一般变量名字需要全大写,如果是多个单词需要用“_”字符相连,变量前面的static和final的位置可以互换;

public class Main {
    public static final String DEFUALI_STATE = "正常";

    public  static void  main(String [] args){
        System.out.println(Main.DEFUALI_STATE);
    }
}

除了以上方法可以定义常量外,Java中还有一个特殊的常量-接口中定义的变量(默认为常量)

常量池

常量池:相同的值只存储一份,节省内存,共享访问。那么我们就来了解一下Java基本类型的包装类中有哪些有常量池,哪些没有:
八种基本类型包装类:Byte、Short、Integer、Long、Character、Boolean、Float、Double
Boolean:true、false Byte:-128~127 Character:0~127
Short、Int、Long:-128~127 Float、Double:没有缓存(常量池)
上述八种基本类型中只有Float和Double没有常量池,其他都有

public  static void  main(String [] args){
        /*其中==比较的是变量的地址是否相等*/
        Boolean a = true;
        Boolean b = true;
        System.out.println(a==b);//true

        Byte c = 127;Byte d = 127;//(short byte int long 的范围都是-128~127,所以这里只举了byte的例子)
        System.out.println(c==d);//true

        Character e = 127;
        Character f = 127;
        System.out.println(e==f);//true

        Float g = 0.5f;
        Float h = 0.5f;
        System.out.println(g==h);//false

        Double i = 0.5d;
        Double m = 0.5d;
        System.out.println(i==m);//false
    }

在上述例子中,有常量池的基本类型变量在数值范围内,那么都是相等的,如果超出了各自的数值范围结果会怎样呢,比如integer类型:

Integer c1 = 1000;Integer d1 = 1000;//(short byte int long 的范围都是-128~127,所以这里只举了byte的例子)
System.out.println(c1==d1);//false

超出之后用‘==’的结果是false,那么此时该值已经超出了常量值范围,也就是此时内存中c1和d1是不指向同一个地址的,要判断是否相等,就要使用equals方法 。

在Java中常量字符串都建立了常量池缓存机制。我们都知道基本类型和字符串一共有两种创建方式,一种是常量式赋值,放在栈内存中(会被常量化),一种是new对象创建,放在堆内存中(不会被常量化)。

int  a = 10; 		
string  b = " 001 "   // 常量式

Integer  c = new Integer(111)			
String  d  = new String("123")   //new 对象创建

例子

public class BoxClassTest {
	public static void main(String[] args)
	{
		int i1 = 10;
		Integer i2 = 10;                // 自动装箱
		System.out.println(i1 == i2);   //true
		// 自动拆箱  基本类型和包装类进行比较,包装类自动拆箱
		
		Integer i3 = new Integer(10);
		System.out.println(i1 == i3);  //true
		// 自动拆箱  基本类型和包装类进行比较,包装类自动拆箱
		
		System.out.println(i2 == i3); //false
		// 两个对象比较,比较其地址。 
		// i2是常量,放在栈内存常量池中,i3是new出对象,放在堆内存中
		
		Integer i4 = new Integer(5);
		Integer i5 = new Integer(5);
		System.out.println(i1 == (i4+i5));   //true
		System.out.println(i2 == (i4+i5));   //true
		System.out.println(i3 == (i4+i5));   //true
		// i4+i5 操作将会使得i4,i5自动拆箱为基本类型并运算得到10. 
		// 基础类型10和对象比较, 将会使对象自动拆箱,做基本类型比较
		
		Integer i6 = i4 + i5;  // +操作使得i4,i5自动拆箱,得到10,因此i6 == i2.
		System.out.println(i1 == i6);  //true
		System.out.println(i2 == i6);  //true
		System.out.println(i3 == i6);  //false
	}	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值