陈卫东 2025-11-02 00:24:55
每经编辑|陈小历
当地时间2025-11-02,gfyuweutrbhedguifhkstebtj,美女色色奖励
Java基(ji)础——挖(wa)一挖(wa)valueOf与(yu)parseXXX,类型转换(huan)的那些事(shi)儿(上(shang))
在Java这(zhe)片广(guang)袤的编(bian)程(cheng)大陆上(shang),数据类(lei)型的(de)转换就(jiu)像(xiang)是连(lian)接(jie)不(bu)同领(ling)土的桥(qiao)梁,而我(wo)们今(jin)天(tian)要(yao)探(tan)讨(tao)的valueOf和(he)parseXXX方(fang)法,无疑(yi)是这(zhe)座桥(qiao)梁上(shang)最常(chang)用的几对“车轮(lun)”。它(ta)们看似(shi)简单(dan),实则蕴(yun)含着不(bu)少细节,足(zu)以让新手(shou)们挠头,甚至(zhi)一些经(jing)验丰富(fu)的开发(fa)者(zhe)也会在不经(jing)意间踩坑。
今天(tian),就让(rang)我们以“王(wang)木茶(cha)”博(bo)客的(de)风格,用(yong)一种(zhong)轻松(song)、深入的(de)方(fang)式(shi),一(yi)起“挖(wa)一挖(wa)”这些(xie)方法(fa)背后的(de)故(gu)事,让它们在你的(de)代码中(zhong),闪耀(yao)出(chu)智(zhi)慧的(de)光芒(mang)。
valueOf的“变形(xing)记(ji)”——从对(dui)象到(dao)字(zi)符串的(de)优雅转(zhuan)身(shen)
让我(wo)们(men)聚焦(jiao)在(zai)valueOf()方法家族(zu)。这(zhe)个方法(fa)最常见的(de)身影(ying),出现(xian)在(zai)各种包装类(lei)(如(ru)Integer,Double,Boolean等(deng))中,它(ta)的核心使命是将(jiang)其他(ta)类(lei)型的(de)数据(ju)“变形”成对(dui)应的(de)包装(zhuang)类对(dui)象。这(zhe)就(jiu)像(xiang)一位(wei)多才多(duo)艺的魔(mo)术师,能(neng)够将各种(zhong)“原材料(liao)”变成(cheng)自(zi)己想(xiang)要的金(jin)币。
1.整(zheng)数(shu)的“金库”:Integer.valueOf(inti)vsnewInteger(inti)
在Java5之(zhi)前(qian),如(ru)果你(ni)想(xiang)创建一个Integer对(dui)象,通(tong)常(chang)会使用(yong)newInteger(10)。这听起来(lai)没(mei)毛病,就是创(chuang)建一个新的对(dui)象嘛。但从Java5开始,自动(dong)装箱(Autoboxing)和自动拆(chai)箱(Unboxing)的引入,让(rang)Integer.valueOf(10)成(cheng)了更受青睐的选择(ze)。
这背(bei)后(hou)藏(cang)着一(yi)个重(zhong)要(yao)的(de)优(you)化(hua)策略(lve):缓存。Integer.valueOf(inti)在处(chu)理[-128,127]范(fan)围(wei)内(nei)的整(zheng)数(shu)时,会从(cong)一个内置的缓存池(chi)中返回对象。这意味着,如果你(ni)频繁(fan)地创(chuang)建(jian)这(zhe)个范围内(nei)的Integer对(dui)象(xiang),JVM会(hui)复用已有(you)的对(dui)象,大(da)大节(jie)省(sheng)了(le)内存和(he)对(dui)象(xiang)创建的(de)开销(xiao)。
而newInteger(10)则永远(yuan)会创建一(yi)个新的(de)对(dui)象(xiang),即(ji)使(shi)值(zhi)相同(tong)。
想象一下,你在(zai)做一个计算器(qi)应用(yong),需要(yao)处理(li)大量的(de)10以内的加(jia)减乘(cheng)除,如果(guo)每次都newInteger(),那(na)效率(lv)可(ke)想(xiang)而知。而(er)valueOf()则(ze)像一个精(jing)明的管家(jia),知道哪些(xie)“常(chang)用物(wu)品(pin)”可以(yi)直接(jie)拿出来,不(bu)必每(mei)次(ci)都去“定(ding)制”。
2.字(zi)符串的“化(hua)身”:String.valueOf(Objectobj)
valueOf()的另(ling)一(yi)大(da)用途,是(shi)将(jiang)各(ge)种类(lei)型(xing)的对(dui)象(xiang)转(zhuan)换成字(zi)符串(chuan)。这比(bi)直接调(diao)用(yong)toString()方法更加(jia)安全,也更(geng)加(jia)通用。
String.valueOf(inti):将一个整数(shu)转换(huan)成它(ta)的字符串(chuan)表示(shi),例如String.valueOf(123)得(de)到"123"。String.valueOf(doubled):将一(yi)个浮(fu)点(dian)数(shu)转换(huan)成字符串(chuan),例如(ru)String.valueOf(3.14)得到(dao)"3.14"。
String.valueOf(booleanb):将一个布尔值转换成字(zi)符串(chuan),true变(bian)成"true",false变成"false"。String.valueOf(Objectobj):这是最通用的(de)形(xing)式。如(ru)果obj为(wei)null,它(ta)会(hui)返(fan)回字符(fu)串"null",而不(bu)会(hui)抛(pao)出NullPointerException。
而(er)如果直(zhi)接调用(yong)obj.toString(),当obj为(wei)null时,就(jiu)会崩溃(kui)。
这(zhe)就像(xiang)给各(ge)种(zhong)东西(xi)提供了一个统一(yi)的“翻(fan)译器(qi)”,无论它是什么(me),都能(neng)“说(shuo)”出(chu)自己(ji)的(de)字(zi)符串(chuan)版本,而且特别(bie)“体贴”,知(zhi)道如何处理“哑(ya)巴”(null)。
3.valueOf()与toString():细(xi)微(wei)处(chu)的智(zhi)慧
我(wo)们常(chang)常(chang)在(zai)字符(fu)串和包装类(lei)之间转(zhuan)换(huan),比如Strings="123";inti=Integer.parseInt(s);。但(dan)反过来,当(dang)我们(men)需要(yao)将(jiang)一(yi)个基(ji)本类(lei)型或(huo)对象(xiang)转换成字(zi)符串(chuan)时(shi),String.valueOf()和对象自身的toString()方法(fa)就(jiu)可能同时出现。
String.valueOf(obj):这种(zhong)方(fang)式(shi)更倾(qing)向于(yu)“安全地”获(huo)取对象的字符串表(biao)示。如(ru)前(qian)所述,它(ta)能很(hen)好地(di)处理(li)null值(zhi)。obj.toString():这种(zhong)方(fang)式则(ze)依赖(lai)于对象(xiang)本(ben)身是(shi)否(fou)正确地(di)重写了(le)toString()方(fang)法。如(ru)果obj是(shi)null,直接调(diao)用toString()会(hui)报(bao)NullPointerException。
所以,如果(guo)你不确定(ding)一个(ge)对象(xiang)是(shi)否(fou)可能(neng)为(wei)null,或者(zhe)只是想(xiang)简单地获取它(ta)的字符(fu)串(chuan)形式,String.valueOf()是更稳妥的选(xuan)择(ze)。反(fan)之,如(ru)果你(ni)确(que)信对象不为(wei)null,并且想调用(yong)它自(zi)定(ding)义(yi)的字符(fu)串(chuan)表示,那么(me)toString()会更直接。
“王木茶(cha)”小结(jie):valueOf()方(fang)法(fa)就像(xiang)一个(ge)多功(gong)能的(de)“包装(zhuang)器(qi)”,它能够(gou)将(jiang)基本(ben)类(lei)型(xing)、包装类对(dui)象,甚(shen)至(zhi)null,都“打(da)包”成我们(men)熟悉的(de)字(zi)符串(chuan),或(huo)者(zhe)将基本类(lei)型(xing)“升(sheng)级”为(wei)它(ta)们的包装(zhuang)类对象(xiang)。尤其是在(zai)涉及(ji)对(dui)象(xiang)创(chuang)建和null处(chu)理(li)时(shi),valueOf()展现出(chu)了(le)它的优雅和实(shi)用。
下一(yi)part,我(wo)们将(jiang)迎(ying)来另一位重量级(ji)选手——parseXXX(),它(ta)们(men)又将带(dai)来怎样(yang)精彩的“表(biao)演(yan)”呢(ne)?敬请期待(dai)!
Java基(ji)础(chu)——挖(wa)一(yi)挖valueOf与parseXXX,类型转换的那些事(shi)儿(下(xia))
承(cheng)接(jie)上文(wen),我们(men)已经领略(lve)了valueOf()的风采(cai),它在将各种(zhong)数(shu)据“包(bao)装”成字符串或(huo)包(bao)装类对(dui)象方(fang)面,表现得(de)游刃(ren)有余。在数(shu)据(ju)转(zhuan)换的(de)战场上,还(hai)有另一(yi)批身手(shou)不凡(fan)的(de)战士——parseXXX()方(fang)法。它们专注于(yu)一个更具(ju)挑(tiao)战性(xing)的(de)任务(wu):从(cong)字(zi)符串(chuan)中“提取”出(chu)有用(yong)的数值(zhi)信(xin)息(xi),并(bing)将(jiang)其“还原”成基本数据类(lei)型。
这(zhe)就像从一(yi)堆杂乱的包装(zhuang)纸(zhi)中,精确地找(zhao)出需要的那颗糖果。
1.parseXXX()家族(zu)的“解(jie)析器”:从字符串(chuan)到基本类型(xing)的(de)硬(ying)核(he)转换(huan)
parseXXX()方法(fa)主要(yao)存在于包(bao)装类(lei)中(zhong),它(ta)们的(de)核心功能(neng)是将一个(ge)表示特定数值的字(zi)符(fu)串(chuan),解析(xi)成对应(ying)的(de)基本数据(ju)类型(xing)。
Integer.parseInt(Strings):这是最常(chang)用的一个,将一(yi)个包(bao)含整(zheng)数的字符(fu)串(chuan),如"123",转换成(cheng)int类(lei)型的数值(zhi)123。Double.parseDouble(Strings):类似于parseInt,但(dan)用(yong)于(yu)解析(xi)包(bao)含(han)浮(fu)点数的(de)字(zi)符(fu)串,如"3.14",转换(huan)成double类(lei)型(xing)的(de)3.14。
Boolean.parseBoolean(Strings):将(jiang)字(zi)符串(chuan)解(jie)析(xi)成布(bu)尔值。值得注(zhu)意(yi)的是(shi),只(zhi)有当字(zi)符串(chuan)不区分大(da)小(xiao)写(xie)等于(yu)"true"时,才(cai)返回true,否则(包括(kuo)null、空字(zi)符(fu)串(chuan)或其(qi)他任(ren)何内容(rong)),都(dou)返(fan)回false。这一点(dian)与(yu)Boolean.valueOf()略有(you)不同。
2.parseXXX()与valueOf():选(xuan)择(ze)的(de)艺(yi)术(shu)
既然我们(men)已经知道(dao)了(le)valueOf()可以用(yong)来创(chuang)建(jian)包装类对象(xiang),那为(wei)什么还需要parseXXX()来(lai)获(huo)取(qu)基本(ben)类型(xing)呢(ne)?这(zhe)涉及(ji)到(dao)我(wo)们实际编程中的需求(qiu)。
parseXXX():它(ta)的目(mu)标是(shi)获(huo)取(qu)基本(ben)数据(ju)类(lei)型(xing)。例如(ru),你(ni)有一个(ge)字符(fu)串(chuan)"100",你(ni)需要(yao)把(ba)它当作一个(ge)int来进行数学(xue)计(ji)算,那么Integer.parseInt("100")就是你(ni)的首选(xuan)。它直接返(fan)回(hui)int类型的值(zhi),无需额外(wai)的拆(chai)箱操作。Integer.valueOf(Strings):这个(ge)方(fang)法(fa)最终也(ye)会返(fan)回(hui)一(yi)个(ge)Integer对(dui)象。
虽(sui)然在(zai)自(zi)动装箱(xiang)的时(shi)代,Integeri=Integer.valueOf("100");和inti=Integer.parseInt("100");在很(hen)多场(chang)景下(xia)表(biao)现相(xiang)似(因(yin)为(wei)JVM会自(zi)动拆箱(xiang)),但它们(men)的(de)意(yi)图是(shi)不(bu)同(tong)的。valueOf()更(geng)侧重(zhong)于获取一(yi)个包(bao)装类(lei)的实例,并(bing)且如(ru)前所(suo)述,它可能(neng)利用缓存来复(fu)用(yong)对象。
“坑”在哪(na)里?——NumberFormatException的阴(yin)影(ying)
在使用parseXXX()方法时(shi),最需(xu)要警(jing)惕(ti)的就是NumberFormatException。当你(ni)试图(tu)将一(yi)个不符(fu)合(he)规(gui)范(fan)的字符(fu)串传(chuan)递(di)给这些(xie)方(fang)法时(shi),它就会毫不(bu)犹(you)豫(yu)地抛(pao)出这(zhe)个(ge)异常。
Integer.parseInt("abc")会(hui)抛出异(yi)常。Double.parseDouble("1.2.3")也会抛出异常。Integer.parseInt("")(空(kong)字(zi)符(fu)串)会(hui)抛出异(yi)常(chang)。
如何(he)安全(quan)地(di)解(jie)析?——try-catch是(shi)你的好朋友
面(mian)对NumberFormatException,最(zui)常见的解(jie)决方(fang)案就是使(shi)用try-catch块来捕获异(yi)常,并进行相应(ying)的处理。
StringstrNum="12a";intnum;try{num=Integer.parseInt(strNum);//解析成(cheng)功,进行(xing)后(hou)续操作System.out.println("解析成(cheng)功:"+num);}catch(NumberFormatExceptione){//解(jie)析失败(bai),处理(li)错(cuo)误情(qing)况(kuang)System.out.println("字符串(chuan)'"+strNum+"'无法解析为整(zheng)数。
这(zhe)样(yang),即(ji)使输(shu)入的数(shu)据(ju)格式(shi)不(bu)正确(que),你的(de)程序也不(bu)会崩溃(kui),而(er)是(shi)能够优雅地(di)处理(li)这种情(qing)况(kuang)。
3.valueOf()和(he)parseXXX()的选择(ze)指(zhi)南(nan)
当你(ni)需要一个基本(ben)数据类型(int,double,boolean等(deng))用(yong)于计算(suan)或(huo)直接(jie)操作(zuo)时:优先使用parseXXX()方法(fa),例如Integer.parseInt(),Double.parseDouble(),Boolean.parseBoolean()。
当你需(xu)要一个包(bao)装类对(dui)象(xiang)(Integer,Double,Boolean等)时(shi):可以(yi)使用valueOf()方法,例如(ru)Integer.valueOf(),Double.valueOf(),Boolean.valueOf()。值(zhi)得(de)注意(yi)的是,valueOf()在处理[-128,127]的(de)Integer时(shi)有缓存(cun)优化(hua),而在处理String参数(shu)时,它(ta)也会(hui)进行(xing)解(jie)析(xi),并(bing)且(qie)在内(nei)部实现(xian)上(shang),Integer.valueOf(String)可能(neng)就是(shi)调用Integer.parseInt(String)再进(jin)行装箱。
当(dang)你需(xu)要将(jiang)各种(zhong)数据(ju)转换(huan)为(wei)字符(fu)串时:String.valueOf()是(shi)你(ni)的(de)不(bu)二(er)之选,特别是当(dang)你(ni)不(bu)确定对象(xiang)是(shi)否(fou)为(wei)null时。处理可能(neng)出错(cuo)的(de)字(zi)符串转换(huan)时:无论使(shi)用parseXXX()还是valueOf(String),都(dou)应该考虑使(shi)用(yong)try-catch来(lai)捕获(huo)NumberFormatException。
“王(wang)木茶”的叮嘱:字(zi)符串(chuan)与基(ji)本数据类型之(zhi)间的(de)转换(huan),看似是Java中最基础(chu)的操作,却(que)隐(yin)藏着不(bu)少细(xi)节(jie)。valueOf()和parseXXX(),就(jiu)像硬(ying)币的(de)两(liang)面(mian),一面用于(yu)“包装”,一(yi)面用于(yu)“解析”。理解它们(men)各自的(de)使(shi)命,并(bing)掌握(wo)在不(bu)同(tong)场景下的(de)选择策(ce)略(lve),尤其是(shi)对(dui)异(yi)常的处理(li),将极(ji)大(da)地(di)提升(sheng)你编(bian)写Java代(dai)码的健壮(zhuang)性和效率。
希(xi)望(wang)今天的“深(shen)挖”,能(neng)让你(ni)对(dui)这(zhe)些方(fang)法有更(geng)清晰(xi)的(de)认识(shi),告(gao)别(bie)那些(xie)不(bu)必要(yao)的(de)困惑(huo),让你的代码之路,更(geng)加顺(shun)畅!
2025-11-02,丝瓜视频社区,挪威主权财富基金因以色列投资成为大选焦点
1.拉片互磨剪刀腿好舒服,卧龙电驱赴港IPO:防爆电机龙头的进击与隐忧m任务远调,重仓中国资产,高瓴持股大曝光
图片来源:每经记者 陈康
摄
2.成品大香伊煮蕉国色成品小辣椒+水野朝阳水龙头,幸福蓝海2025年半年报:归母净利润863万元 同比扭亏为盈
3.caopor女+pans视频最新2025,陈果解析“A股市场”:当前市场与2014年和2015年有所不同 券商将稳健增长
美女被爆 免费网站+污软件网站鉴黄师,广东兄妹敲钟身家涨近200亿元!
原神同人本子-原神同人本子最新版
封面图片来源:图片来源:每经记者 名称 摄
如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。
读者热线:4008890008
特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系我们要求撤下您的作品。
欢迎关注每日经济新闻APP