Locale(zh_CN, en_US,…)
语言,zh,en等
国家/地区,CN,US等
其他变量(variant)(几乎不用)
Locale方法
getAvailableLocales()返回所有的可用Locale(即语言国家)
gctDefault()返回默认的Locale(本jdk的语言)
常量:一种不会修改的变量
Java没有constant关键字
不能修改,final
不会修改/只读/只要一份,static
方便访问public
Java中的常量
public static final
建议变量名字全大写,以连字符相连,如UPPER_BOUND
Java为很多基本类型的包装类/字符串都建立常量池
常量池:相同的值只存储一份,节省内存,
共享访问基本类型的包装类
Boolean,Byte,Short,Integer,Long,Character,Float,Double
- Boolean: true, false
- Byte : -128~127,Character : 0~127
- Short, Int, Long: -128~127
- Float,Double:没有缓存(常量池)
Java为常量字符串都建立常量池缓存机制
public class StringConstantTest {
public static void main(String[]args) {
String s1 = "abc";
String s2 = "abc";
String s3 = "ab" + "c";
//都是常量,编译器将优化,下同String s4 = "a" +"b" + "c";
System.out.print1n(s1 == s2);//true
System.out.print1n(s1 == s3);//true
System.out.print1n(s1 == s4);//true
}
}
//s1,s2...大家都指向同一块内存空间(”abc“)
基本类型的包装类和字符串有两种创建方式
常量式(字面量)赋值创建,放在栈内存(将被常量化)
- Integer a = 10;
- String b=“abc”;
new对象进行创建,放在堆内存(不会常量化)---new的对象会调用构造函数
- Integer c = new Integer(10);
- String d = new String(“abc”);
//这两种创建方式导致创建的对象存放的位置不同(虽然都在堆内存)
栈读取速度快容量小,堆读取速度慢容量大
public class BoxClassTest {
public static void main(String[]args){
int i1 = 10;//常规变量
Integer i2 = 10;//自动装箱,i2是Integer类对象,常量池,在栈内存
System.out.print1n(i1 == i2);//true
//自动拆箱 基本类型和包装类进行比较,包装类自动拆箱
Integer i3 = new Integer(10);
system.out.print1n(i1 == i3); //true
//自动拆箱基本类型和包装类进行比较,包装类自动拆箱
system.out.print1n(i2 == i3);//false
//两个对象比较,比较其地址。
//i2是常量,放在栈内存常量池中,i3是new出对象,放在堆内存中
Integer i4 = new Integer(5);
Integer i5 = new Integer(5);
system.out.print1n(i1 =(i4+i5));//true
system.out.print1n(i2 ==(i4+i5));//true
system.out.print1n(i3 ==(i4+i5)); //true,i3与常量值比较,自动拆箱
//i4和i5是两个(包装类Integer)对象。i4+i5将会自动拆箱,变换为两个int的加法,即5+5,所以i4+i5的结果为10,是int类型,不是Integer的对象。
Integer i6 = i4 + i5; //+操作使得i4,i5自动拆箱,得到10,因此i6 == i2
//i6是常量赋值的对象,在常量池
System.out.print1n(i1 == i6);//true
System.out.print1n(i2 == i6);//true
//上述2者都是常量比较
System.out.print1n(i3 == i6);//false
//i3是堆内存的对像,i6是常量池的常量,地址不一样
}
-基本类型和包装类比较,将对包装类自动拆箱
对象比较,比较地址
加法+会自动拆箱
分析String类
常量赋值(堆内存)和new创建(栈内存)不是同一个对象
编译器只会优化确定的字符串,并缓存
public class stringNewTest {
public static void main(String[] args) {
string s1 = "abcdef";
string s1 = "abc";
string s2 = "abc";
String s3 = new String( "abc" );
String s4 = new String( "abc" );
System.out.println(s1 == s2); //true常量池
System.out.print1n(s1 == s3); //false一个栈内存,一个堆内存
System.out.print1n(s3 == s4); //false两个都是堆内存
System.out.print1n("============");
String s5 = s1 + "def";//涉及到变量,故编译器不优化
String s6 = "abc" + "def";//都是常量编译器会自动优化成abcdef
String s7 = "abc" + new String ("def");//涉及到new对象,编译器不优化
System.out.print1n(s5 == s6); //false
System.out.print1n(s5 == s7); //false
System.out.print1n(s6 == s7); //false
System.out.print1n(se a= s6); //true
System.out.print1n( "============");
String s8 = s3 + "def";//涉及到new对象,编译器不优化
String s9 = s4 + "def" ;//涉及到new对象,编译器不优化
String s10 = s3 +new String( "def");//涉及到new对象,编译器不优化
System.out.print1n(s8 == s9);//false
System.out.print1n(s8 == s10); //false
System.out.print1n(s9 == s10); //false
//虽然都在堆内存,但编译器不优化,各自指向各自的堆内存空间
}
}