欢迎来到彩票365专业数据平台_彩票365网站_彩票365新版! 联系我们 网站地图

彩票365专业数据平台_彩票365网站_彩票365新版

0379-65557469

彩票365手机版下载
全国服务热线
0379-65557469

电话: 0379-65557469
0379-63930906
0379-63900388 
0379-63253525   
传真: 0379-65557469
地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室 

彩票365手机版下载

彩票365专业数据平台-Java根底2:根本数据类型与常量池

作者:admin 发布时间:2019-05-14 20:11:59 浏览次数:174
打印 收藏 关闭
字体【
视力保护色

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

作者:黄小斜

文章来历: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位主动拆箱和装箱的意思便是,核算数值时,integer会主动转为int进行核算。而当int传入类型为integer的引证时,int数值又会被包装为integer。
//8位byte bx = Byte.MAX_VALUE;byte bn = Byte.MIN_VALUE;//16位short sx = Short.MAX_VALUE;short sn = Short.MIN_VALUE;//32位int ix = Integer.MAX_VALUE;int in = Integer.MIN_VALUE;//64位long 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位char 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的 == 判别是会回来false的。 Integer a1彩票365专业数据平台-Java根底2:根本数据类型与常量池 = 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; //彩票365专业数据平台-Java根底2:根本数据类型与常量池byte都是持平的,由于规模就在-128到127之间 System.out.println(b1 == b2); System.out.println(b3 == b4); // Long c1 = 128L; Long c2 = 128L; Long c3 = -128L; Long 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 彩票365专业数据平台-Java根底2:根本数据类型与常量池= 128; short ss = 128; long 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办四大名楼法仍是会先去查询常量池中是否有现已存在,假如存在,则回来常量池中的引证,这一点与之前没有差异,差异在于,假如在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引证。

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

版权所有:洛阳市建设工程咨询有限责任公司 联系人:李经理 电话: 地址:洛阳市洛龙区开元大道219号2幢1-2522、2501、2502、2503、2504、2505室
版权所有 彩票365专业数据平台 皖ICP备140131167号-9