|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说说缺点:首先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文件以后失掉以下内容:
从反编译失掉的字节码内容能够看出,在装箱的时分主动挪用的是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。可是现实上输入了局是:
为何会呈现如许的了局?输入了局标明i1和i2指向的是统一个对象,而i3和i4指向的是分歧的对象。此时只需一看源码便知事实,上面这段代码是Integer的valueOf办法的详细完成:
- publicstaticIntegervalueOf(inti){if(i>=-128&&i<=IntegerCache.high)returnIntegerCache.cache[i+128];elsereturnnewInteger(i);}
复制代码 而个中IntegerCache类的完成为:
- 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> |
|