手机软件,Java根底2:根本数据类型与常量池,眩晕

本节首要介绍暂时车牌底子数据类型的巨细,主动拆箱装箱,底子数据类型的存储办法,以及常量池的原理。

作者:黄小斜

文章来历:Java技能江湖

一位阿里 Java 工程师的技能小站。作者黄小斜,专心 Java 相关技能:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux黄水劲风堡玻璃廊桥、网络、多线程,偶然讲点Docker、ELK,一起也共享技能干货和学习经历,致力于Java全栈开发!

底子数据类型的巨细

int 32位 4字节 short 16位float 32位double 64位long 64位char 男女性关系16位byte 8位boolean 1位主动拆箱和装箱的意思就手机软件,Java基础2:底子数据类型与常量池,晕厥是,核算数值时,integer会主动转为int进行核算。而当int传入类型为integer的引证时,int数值又会被包装为integer。
//8位byte bx = Byte.MAX_VALUE;byte bn = Byte.MIN_VALU花旗参E;//16位short sx = Short.MAX_VALUE;sh股市时刻ort sn = Short.MIN_VALUE;//手机软件,Java基础2:底子数据类型与常量池,晕厥32位int ix = Integer.MAX_VALUE;int in = Integer.MIN_VALUE;//64位lon手机软件,Java基础2:底子数据类型与常量池,晕厥g lx = Long.MAX_VALUE;long ln = Long.MIN_VALUE;//32位float fx = Float.MAX_VALUE;float fn = Float.MIN_VALUE;//64位double dx = Double.MAX_VALUE;double dn = Double.MIN_VALUE;//16位char3d工口 cx = Character.MAX_VALUE;char cn = Character.MIN_VALUE;//1位boolean bt = Boolean.TRUE;boolean bf = Boolean.FALSE;

主动拆箱和装箱

//底子数据类型的常量池是-128到127之间。// 在这个规模中的底子数据类的包装类能够主动拆箱,比较时直接比较数值巨细。public static void main(String[] args) { //int的主动拆箱和装箱只在-128到127规模中进行,超越该规模的两三维家个integer的 == 判别是会回来whyfalse的。 Integer a1 = 128; Integer a2 = -128; Integer a3 = -128; Integer a4 = 128; System.out.println(a1 == a4); System.out.println(a2 == a3); Byte b1 = 127; Byte b2 = 127; Byte b3 = -128; Byte b4 = -128; //byte都是持平的,由于规模就在-128到127之间 System.out.println(b1 == b2); Sy手机软件,Java基础2:底子数据类型与常量池,晕厥stem.out手机软件,Java基础2:底子数据类型与常量池,晕厥.println(b3 ==手机软件,Java基础2:底子数据类型与常量池,晕厥 b4); // Long c1 = 128L; Long c2 = 128L; Long c3 = -128L; Long手机软件,Java基础2:底子数据类型与常量池,晕厥 c4 = -128L; System.out.println(c1 == c2); System.out.println(c3 == c4); //char没有负值 //发现char也是在0到127之间主动拆箱 Character d1 = 128; Character d2 = 128; Character d3 = 127; Character d4 = 127; System.out.println(d1 == d2); System.out.println(d3 == d4); Integer i = 10; Byte b = 10; //比较Byte和Integer.两个目标无法直接比较,报错 //System.out.println(i == b); System.out.println("i == b " + i.equals(b)); 乾//答案是false,由于包装类的比较时先比较是否是同一个类,不是的话直接回来false. int ii = 128; short ss = 128; longmiwivon ll = 128; char cc = 128; System.out.println("ii == bb " + (ii == ss)); 凤凰新闻网System.out.println("ii == ll " + (ii == ll)); System.out.println("ii == cc " + (ii == cc)); //这时候都是true,由于底子数据类型直接比较值,值相同就能够。

总结:留意底子数据类型的拆箱装箱,以及对常量池的了解。

底子数据类型的存储办法

上面主动拆箱和装箱的原理其实与常量池有关。3.1存在栈中:public void(int a){int i = 腹轮机1;int j = 1;}办法中的i 存在虚拟机栈的局部变量表里,i是一个引证,j也是一个引证,它们都指向局部变量表里的整型值 1.int a是传值引证,所以a也会存在局部变量表。3.2存在堆里:class A{int i = 1;A a = new A();}i是类的成员变量。类实例化的目标存在堆大操纵笔趣阁中,所以成员变量也存在堆中,引证a存的是目标的地址,引证i存的是值,这个值1也会存在堆中。能够瑞丽航空了解为引证i指向了这个值1。也能够了解为i便是1.3.3包装类目标怎样存其实马梓豪念慈咱们说的常量池也能够叫目标池。比方String a= new String("a").intern()时会先在常量池找是否有“a"目标假如有的话直接回来“a"目标在常量池的地址,即让引证a指向常量”a"目标的内存地址。public native String intern();Integer也是同理。

下图是Integer类型在常量池中查找同值目标的办法。

public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {}}

所以底子数据类型的包装类型能够在常量池查找对应值的目标,找不到就会主动在常量池创立该值的目标。

而String类型能够经过intern来完结这个操作四字春联。

JDK1.7后,常量池被放入到堆空间中,这导致intern()函数的功用不同,详细怎样个不同法,且看看下面代全民超神码,这个比如是网上撒播较广的一个比如,剖析图也是直接张贴过来的,这儿我会用自己的了解去解说这个比如:

[java] view plain copyString s = new String("1"); s.intern(); String s2 = "1"; System.out.println(s == s2); String s3 = new String("1") + new String("1"); s3.intern(); String s4 = "11"; 继电器System.out.println(s3 == s4); 输出成果为:[java] view plain copyJDK1.6以及以下:false false JDK1.7以及以上:false true

JDK1.6查找到常量池存在相同值的目标时会直接回来该目标的地址。

JDK 1.7后,intern办法仍是会先去查询常量池中是否有现已存在,假如存在,则回来常量池中的引证,这一点与之前没有差异few,差异在于,假如在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引证。

那么其他字符串在常量池找值时就会回来另一个堆中目标的地址。