日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02-第二章 基本类型

發(fā)布時(shí)間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02-第二章 基本类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

建議21:用偶判斷,不用奇判斷

? ? ?根據(jù)奇數(shù)判斷奇偶性:i%2==1 ? "奇數(shù)":"偶數(shù)"

? ? ?根據(jù)偶數(shù)判斷奇偶性:i%2==0 ? "偶數(shù)":"奇數(shù)"

?????Java中的取余(%標(biāo)示符)算法,模擬代碼如下:

? ? ?//模擬取余計(jì)算,dividend被除數(shù),divisor除數(shù)

? ? ?public static int remainder(int divident, int divisor){

? ? ? ? ?return divident - dividend / divisor * divisor;?

?????}

? ? ?所以,如果根據(jù)奇數(shù)判斷奇偶性時(shí),當(dāng)輸入為-1時(shí),計(jì)算結(jié)果為偶數(shù)。

? ? ?因此,Java在判斷奇偶性的時(shí)候要用偶判斷。

建議22:用整數(shù)類型處理貨幣

? ? ?system.out.println(10.00-9.60);

? ? ?輸出結(jié)果是:0.40000000000036

? ? ?這是因?yàn)樵谟?jì)算機(jī)中浮點(diǎn)數(shù)有可能(注意有可能)是不準(zhǔn)確的,它只是無限接近準(zhǔn)確值,而不能完全精確。為什么會(huì)如此呢?這是由浮點(diǎn)數(shù)的存儲(chǔ)規(guī)則所決定的,十進(jìn)制小數(shù)是通過“乘2取整,順序排列”法轉(zhuǎn)換成二進(jìn)制小數(shù)的。

?????0.4這個(gè)不能使用二進(jìn)制準(zhǔn)確的表示,在二進(jìn)制數(shù)世界里它是一個(gè)無限循環(huán)的小數(shù),就好比在十進(jìn)制世界里沒有辦法準(zhǔn)確表示1/3。

? ? ?解決這種問題有兩個(gè)方法:

? ? ?(1)使用BigDecimal

? ? ?(2)使用整形(例如先擴(kuò)大100倍轉(zhuǎn)變?yōu)檎?#xff0c;然后進(jìn)行運(yùn)算,然后再縮小100倍)

建議23:不要讓類型默默轉(zhuǎn)換

? ? ?pubic static final LIGHT_SPEED = 30 * 10000 * 1000;

? ? ?long dis2 =?LIGHT_SPEED * 60 * 8;

? ? ?輸出dis2的結(jié)果為-2028888064

? ? ?雖然聲明了dis2為long型,但是仍然出現(xiàn)負(fù)值是因?yàn)镴ava是先運(yùn)算然后進(jìn)行類型轉(zhuǎn)換的。所以因?yàn)槿齻€(gè)乘數(shù)都是int型,三者相乘仍然是int型,但是已經(jīng)超過int的最大值,所以就變成了負(fù)值。

? ? ?這種問題的解決辦法是將乘數(shù)轉(zhuǎn)換成long型(加一個(gè)“L”)

? ? ?long dis2 =?LIGHT_SPEED * 60L * 8;

? ? ?還沒超過int范圍的時(shí)候就已經(jīng)轉(zhuǎn)換為long型,在實(shí)際開發(fā)中,更通用的做法是主動(dòng)聲明式類型轉(zhuǎn)化(注意不是強(qiáng)制類型轉(zhuǎn)換),代碼如下:

? ? ?long dis2 = 1L * LIGHT_SPEED * 60 * 8;

? ? ?基本類型轉(zhuǎn)換時(shí),使用主動(dòng)方式減少不必要的Bug。

建議24:邊界,邊界,還是邊界

? ? ?int cur = 1000;

? ? ?int limit = 2000;

? ? ?int order = input.nextInt();

? ? ?boolean bl = (order+cur)<limit;

? ? ?其中order為客戶端輸入的值,當(dāng)order輸入2147483647時(shí),bl的值為true。

? ?? 數(shù)字越界使檢驗(yàn)條件失敗。

建議25:不要讓四舍五入虧了一方

? ? ?使用BigDecimal類,并且采購setScale方法設(shè)置精度。

? ? ?目前Java支持以下七種舍入方式:

? ? ?1)ROUND_UP:遠(yuǎn)離0方向舍入。(只要舍棄位非0即進(jìn)位)

? ? ?2)ROUND_DOWN:趨向0方向舍入。(所有的位都舍棄)

? ? ?3)ROUND_CEILING:向正無窮方向舍入。(正數(shù)類似于ROUND_UP ,負(fù)數(shù)類似ROUND_DOWN )

? ? ?4)ROUND_FLOOR:想負(fù)無窮方向舍入。(與ROUND_CEILING 相反)

? ? ?5)HALF_UP:最近數(shù)字舍入(5進(jìn))(即通常所說的四舍五入)

? ? ?6)HALF_DOWN:類似HALF_UP,但是5不進(jìn)位。

? ? ?7)HALF_EVEN:銀行家算法

? ? ? ? ? 銀行家算法規(guī)則:

? ? ? ? ? 》舍棄位的數(shù)值小于5時(shí),直接舍棄;

? ? ? ? ? 》舍棄位的數(shù)值等于6時(shí),進(jìn)位后舍去;

? ? ? ? ? 》舍棄位的數(shù)值等于5時(shí),分兩種情況:5后面還有其他數(shù)字(非零),則進(jìn)位后舍去;若5后面是0(即5是最后一個(gè)數(shù)字),則根據(jù)5前一位數(shù)的奇偶性來判斷是否需要進(jìn)位,技術(shù)進(jìn)位,偶數(shù)舍去。

? ? ?總結(jié)成一句話:四舍六入五考慮,五后非零就進(jìn)一,五后為零看奇偶,五前為偶應(yīng)舍去,五前為奇要進(jìn)一。

建議26:提防包裝類型的null值

? ? ?包裝類型參與運(yùn)算時(shí),要做null值校驗(yàn)。

建議27:謹(jǐn)慎包裝類型的大小比較

? ? ?包裝類型比較大小的時(shí)候用compareTo方法進(jìn)行比較。

? ? ?==運(yùn)算符比較的是基本類型是否相等,對(duì)于對(duì)象則是判斷的兩個(gè)對(duì)象的引用地址是否相等。

建議28:優(yōu)先使用整型池

? ? ?int ii = input.nextInt();

? ?? Integer i = ?new Integer(ii);

? ? ?Integer j = ?new Integer(ii);

? ? ?boolean a = i==j

? ? ?i=ii;

? ? ?j=ii;

? ? ?boolean b = i==j;

? ? ?i = Integer.valueOf(ii);

? ? ?j = Integer.valueOf(ii);

? ? ?boolean c = i==j;

? ? ?當(dāng)ii的輸入為127時(shí),a、b、c的值分別是:false、true、true

? ? ?當(dāng)ii的輸入為128時(shí),a、b、c的值分別是:false、false、false

(1)new產(chǎn)生包裝對(duì)象,地址不同,所以不相等。

(2)裝箱動(dòng)作是通過valueOf方法實(shí)現(xiàn)的,也就是說后兩個(gè)比較中的算法一樣。

Integer.valueOf的代碼實(shí)現(xiàn):

? ???public static Integer valueOf(int i){

? ? ? ? ?final int offset = 128;

? ? ? ? ? if(i>=-128 && i<=127){ // must cache

? ? ? ? ? ? ? ?return IntegerCache.cache[i + offset];

? ?? ?????}?

? ? ? ? ? return new Integer(i);

?????}

? ? ?說明在裝箱時(shí),如果是-128到127之間的int類型轉(zhuǎn)換為Integer對(duì)象,則直接從cache數(shù)組里獲得。

?????cache數(shù)組代碼如下:

? ? ?public static Integer cache[] = new Integer[-(-128) + 127 + 1];

? ? ?static{

? ? ? ? ?for(int i = 0; i < cache.length; i++){

? ? ? ? ? ? ? ?cache[i] = new Integer(i-128);

? ?? ?????}

?????}

? ? ?cache是IntegerCache內(nèi)部類的一個(gè)靜態(tài)數(shù)組,容納的是-128到127之間的Integer對(duì)象。通過valueOf產(chǎn)生包裝對(duì)象時(shí),若干參數(shù)在-128到127之間,則直接從整型池中獲得對(duì)象,不在該范圍內(nèi)的int類型通過new 生成包裝對(duì)象。

? ? ?通過包裝類的valueOf生成包裝實(shí)例可以顯著提高空間和時(shí)間性能。

建議29:優(yōu)先選擇基本類型

? ? ?Java5之后實(shí)現(xiàn)了包裝類型與基本類型之間的自動(dòng)轉(zhuǎn)換。但無論是從安全性、性能和穩(wěn)定性方面來說,基本類型都是首選方案。

? ? ?自動(dòng)裝箱有一個(gè)重要原則:基本類型可以先加寬,在轉(zhuǎn)變成寬類型的包裝類型,但不能直接轉(zhuǎn)變成寬類型的包裝類型。

建議30:不要隨便設(shè)置隨機(jī)種子

? ???Random random = new Random();

? ?? for(int i=1;i<4;i++){

? ? ? ? ? System.out.println("第"+i+"次:"+random.nextInt());

? ?? }

? ? ?以上程序中輸出隨機(jī)數(shù),三個(gè)隨機(jī)數(shù)都不同,而且運(yùn)行多次,每次的結(jié)果都是不同的。

? ? ?但如果把random的構(gòu)造使用隨機(jī)數(shù)種子的方法:

? ?? Random random = new Random(10000);

? ? ?則每次說出的三個(gè)都是同樣的三個(gè)隨機(jī)數(shù)。

? ? ?此時(shí)隨機(jī)數(shù)的產(chǎn)生取決于種子:

? ? ?》種子不同,產(chǎn)生的隨機(jī)數(shù)不同。

? ? ?》種子相同,即使實(shí)例不同也產(chǎn)生相同的隨機(jī)數(shù)。

?????Random類的默認(rèn)種子是System.nanoTime()的返回值(JDK1.5版本以前默認(rèn)的種子是System.currentTimeMillis()的返回值)

? ? ?因?yàn)槟J(rèn)的種子是不固定的,所以產(chǎn)生的隨機(jī)數(shù)也不同。

? ? ?因此,若非必要,不要設(shè)置隨機(jī)數(shù)種子。

?

歡迎關(guān)注公眾號(hào):

?

零點(diǎn)小時(shí)光

lingdianxiaoshiguang

總結(jié)

以上是生活随笔為你收集整理的02-第二章 基本类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。