【其他】java常量设计与常量池

java常量设计与常量池【认真看完test.java,常量池面试无忧】

1.常量申明:

常量申明:不能修改,可直接引用,空间中仅保留一份,只读
    普通类中:public static final 【数据类型】 【全部大写的变量名,以下划线相连】 =  【UNIX_NAME】
    接口中:接口中定义的变量默认为常量

2.常量池:

1.java为很多基本类型的包装类、字符串都建立了常量池
2.相同的值只存储一份,节省内存,共享访问,提高运行速度
3.基本类型的包装类:常量池缓存范围
	Boolean     true/false
    Byte        -128 到 127  
    Short       -128 到 127  
    Integer     -128 到 127  
    Long        -128 到 127  
    Character   0 到 127
    Float       没有缓存-常量池
    Double      没有缓存-常量池
4.java为字符串常量建立的缓存常量池:--
5.基本类型的包装类和字符串的创建方式:
    -1.赋值创建,放在栈内存,会被常量化
    -2.new对象创建,放在堆内存,不会被常量化
            String a = "a";
            String a = new String("a");因为new对象不会被常量化,所以两者不等
6.作用:节约内存,共享访问

3.测试test.java:

package com.hdsf.base;

/**
 * 常量池
 *  Boolean    Boolean     true/false
 *             Byte        -128 到 127
 *             Short       -128 到 127
 *             Integer     -128 到 127
 *             Long        -128 到 127
 *             Character   0 到 127
 *             Float       没有缓存-常量池
 *             Double      没有缓存-常量池
 */
public class ConstantsTest {
    public static void main(String[] args) {
        Integer a1 = 127;
        Integer a2 = 127;
        System.err.println(a1 == a2);//true
        Integer a4 = 128;
        Integer a5 = 128;
        //因为128超过常量池缓存范围 所以是两个地址,不相等
        System.err.println(a4 == a5);//false
        Integer a3 = new Integer(127);
        System.err.println(a1 == a3);//false
        String a6 = "abc";
        String a7 = "a"+"bc";//此处在编译的时候 会被认定为 abc 所以不会再分配空间
        String a8 = "a"+"b"+"c";
        System.err.println(a6==a7);//true
        System.err.println(a6==a8);//true


        int q1 = 4;
        Integer q2 = 4;//自动装箱:默认int类型,自动装箱成为Integer类型
        System.err.println(q1==q2);//自动拆箱:包装类和基本类型比较时,包装类自动拆箱为int  true

        Integer q3 = new Integer(4);
        System.err.println(q1==q3);//自动拆箱:包装类和基本类型比较时,包装类自动拆箱int  true
        System.err.println(q2==q3);//两个包装类比较,不会自动拆箱,new对象无常量池,所以  false

        Integer q4 = new Integer(2);
        Integer q5 = new Integer(2);
        System.err.println(q1 == (q4+q5));//true
        System.err.println(q2 == (q4+q5));//true
        System.err.println(q3 == (q4+q5));//true
        //(q4+q5)的操作会使得 q4 q5自动拆箱为基本类型并运算得到 4
        //运算的到的基本类型 4 不管与基本类型q1比较还是包装类型 q4 q5比较,都会先拆箱,在比较,所以都为 true
        //如果将q4+q5提出来用Integer接收的话,实际上就是加的时候拆箱,接数据的时候装箱,成为赋值创建
        Integer q6 = q4+q5;
        System.err.println(q1==q6);//int 和integer比较会自动拆箱 true
        System.err.println(q2==q6);//integer和integer比较,没有new,在范围内 为true
        System.err.println(q3==q6);//integer和new 对象比较 false


        String s1 = "1";
        String s2 = "1";
        String s3 = new String("1");
        String s4 = new String("1");
        System.err.println(s1==s2);//true 常量池
        System.err.println(s1==s3);//false 一个栈内存,一个堆内存
        System.err.println(s4==s3);//false 两个堆内存

        String s5= s1+"1";//设计到变量s1 ,编译器不优化
        String s6= "1"+"1";//编译器优化
        String s8= "11";
        String s7= "1"+new String("1");//new 对象编译器不优化
        System.err.println(s5==s6);//false
        System.err.println(s7==s6);//false
        System.err.println(s8==s6);//true
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇夜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值