怎么回事这,JDK么有问题的新闻报道,怎么会报错啊~~Integer转换int,这无奈了 求大神解答啊~~

第一次测试_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第一次测试
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢类型不匹配:不能从 Integer 转换为 int
作者:用户
浏览:766 次
类型不匹配:不能从Integer转换为int&%//隐式对象,系统对象jsp简化程序员的工作,已经建好的对象//servletContext对象netapplication//当前在线人数int
类型不匹配:不能从 Integer 转换为 int
//隐式对象,系统对象 jsp简化程序员的工作,已经建好的对象
//servletContext对象
net application
//当前在线人数
int num = (Integer)application.getAttribute("usernum");
application.setAttribute("usernum",new Integer(num));
int num = ((Integer)application.getAttribute("usernum")).intValue();
解决方案二:
application.getAttribute("usernum")..intValue();
或者用 Integer 而不是 int 接收。
解决方案三:
Integer 和 int 是不同的,前者的type 是 object,后者是primitive (基本类型)。
这两者是没有隐式类型转换的
Integer to int, 用xxx.intValue()
解决方案四:
类型 ServletContext 中的方法 setAttribute(String, Object)对于参数(String, int)不
package com.
import javax.servlet.ServletContextE
public class ApplicationListener implements javax.servlet.ServletContextListener{
public void contextDestroyed(ServletContextEvent arg0) {
// TODO 自动生成方法存根
System.out.println("contextDestroyed");
// application start
public void contextInitialized(ServletContextEvent arg0) {
// TODO 自动生成方法存根
System.out.println("contextInitialized");
arg0.getServletContext().setAttribute("usernum",0 );
【云栖快讯】新年大招!云栖社区为在读大学生/研究生准备了一份学(huan)习(zhuang)攻略,发布博文即有机会赢得iPad mini 4等大奖,学习换装两不误!欢迎报名参与~&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供下次自动登录
现在的位置:
& 综合 & 正文
C# 之 int 挑战 Java 之 Integer
扩充阅读之
C#之int挑战Java之Integer
此文是我为本人拙著《.NET 4.0面向对象编程漫谈》所新写的扩充阅读材料。
本文涉及到一些JVM原理和Java的字节码指令,推荐感兴趣的读者阅读一本有关JVM的经典书籍《深入Java虚拟机(第2版)》,将它与我在中介绍的CLR原理与IL汇编指令作个对比,相信读者会有一定的启发。而仔细对比两个类似事物的异同,是很有效的学习方法之一。
今后我还将在个人博客上放出其他的文章,希望能帮助书的读者开拓视野,启发思考,大家一起探讨技术的奥秘。
本文所述之内容仅代表个人之理解,任何疏漏及错误请直接回贴指出。
===============================================================================
1 奇特的程序输出
前段时间,一个学生给我看了一段“非常诡异”的Java代码:
public class TestInteger {
public static void main(String[] args){
Integer v1=100;
Integer v2=100;
System.out.println(v1==v2);
//输出:true
Integer w1=200;
Integer w2=200;
System.out.println(w1==w2);
//输出:false
让这个学生最困惑的是,为什么这些如此相似的代码会有这样令人意外的输出?
我平时多使用C#,Java用得不多,初看到这段代码的输出,我也同样非常奇怪:怎么会这样呢?100和200这两个整型数值对Integer这个类有本质上的差别吗?
为了弄明白出现上述现象的底层原因,我使用javap工具反汇编了Java编译器生成的.class文件:
通过仔细阅读Java编译器生的字节码,我发现以下给Integer变量赋值的语句:
Integer v1=100;
实际上调用的是Integer.valueOf方法。
而完成两个Integer变量比较的以下语句:
System.Console.WriteLine(v1 == v2);
实际生成的是if_acmpne指令。其中的a代表“address”,cmp代表“Compare”,ne代表“not equal”。
这条指令的含义是:比较Java方法栈中的两个操作数(即v1与v2),看看它们是不是指向堆中的同一个对象。
当给v1和v2赋值100时,它们将引用同一个Integer对象。
那为什么当值改为200时,v1和v2就“翻脸了”,分别引用不同的Integer对象?
秘密就在于Integer.valueOf方法。幸运的是,Java的类库是开源的,所以我们可以毫不费力地看到相关的源代码:
public static Integer valueOf(int i) {
if(i &= -128 && i &= IntegerCache.high)
return IntegerCache.cache[i + 128];
return new Integer(i);
一切真相大白,原来Integer在内部使用了一个私有的静态类IntegerCache,此类内部封装了一个Integer对象的cache数组来缓存Integer对象,其代码如下:
private static class IntegerCache {
static final Integer cache[];
再仔细看看IntegerCache内部的代码,会看到它使用静态初始化块在cache数组中保存了[-128,127]区间内的一共256个Integer对象。
当给Integer变量直接赋整数值时,如果这个数值位于[-128,127]内,JVM(Java Virtual Machine)就直接使用cache中缓存的Integer对象,否则,JVM会重新创建一个Integer对象。
一切真相大白。
2 进一步探索Integer
我们再进一步地看看这个有趣的Integer:
Integer v1=500;
Integer v2=300;
Integer addResult=v1+v2;
//结果:800
double divResult=(double)v1/v2;
//结果:1.6667
哟,居然Integer对象支持加减乘除运算耶!它是怎么做到的?
再次使用javap反汇编.class文件,不难发现:
Integer类的内部有一个私有int类型的字段value,它代表了Integer对象所“封装”的整数值。
当需要执行v1+v2时,JVM会调用v1和v2两个Integer对象的intValue方法取出其内部所封装的整数值value,然后调用JVM直接支持的iadd指令将这两个整数直接相加,结果送回方法栈中,然后调用Integer.valueOf方法转换为Integer对象,让addResult变量引用这一对象。
除法则复杂一点,JVM先调用i2d指令将int转换为double,然后再调用ddiv指令完成浮点数相除的工作。
通过上述分析,我们可以知道,其实Integer类本身并不支持加减乘除,而是由Java编译器将这些加减乘除的语句转换为JVM可以直接执行的字节码指令(比如本例中用到的iadd和ddiv),其中会添加许多条用于类型转换的语句。
由此可见,与原始数据类型int相比,使用Integer对象直接进行加减乘除会带来较低的运行性能,应避免使用。
3 JDK中Integer类的“弯弯绕”设计方案
现在,我们站在一个更高的角度,探讨一下Integer的设计。
我个人认为,给Integer类型添加一个“对象缓冲”不是一个好的设计,从最前面的示例代码大家一定会感到这一设计给应用层的代码带来了一定的混乱。另外,我们看到JDK设计者只缓存了[-128,127]共256个Integer对象,他可能认为这个区间内的整数是最常用的,所以应该缓存以提升性能。就我来看,这未免有点过于“自以为是”了,说这个区间内的Integer对象用得最多有什么依据?对于那些经常处理&128的整数值的应用程序而言,这个缓存一点用处也没有,是个累赘。就算真要缓存,那也最好由应用程序开发者自己来实现,因为他可以依据自己开发的实际情况缓存真正用到的对象,而不需背着这个包容着256个Integer对象的大包袱。
而且前面也看到了,基于Integer对象的加减乘除会增加许多不必要的类型转换指令,远不如直接使用原始数据类型更快
【上篇】【下篇】博客分类:
Java的Byte都是有符号的(singed),而Byte又是8位的,如何转为无符号( unsigned)的呢?
a= (singed : -42
、 unsigned :214)
方法一:直接转-- (int)a (失败)
(转换,牵涉到符号位的扩展。因为扩展前符号位是1,所以扩展后,高位都是1)
( - 42 )
原码--- 补码 转换
各位取反,在加1,转换成 原码
(符号) 负
(取反) 00
(加1 ) 00
方法二:通过IO流 (成功)
我常用IO流来进行一些 进制的转换 。
O(∩_∩)O~
import java.io.ByteArrayInputS
public class Test{
public static void main(String[] args) {
byte[] bytes =
new byte[]{(byte)-42};
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
int result = in.read();
System.out.println("无符号数: \t"+result);
System.out.println("2进制bit位: \t"+Integer.toBinaryString(result));
2进制bit位:
方法三:当然是看看 ByteArrayInputStream 的源码了。
ByteArrayInputStream的read源码:
public synchronized int read() {
return (pos & count) ? (buf[pos++] & 0xff) : -1;
原来是 & 运算呀!!!
修改IO的方式的写法:
public class Test{
public static void main(String[] args) {
byte bytes = -42;
int result = bytes&0
System.out.println("无符号数: \t"+result);
System.out.println("2进制bit位: \t"+Integer.toBinaryString(result));
稍微解释一下:
(byte) -42
STEP01:(byte)-42
进行扩展:
STEP02:与运算:
( 0xff 也是 0x000000ff)
10110 (即是整数214)
之所以会弄这个古怪的的问题,是因为我想得到中文字符串的byte流的二进制形式。想窥探一下不同的编码集的异同。
记录一下:
读JDK源码,很有收获!!
浏览 28783
用的着这么麻烦么?举个例子:240 肯定超过java里 byte的范围了吧?先把240转成16进制 然后付给byte就行了么240的16进制是F0;byte a = (byte)0xF0;这样的结果是 -16 。我的意思将 byte形的 -16 转成 无符号的 240.PS: 我是经过推理验证,最后找的这个方法;int a = -16 &0
xiaolongfeixiang
浏览: 184520 次
来自: 西安
我也试了修改tomcat配置的方法,还是不行
如果方法入参只有一个数组参数,编译器可能会将数组参数理解为可变 ...
shiznet 写道singlePad 写道引用It is n ...
singlePad 写道引用It is not appropr ...
不错的分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'怎么回事这,JDK么有问题,怎么会报错啊~~Integer转换int,这无奈了 求大神解答啊~~_百度知道
怎么回事这,JDK么有问题,怎么会报错啊~~Integer转换int,这无奈了 求大神解答啊~~
我有更好的答案
不用转,直接用即。
采纳率:58%
来自团队:
为您推荐:
其他类似问题
jdk的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 有问题的新闻报道 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信