新聞中心
概述
java 中有很多,新手經(jīng)常遇到的陷阱,本文主要包含

專業(yè)從事網(wǎng)站制作、成都網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),小程序定制開(kāi)發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5建站+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè)公司,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
- 自動(dòng)裝箱與拆箱
- 不可變的String
- 內(nèi)存泄漏
- 自增類型使用
- 使用 “==”進(jìn)行對(duì)象比較
- double 類型計(jì)算
不可變的String
Java String類是不可變的(不可修改)。這是因?yàn)镾tring對(duì)象被緩存在String池中。字符串引用的對(duì)象可以更改,但字符串對(duì)象本身不能更改。
字符串是不可變的。一旦創(chuàng)建了字符串,以后將無(wú)法更改該字符串對(duì)象。
Java使用按值傳遞,而不是按引用傳遞。當(dāng)您在方法中為分配新值時(shí),它只會(huì)修改本地,而不是調(diào)用代碼中的原始s
自動(dòng)裝箱與拆箱
裝箱就是自動(dòng)將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型;
拆箱就是自動(dòng)將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型。
裝箱拆箱的類型有哪些?
通過(guò)上圖,可以看出,java 基本類型可以進(jìn)行拆裝箱。
那拆裝箱會(huì)出現(xiàn)什么問(wèn)題呢?
通過(guò)實(shí)例,上面兩個(gè)程序,計(jì)算耗時(shí)相差近10倍,在大量存在裝箱行為時(shí),會(huì)導(dǎo)致程序性能低下。
當(dāng)封裝類型進(jìn)行==、+、-、*、/計(jì)算時(shí),會(huì)自動(dòng)拆箱,對(duì)基礎(chǔ)數(shù)據(jù)類型進(jìn)行運(yùn)算.所以在進(jìn)行計(jì)算時(shí),使用基本數(shù)據(jù)類型。
內(nèi)存泄漏
Java的核心優(yōu)勢(shì)之一是 Java垃圾收集器,它可以管理堆上的對(duì)象內(nèi)存。每當(dāng)對(duì)象不可訪問(wèn)時(shí),它將自動(dòng)釋放。
但是,對(duì)于新手和有經(jīng)驗(yàn)的程序員而言,常見(jiàn)的錯(cuò)誤是通過(guò)允許不再使用的對(duì)象可訪問(wèn)來(lái)防止釋放內(nèi)存。這可能對(duì)項(xiàng)目造成很大的不利影響,因?yàn)閮?nèi)存泄漏會(huì)阻塞資源并降低應(yīng)用程序性能。它甚至可能導(dǎo)致java.lang.OutOfMemoryError。
常見(jiàn)的情況是:
- 靜態(tài)字段聲明。靜態(tài)字段,并在不再需要其數(shù)據(jù)后忘記將其設(shè)置為null
- 未正常關(guān)閉流。 Java虛擬機(jī)為每個(gè)打開(kāi)的連接分配內(nèi)存。忘記關(guān)閉連接會(huì)消耗內(nèi)存。這樣的連接可以是:輸入流,數(shù)據(jù)庫(kù)連接,會(huì)話等。
- finalize() 方法。當(dāng)我們覆蓋的finalize()方法,finalize()只會(huì)在對(duì)象內(nèi)存回收前被調(diào)用一次,具有不確定行,只保證方法會(huì)調(diào)用,但不保證方法里的任務(wù)會(huì)被執(zhí)行完。所以盡量避免使用。在Java 9 中,已經(jīng)聲明為過(guò)期函數(shù),
自增類型使用
Java中運(yùn)算符的計(jì)算順序是在同等級(jí)下從左到右計(jì)算,看下自增情況
第一種情況的執(zhí)行上下文如下:
1.存儲(chǔ)操作數(shù)的先前值。
2.增加值。
3.返回上一個(gè)值
第二種情況的執(zhí)行上下文如下:
1.增加值。
2.存儲(chǔ)操作數(shù)的值(遞增)
3.返回值
使用 “==”進(jìn)行對(duì)象比較
許多新手程序員嘗試使用“ ==”運(yùn)算符比較對(duì)象,并且當(dāng)代碼的行為不符合預(yù)期時(shí),就會(huì)感到困惑。需要注意的是,關(guān)系運(yùn)算符“ ==”正在進(jìn)行引用比較,它檢查兩個(gè)對(duì)象是否都指向內(nèi)存中的相同位置。使用 .equals()方法將消除此問(wèn)題,因?yàn)樗鼤?huì)比較對(duì)象內(nèi)部的值。
盡管有時(shí)“ ==”運(yùn)算符會(huì)給出預(yù)期的答案:
這是什么原因呢?同樣是字符串,創(chuàng)建的方式不同,差距咋這么大呢
Java語(yǔ)言規(guī)范的字符串文字中:同一包中不同類內(nèi)的文字字符串表示對(duì)同一String 對(duì)象的引用
如果還不清楚那看下兩種字符串創(chuàng)建過(guò)程
第一種new的方式
new一個(gè)字符串時(shí),做了兩件事。首先在堆中生成了該字符串對(duì)象,然后去看常量池中有沒(méi)有該字符串,如果有就不管了,沒(méi)有就往常量池中添加一個(gè)
第二種,直接賦值
這樣創(chuàng)建字符串,首先會(huì)去常量池里找有沒(méi)有這個(gè)字符串,有就直接指向常量池的該字符串,沒(méi)有就先往常量池中添加一個(gè),再指向它。
上面就是兩種方式的對(duì)比情況了。
兩個(gè)Integer 對(duì)比
那為什么100的時(shí)候就是相等200就不行了呢這是由于Integer 使用了緩存。
其static塊中就一次性生成了-128到127直接的Integer類型變量存儲(chǔ)在cache[]中,對(duì)于-128到127之間的int類型,返回的都是同一個(gè)Integer類型對(duì)象。
整個(gè)工作過(guò)程就是:Integer.class在裝載(Java虛擬機(jī)啟動(dòng))時(shí),其內(nèi)部類型IntegerCache的static塊即開(kāi)始執(zhí)行,實(shí)例化并暫存數(shù)值在-128到127之間的Integer類型對(duì)象。
當(dāng)自動(dòng)裝箱int型值在-128到127之間時(shí),即直接返回IntegerCache中暫存的Integer類型對(duì)象。
為什么Java這么設(shè)計(jì)?應(yīng)該是出于效率考慮,因?yàn)樽詣?dòng)裝箱經(jīng)常遇到,尤其是小數(shù)值的自動(dòng)裝箱;而如果每次自動(dòng)裝箱都觸發(fā)new,在堆中分配內(nèi)存,就太耗時(shí)了;
其它幾種基本類型包裝類,也進(jìn)行了緩存
Double 類型計(jì)算
Java中的double和float在內(nèi)部表示為二進(jìn)制分?jǐn)?shù),因此在表示十進(jìn)制分?jǐn)?shù)時(shí)可能不夠精確(IEEE標(biāo)準(zhǔn)754)。十進(jìn)制數(shù)計(jì)算需要精度,需要使用java.math.BigDecimal
總結(jié)
Java 中還有很多小陷阱,如果你有可以寫出來(lái)吆。
本文標(biāo)題:Java中常見(jiàn)的幾個(gè)陷阱,你沒(méi)有遇到幾個(gè)?
地址分享:http://m.fisionsoft.com.cn/article/djhiisj.html


咨詢
建站咨詢
