前言
这篇是基于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
}
}