仓酷云

标题: JAVA网页设计深切分析Java中的装箱和拆箱仓酷云 [打印本页]

作者: 精灵巫婆    时间: 2015-1-18 11:17
标题: JAVA网页设计深切分析Java中的装箱和拆箱仓酷云
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。

一.甚么是装箱?甚么是拆箱?

  在后面的文章中提到,Java为每种基础数据范例都供应了对应的包装器范例,至于为何会为每种基础数据范例供应包装器范例在此不举行论述,有乐趣的伴侣能够查阅相干材料。在JavaSE5之前,假如要天生一个数值为10的Integer对象,必需如许举行:
1
Integeri=newInteger(10);

  而在从JavaSE5入手下手就供应了主动装箱的特征,假如要天生一个数值为10的Integer对象,只必要如许就能够了:
1
Integeri=10;

  这个过程当中会主动依据数值创立对应的Integer对象,这就是装箱。
  那甚么是拆箱呢?望文生义,跟装箱对应,就是主动将包装器范例转换为基础数据范例:
1
2
Integeri=10;//装箱
intn=i;//拆箱

  复杂一点说,装箱就是主动将基础数据范例转换为包装器范例;拆箱就是主动将包装器范例转换为基础数据范例。
  下表是基础数据范例对应的包装器范例:
int(4字节)Integerbyte(1字节)Byteshort(2字节)Shortlong(8字节)Longfloat(4字节)Floatdouble(8字节)Doublechar(2字节)Characterboolean(不决)Boolean二.装箱和拆箱是怎样完成的

  上一大节懂得装箱的基础观点以后,这一大节来懂得一下装箱和拆箱是怎样完成的。
  我们就以Interger类为例,上面看一段代码:
1
2
3
4
5
6
7
publicclassMain{
publicstaticvoidmain(String[]args){
Integeri=10;
intn=i;
}
}

  反编译class文件以后失掉以下内容:
  
JAVA网页设计深切分析Java中的装箱和拆箱仓酷云
登录/注册后可看大图

  从反编译失掉的字节码内容能够看出,在装箱的时分主动挪用的是Integer的valueOf(int)办法。而在拆箱的时分主动挪用的是Integer的intValue办法。
  其他的也相似,好比Double、Character,不信任的伴侣能够本人手动实验一下。
  因而能够用一句话总结装箱和拆箱的完成历程:
  装箱历程是经由过程挪用包装器的valueOf办法完成的,而拆箱历程是经由过程挪用包装器的xxxValue办法完成的。(xxx代表对应的基础数据范例)。
三.口试中相干的成绩

  固然年夜多半人对装箱和拆箱的观点都分明,可是在口试和口试中碰到了与装箱和拆箱的成绩却纷歧定会答得下去。上面枚举一些罕见的与装箱/拆箱有关的口试题。
1.上面这段代码的输入了局是甚么?
1
2
3
4
5
6
7
8
9
10
11
12
publicclassMain{
publicstaticvoidmain(String[]args){
Integeri1=100;
Integeri2=100;
Integeri3=200;
Integeri4=200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}

  大概有些伴侣会说城市输入false,大概也有伴侣会说城市输入true。可是现实上输入了局是:
JAVA网页设计深切分析Java中的装箱和拆箱仓酷云
登录/注册后可看大图
  1. truefalse
复制代码
  为何会呈现如许的了局?输入了局标明i1和i2指向的是统一个对象,而i3和i4指向的是分歧的对象。此时只需一看源码便知事实,上面这段代码是Integer的valueOf办法的详细完成:
[attach]291981[/attach]
  1. publicstaticIntegervalueOf(inti){if(i>=-128&&i<=IntegerCache.high)returnIntegerCache.cache[i+128];elsereturnnewInteger(i);}
复制代码
  而个中IntegerCache类的完成为:
[attach]291981[/attach]
JAVA网页设计深切分析Java中的装箱和拆箱仓酷云
登录/注册后可看大图
  1. privatestaticclassIntegerCache{staticfinalinthigh;staticfinalIntegercache[];static{finalintlow=-128;//highvaluemaybeconfiguredbypropertyinth=127;if(integerCacheHighPropValue!=null){//UseLong.decodeheretoavoidinvokingmethodsthat//requireIntegersautoboxingcachetobeinitializedinti=Long.decode(integerCacheHighPropValue).intValue();i=Math.max(i,127);//MaximumarraysizeisInteger.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE--low);}high=h;cache=newInteger[(high-low)+1];intj=low;for(intk=0;k<cache.length;k++)cache[k]=newInteger(j++);}privateIntegerCache(){}}
复制代码

  从这2段代码能够看出,在经由过程valueOf办法创立Integer对象的时分,假如数值在[-128,127]之间,便前往指向IntegerCache.cache中已存在的对象的援用;不然创立一个新的Integer对象。
  下面的代码中i1和i2的数值为100,因而会间接从cache中取已存在的对象,以是i1和i2指向的是统一个对象,而i3和i4则是分离指向分歧的对象。
2.上面这段代码的输入了局是甚么?
<p>1
2
3
4
5
6
7
8
9
10
11
12
publicclassMain{
publicstaticvoidmain(String[]args){
Doublei1=100.0;
Doublei2=100.0;
Doublei3=200.0;
<p>
作者: 谁可相欹    时间: 2015-1-20 19:18
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 小女巫    时间: 2015-1-24 11:40
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 不帅    时间: 2015-1-24 13:59
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 柔情似水    时间: 2015-1-26 13:42
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 若相依    时间: 2015-2-4 14:45
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 仓酷云    时间: 2015-2-7 02:08
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 飘灵儿    时间: 2015-2-19 15:53
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 活着的死人    时间: 2015-2-21 21:37
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 小魔女    时间: 2015-3-4 10:54
是一种语言,用以产生「小应用程序(Applet(s))
作者: 分手快乐    时间: 2015-3-5 23:10
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 小妖女    时间: 2015-3-7 02:51
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 愤怒的大鸟    时间: 2015-3-13 06:11
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 简单生活    时间: 2015-3-20 14:53
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2