一本正經的聊數據結構(6):最優二叉樹 —— 哈夫曼樹_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

前文傳送門:

「一本正經的聊數據結構(1):時間複雜度」

「一本正經的聊數據結構(2):數組與向量」

「一本正經的聊數據結構(3):棧和隊列」

「一本正經的聊數據結構(4):樹」

「一本正經的聊數據結構(5):二叉樹的存儲結構與遍歷」

基礎知識

感謝某位在後台留言的同學,讓我想起來我還有這個沒寫完的系列。

在最開始,先了解幾個基礎概念:

  • 路徑:在一棵樹中,一個結點到另一個結點之間的通路,稱為路徑。

上面這個二叉樹中,根節點 A 到恭弘=叶 恭弘子結點 I 的路徑,就是A,B,D,I。

  • 路徑長度:在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數為1層,那麼從根結點到第 i 層結點的路徑長度為 i – 1 。

在這個二叉樹中,根節點 A 到恭弘=叶 恭弘子結點 H 的路徑長度就是 3 。

  • 結點的權:給每一個結點賦予一個數值,被稱為這個結點的權。
  • 結點的帶權路徑長度:指的是從根結點到該結點之間的路徑長度與該結點的權的乘積。

我們假設節點 H 的權是 5 ,從根結點到結點 H 的路徑長度是 3 ,那麼結點 H 的帶權路徑長度是 3 X 5 = 15。

  • 樹的帶權路徑長度:在一棵樹中,所有恭弘=叶 恭弘子結點的帶權路徑長度之和,被稱為樹的帶權路徑長度,也被簡稱為 「WPL」 。

還是這顆樹,它的帶權路徑長度是 1 X 2 + 2 X 1 + 2 X 3 + 2 X 4 + 3 X 5 + 3 X 6 = 51 。

哈夫曼樹

哈弗曼樹就是在用 n 個結點(都做恭弘=叶 恭弘子結點且都有各自的權值)試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為「最優二叉樹」,有時也叫「哈夫曼樹」或者「赫夫曼樹」。

在構建哈弗曼樹時,要使樹的帶權路徑長度最小,只需要遵循一個原則,那就是:權重越大的結點離樹根越近。

需要注意的是,同樣恭弘=叶 恭弘子結點所構成的哈夫曼樹可能不止一顆,在同一層,左右恭弘=叶 恭弘子節點交換位置,樹的帶權路徑長度是一樣的,就比如下面這兩個哈夫曼樹:

哈弗曼樹的構建過程

那麼如何構建一個哈夫曼樹呢?我們這裏舉個例子,比如我們有這麼幾個恭弘=叶 恭弘子節點:3,4,7,9,13,15,17:

第一步:選出兩個最小的權值,對應的兩個結點組成一個新的二叉樹,且新二叉樹的根結點的權值為左右孩子權值的和:

第二步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列,也就是從隊列中刪除 3 和 4 ,插入 7 ,並且仍然保持隊列的升序:

第三步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步其實是在重複上一步操作,當前隊列中最小的節點是 7 和 7 ,生成新的父結點權值是 7 + 7 = 14 :

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

第四步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

這一步依然是在重複,從隊列中刪除 7 和 7 ,加入 14 ,並且仍然保持隊列的升序:

第五步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步還是重複操作。當前隊列中權值最小的結點是 9 和 14 ,生成新的父結點權值是 9 + 14 = 23 :

第六步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

這一步依然是在重複,從隊列中刪除 9 和 14 ,加入 23 ,並且仍然保持隊列的升序:

第七步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步從隊列中選擇權值最小的結點是 13 和 15 ,生成新的父結點權值是 13 + 15 = 28 :

第八步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

從隊列中刪除 13 和 15 ,加入 28 ,並且仍然保持隊列的升序:

第九步:選擇當前權值最小的兩個結點,生成新的父結點。

這一步從隊列中選擇權值最小的結點是 17 和 23 ,生成新的父結點權值是 17 + 23 = 40 :

第十步:從隊列中移除上一步選擇的兩個最小結點,把新的父節點加入隊列。

從隊列中刪除 17 和 23 ,加入 40 ,並且仍然保持隊列的升序:

第十一步:選擇當前權值最小的兩個結點,生成新的父結點,移除隊列中的最後兩個節點(懶得畫了,最後兩步並一步)。

這一步從隊列中選擇權值最小的結點是 28 和 40 ,生成新的父結點權值是 28 + 40 = 68 :

此時,我們得到的這棵樹就是哈弗曼樹。

哈夫曼樹就介紹到這裏,下一節,將會介紹哈夫曼樹的用途:哈夫曼編碼。

參考

http://c.biancheng.net/view/3398.html

https://baijiahao.baidu.com/s?id=1663514710675419737&wfr=spider&for=pc

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

手持10萬元 到底現在購車還是過年前購車優惠多?_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

99萬)錢,再怎麼說跟4s優惠硬是差了1萬塊,也特別不想分期供車覺得錢被銀行賺了,所以想着年底把年終獎拿到了手后再買,但很怕過年時購車大軍會把優惠壓沒了,所以現在特別糾結。觀點分析:金九銀十除了描述房價之外,對於汽車同樣適用。

前言

2016年過去大半,還有兩個月,就要迎來全新的2017年,很多還沒有買車的朋友,肯定會在這段時間糾結一件事:究竟是趁着現在優惠更多把車買了練手幾個月等過年呢,亦或是等着11月廣州車展上市有更多可選新車?

觀點一:據說11月新上市車更多

黃小姐近期一直很想買一台代步小車,年頭的時候其實已經相中了豐田致炫,覺得空間夠用也容易好開,當時因為忙所以剛好沒空去跑4s。今年7月份以來居然收到了致炫出了新車的消息。跟她年頭一起買車的朋友都在後悔不已:早知道新致炫帶了CVT就等等再買啦,現在剛買的車就變老車了好失望,因為這點,黃小姐現在很糾結,想再多等等持幣觀望。

觀點分析:其實一般車企對新車更新速度都保持在1-2年左右,所以不必太過擔心“剛買的車又變舊了”。加之目前很多車企都用家族化前臉設計,所以即使半年度/年度小改款,車子外觀差異也並不明顯。像黃小姐的致炫改款情況,一般很少發生。

致炫改款前後外觀差距不大,單就一項變速箱從4AT變成CVT已經讓很多已購買老款的車主後悔不已。

觀點二:想等年終獎預算更多買好車

小李是公司業務員,每天都要來回跑不少地方,所以想買一台省油耐用有面子的車,於是想買新邁騰,想買的330tsi豪華型的配置(官方報價23.49萬)但僅有330tsi舒適型(官方報價20.99萬)錢,再怎麼說跟4s優惠硬是差了1萬塊,也特別不想分期供車覺得錢被銀行賺了,所以想着年底把年終獎拿到了手后再買,

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

但很怕過年時購車大軍會把優惠壓沒了,所以現在特別糾結。

觀點分析:金九銀十除了描述房價之外,對於汽車同樣適用。目前10月份正是優惠的大好時機,如果有像小李這樣的購車朋友,建議選用分期或是問朋友借些錢購車,畢竟很多4s店會聯手銀行減免分期利息,最多交些手續費就能把車開走,早用早享受不好嗎?還有消息指出,購置稅減半將在2016年12月31日結束,如果你意向車型是1.6升及以下排量車型,這些優惠就沒了哦。

2017款邁騰外觀好看,其實舒適型和豪華型價差2.5萬配置還是差距甚大的,這從內飾上就能看出端倪。

觀點三:手上有錢近期優惠大

陳先生存了大半年,加上前幾年存下來的錢,手上已經積攢了快10萬元,近期一直在看各種車型優惠,曾經對比過5月初的優惠,已經很值得入手了,可是一轉念想着金九銀十是熱銷月份,車企會不會在冷門月份例如12月份、1月份做優惠呢?所以陳先生現在特別糾結。

觀點分析:汽車銷售其實熱門促銷時比冷門促銷時車型更多,優惠也更大,大家都知道旺季是那個時候,所以那幾個月的銷量任務也會更重,甚至有4s會為了旺季臨時加緊和二手車商合作推出快速置換車計劃,也會在熱銷幾個月多招臨時促銷員,熱銷期的店內活動也會更多更火爆,所有的一切,都證明旺季有更豐富的資源,所以你能獲得的也會更多。

買車總之一句話,別糾結別猶豫,看中了就趕緊下手,早買早享受!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

恢復古城風貌 傳承傳統文化_租車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

本報石家莊1月8日電  (記者張志鋒)“登得上城樓,望得見古塔,記得住鄉愁。”新年伊始,河北正定東城門、府文廟、府城隍廟和正定博物館正式開放。歷時三年,正定縣24項古城風貌恢復提升工程全部完成。據了解,2019年正定縣旅遊接待預計突破1471萬人次,同比增長逾16.7%。

正定是國家歷史文化名城,有1600多年的建城史,縣城有“九樓四塔八大寺,二十四座金牌坊”,全縣有全國重點文物保護單位9處、河北省文物保護單位6處,各類館藏文物7672件。2017年1月,當地啟動24項古城風貌恢復提升工程。

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

提升工程主要包括:修復加固南城門系統和南部城牆5800米;在北城門建成遺址公園,修建東城門主城及瓮城,恢復護城河;原址復建“鎮府巨觀”陽和樓,展示正定傳統文化等。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

7-8萬市區行車最實用的合資車型 性價比真不低!_潭子電動車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

pOLO的外觀圓潤飽滿,看起來比較中規中矩,符合大眾的中庸式的設計風格,適合成熟的消費者。內飾也依然很大眾風,簡單實用,缺乏新意,容易審美疲勞。pOLO的動力系統種類繁多,發動機為1。4L 90馬力 L4、1。6L 110馬力 L4和1。

雖然國人都是很喜歡大的車子,但是也不能忽略一個客觀的事實,那就是城市越來越擁堵了,在這環境下開一個大的車子確實很不方便。但是這時候如果有一台靈活的小車,那麼在市區開起來就輕鬆多了。

長安福特-嘉年華

福特嘉年華兩廂車的車身尺寸為3970*1722*1470mm,三廂的為4320*1722*1470mm,軸距都為2495mm,定位小型車。嘉年華的前臉採取了福特家族式設計特徵-馬丁臉的設計,再配合炯炯有神的前大燈組,使得嘉年華看起來動感十足。

嘉年華的動力系統為1.5L 110馬力+5擋手動/6擋雙離合,1.0T 125馬力+6擋雙離合。我在路上基本沒有見過三廂的嘉年華,不過我們也真的不推薦三廂版的車型,看起來真的是好難看。反之兩廂版的看起來則協調很多。

嘉年華的這款1.0T的發動機為三缸發動機,曾經榮獲2015年1.0L以下組的年度國際最佳發動機,擁有缸內直噴、渦輪增壓、可變氣門正時三大技術,燃油經濟性很好,同時平順性和普通的4缸發動機一樣,一般人很難覺察出來這是一款3缸發動機。但是,這麼先進的一款發動機,配合6擋雙離合算是有點失敗了,如果不是特別喜歡,

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

盡量不推薦購買雙離合版本的車型。

上汽大眾-pOLO

大眾pOLO的車身尺寸為3970*1682*1462mm、3975*1682*1487mm、3987*1705*1486mm,軸距2470mm。車身尺寸幾乎和嘉年華完全一樣。pOLO的外觀圓潤飽滿,看起來比較中規中矩,符合大眾的中庸式的設計風格,適合成熟的消費者。

內飾也依然很大眾風,簡單實用,缺乏新意,容易審美疲勞。pOLO的動力系統種類繁多,發動機為1.4L 90馬力 L4、1.6L 110馬力 L4和1.4T 150馬力 L4,匹配5擋手動、6擋自動、6擋手自一體和7擋雙離合四款變速箱。雖然大眾曾經被雙離合折磨的夠嗆,但是就現在來看,大眾目前的雙離合和同級別比起來,還是比較好用的。但是然並卵,買pOLO的幾乎都是自吸版本的,1.4T車型幾乎無人問津,畢竟老百姓家用車,還是自吸最省心、省錢。

廣汽豐田-YARiS L 致炫

致炫的車身尺寸為4115*1700*1485mm、4160*1700*1485mm,軸距為2550mm。雖然都是小型兩廂車,但是致炫的長度要大於嘉年華和pOLO,較大的軸距加上日系車的偷空間技術,所以致炫的後排空間是最大的,甚至可以和緊湊型轎車媲美。

致炫的動力系統為1.3L 99馬力/1.5L 107馬力+5擋手動/4擋自動/CVT。其中4AT車型為停產在售狀態,因為前段時間新款致炫上市,用CVT取代了老舊的4AT,同時新款的致炫標配了CVT變速箱,無論在燃油的經濟性和平順性都會有提高。新款致炫空間大,配置不低,皮實耐操,省油省心,也是一款不錯的家庭代步車。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

6萬起月銷過1.5萬輛的大氣家轎 性價比高到離譜!_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

m的峰值扭矩,1。5L的自然吸氣發動機搭配着CVT以及傳統的手動變速箱。艾瑞澤5的全系定價在5。89-9。79萬元之間,跨度不可為不大,新上市車型並不是傳說中搭載了奇瑞最新的渦輪增壓發動機的動力總成車型,依舊是現款艾瑞澤5的動力配置,只是在細分的配置下新增了這款名為“領跑版”定位中高級配置的車。

艾瑞澤5

要說最近火的一塌糊塗的轎車,除了奔馳的豪華中型車全新E級之外,最熱門的或許就是自主品牌的奇瑞艾瑞澤5了,上個月銷量也接近1.5萬台,10月15日,新的艾瑞澤5又迎來上市,這次儘管沒有出現傳說中的1.5T,但是產品線更豐富的艾瑞澤5該如何選擇,或許又會變成消費者心中的難題,小編這次就來分析分析,這台小車該如何選擇。

先簡單說說艾瑞澤5的身份,艾瑞澤5的外觀設計原創程度非常高,畢竟是作為純正向研發的產品之一,艾瑞澤5的設計並沒有什麼明顯的借鑒風格,這一點是值得觀眾朋友點贊的地方,自主品牌開始擺脫仿製,正向研發的車型代表了中國品牌的汽車正在逐漸成長。

前臉貫穿式的鍍鉻裝飾條簡潔明快而且辨識度極高,整車的線條描繪也非常緊湊,沒有拖泥帶水的設計感,車尾層次感也十分豐富,這也讓艾瑞澤5的外觀顯得簡約而不簡單,相反多了一種精緻感。

往期的艾瑞澤5是以紅色為主打顏色,充滿活力的鮮紅色符合當下年輕購車群體充滿朝氣的形象。新的領跑版上市增加了一款名為“鎏光橙”的配色,同樣是暖色的色調,

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

可以看出艾瑞澤5的目標消費人群指向性很明顯——就是年輕的家用車潛在買家。

內飾的設計也是非常具有活力和運動感,中控按鍵布局非常清晰,在行車過程中的使用具有較為良好的溝通感,座椅的包裹性尚可,但是坐墊較硬,承托性較為欠缺。不過作為一款十萬元以內的轎車,如此的內飾設計當屬難能可貴。

空間布局還算合理,車身尺寸為4572*1825*1482(mm);軸距達到了2670mm,已經達到了主流的緊湊型轎車應有的水準,後排空間實用性尚可,而且車身設計中規中矩,並沒有犧牲多少在後排的頭部空間。一般的家用需求得以很好的滿足。

動力總成並沒有進行更換,發動機的賬面參數是116ps的最大馬力,141N.m的峰值扭矩,1.5L的自然吸氣發動機搭配着CVT以及傳統的手動變速箱。

艾瑞澤5的全系定價在5.89-9.79萬元之間,跨度不可為不大,新上市車型並不是傳說中搭載了奇瑞最新的渦輪增壓發動機的動力總成車型,依舊是現款艾瑞澤5的動力配置,只是在細分的配置下新增了這款名為“領跑版”定位中高級配置的車。

以自動擋車型為例,在領跑版本出來之前,領銳版和領臻版的差價達到了1萬元人民幣,分別為7.79萬和8.79萬,這跨度對於一款主打性價比的車型來說著實大了一些。

編輯總結:如今的領跑版上市定價為8.29萬,無疑增加了此款車的性價比。所以小編主推的細分配置是新上市的CVT領跑版,相較於領銳版加價五千,增加了胎壓監測裝置,中控大屏的GpS導航以及增加了更新的智能互聯繫統,這些配置原來只有在8.79萬元的次頂配中搭載。儘管有人說艾瑞澤5的CVT變速箱調校得過於慵懶,但是作為一台十萬元以內,售價只在七八萬元左右的經濟型家轎來說,艾瑞澤5目前的配置和定價都算是比較親民而且高性價比的存在。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

免費音樂素材庫 UseMySound,各種免授權商用隨你下載_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

網路的發達促進自媒體時代的到來,個人拍攝影片、錄製 Podcast 的門檻降低,人人都能是內容創作者,精心拍攝的影像畫面加上動聽的音樂可以從視覺與聽覺兩方面引人入勝,可是音樂素材的收集對一般大眾來說實在不容易啊!這回要為大家推薦一個免費音樂素材庫 UseMySound,好多音樂素材隨你用。

免費音樂素材庫 UseMySound,各種免授權商用隨你下載

想要找音效配在影片或鋪墊在 Podcast 背景中,讓內容更精彩,可是想要找到好音樂又不是那麼容易,實在叫人愁白了頭。UseMySound  免費音樂素材庫裡面所提供的各種音效包含背景音樂,種類相當繁多,正面輕鬆、動感搖擺,各種曲風應有盡有,最棒的是全都提供 CC0 授權,不管要用在影片、遊戲、廣告、Podcast 或是任何地方都能 100% 免費商用。
【前往 UseMySound 網站,點這裡】

有別於很多網站都會要求註冊登入,UseMySound 完全不需要上面這些程序就能直接試聽與下載,非常方便。每個音樂後面都會標註曲風,想要試聽音效只需點擊音效名稱前的播放圖示就可直接聆聽,喜歡想要下載則點選曲風後面的下載按鈕即可。該網站所下載的音效皆提供 MP3 格式,讓你在做後製合成時可直接使用。

當然,這個網站雖然是免費,但如果你覺得創作者的作品很棒,也可以點選後面的咖啡杯圖樣,以實際的金錢來贊助創作者,每杯咖啡 3 美元,以此為單位自己增加。另外,倘若你也想要讓自己創作的音效能夠供其他人免費下載使用,還可以將自己點選網頁右上角的「Support Project」來與網站方聯繫,將自己的音樂捐贈出來,造福它人。

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

【JVM】如何理解強引用、軟引用、弱引用、虛引用?_潭子電動車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

整體架構

強引用

強引用是默認支持,當內存不足的時候,JVM開始垃圾回收,對於強引用的對象,就算是出現了OOM也不會回收對象。

強引用是最常見的普通對象引用,只要還有強引用指向對象,對象就存活,垃圾回收器不會處理存活對象。一般把一個對象賦給一個引用變量,這個引用變量就是強引用。當一個對象被強引用變量所引用,它就處於可達狀態,是不會被垃圾回收的,即使之後都不會再用到了,也不會回收。因此強引用是造成Java內存泄漏的主要原因之一

關於Java內存泄漏的詳細內容,可以參考這篇博客:https://blog.csdn.net/m0_38110132/article/details/81986334。

對於一個普通對象,如果沒有其他引用關係,只要超過了引用的作用域或者顯式地將相應的強引用賦值為null,一般認為就是可以被垃圾回收了。(具體的回收時機看垃圾回收策略)

下例中,b就是強引用。

1     public static void main(String[] args) {
2         Object a = new Object();
3         Object b = a;
4         a = null;
5         System.out.println(b);//java.lang.Object@4554617c
6     }

軟引用

軟引用是一種相對強引用弱化了一些的引用,用java.lang.ref.SoftReference實現,可以讓對象豁免一些垃圾收集。當系統內存充足的時候,不會被回收;當系統內存不足的時候,會被回收。

軟引用一般用於對內存敏感的程序中,比如高速緩存。

 1 import java.lang.ref.SoftReference;
 2 
 3 public class SoftReferenceDemo {
 4     public static void main(String[] args) {
 5         Object a = new Object();
 6         SoftReference<Object> softReference = new SoftReference<>(a);//軟引用
 7         //a和軟引用指向同一個對象
 8         System.out.println(a);//java.lang.Object@4554617c
 9         System.out.println(softReference.get());//java.lang.Object@4554617c
10 
11         //內存夠用,軟引用不會被回收
12         a = null;
13         System.gc();//內存夠用不會自動gc,手動喚醒gc
14         System.out.println(a);//null
15         System.out.println(softReference.get());//java.lang.Object@4554617c
16 
17         //內存不夠用時
18         try{
19             //配置Xms和Xmx為5MB
20             byte[] bytes = new byte[1024*1024*30];//設置30MB超內存
21         }catch (Throwable e){
22             e.printStackTrace();
23         }finally {
24             System.out.println(a);//null
25             System.out.println(softReference.get());//null
26         }
27     }
28 }

使用場景

一個應用需要讀取大量的本地圖片,如果每次讀取都從硬盤讀取會嚴重影響性能,如果一次性全部加載到內存,內存可能會溢出。

可以使用軟引用解決這個問題,使用一個HashMap來保存圖片路徑和圖片對象管理的軟引用之間的映射關係,內存不足時,JVM會自動回收緩存圖片對象的佔用空間,有效地避免了OOM(Out Of Memory)問題。

Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>

弱引用

弱引用需要用java.lang.ref.WeakReference實現,它比軟引用的生存期更短,對於弱引用的對象來說,只要垃圾回收機制一運行,不管JVM的內存空間是否夠,都會回收該對象的佔用內存。

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

 1 import java.lang.ref.WeakReference;
 2 
 3 public class SoftReferenceDemo {
 4     public static void main(String[] args) {
 5         Object a = new Object();
 6         WeakReference<Object> softReference = new WeakReference<>(a);//軟引用
 7         //a和弱引用指向同一個對象
 8         System.out.println(a);//java.lang.Object@4554617c
 9         System.out.println(softReference.get());//java.lang.Object@4554617c
10 
11         //內存夠用,弱引用也會被回收
12         a = null;
13         System.gc();//內存夠用不會自動gc,手動喚醒gc
14         System.out.println(a);//null
15         System.out.println(softReference.get());//null
16     }
17 }

關於WeakHashMap

 1     public static void weakHashMapTest() {
 2         Integer key = new Integer(1);
 3         String value = "李四";
 4         Map<Integer,String> weakHashMap = new WeakHashMap();
 5         weakHashMap.put(key, value);
 6         System.out.println(weakHashMap);//{1=李四}
 7         key = null;
 8         System.gc();
 9         System.out.println(weakHashMap);//{}
10     }
11 
12     public static void hashMapTest() {
13         HashMap<Integer,String> map = new HashMap<>();
14         Integer key = 1;
15         String value = "張三";
16         map.put(key,value);
17         System.out.println(map);//{1=張三}
18         key = null;
19         System.gc();
20         System.out.println(map);//{1=張三}
21     }

在HashMap中,鍵被置為null,喚醒gc后,不會垃圾回收鍵為null的鍵值對。但是在WeakHashMap中,鍵被置為null,喚醒gc后,鍵為null的鍵值對會被回收。

虛引用

虛引用要通過java.lang.ref.PhantomReference類來實現,虛引用不會決定對象的生命周期,如果一個對象只有虛引用,就相當於沒有引用,在任何時候都可能會被垃圾回收器回收。它不能單獨使用也不能訪問對象,虛引用必須和引用隊列聯合使用

虛引用的主要作用是跟蹤對象被垃圾回收的狀態,僅僅是提供一種確保對象被finalize以後,做某些事情的機制。

PhantomReference的get方法總是返回null,因此無法訪問對應的引用對象,設置虛引用關聯唯一的目的是在對象被收集器回收的時候收到一個系統通知,或者後續添加進一步的處理。Java允許使用finalize()方法在垃圾回收器將對象從內存中清理出去之前做一些必要的清理工作。【例如實現一個監控對象的通知機制】

引用隊列

WeakReference和ReferenceQueue的聯合使用效果:

 1     public static void weakReferenceTest() {
 2         Object a = new Object();
 3         ReferenceQueue<Object> queue = new ReferenceQueue<>();
 4         WeakReference<Object> weakReference = new WeakReference<>(a,queue);
 5         System.out.println(a);//java.lang.Object@4554617c
 6         System.out.println(weakReference.get());//java.lang.Object@4554617c
 7         System.out.println(queue.poll());//null
 8         System.out.println("-------------------");
 9         a = null;
10         System.gc();
11         System.out.println(a);//null
12         System.out.println(weakReference.get());//null
13         //虛引用在回收之前被加入到了引用隊列中
14         System.out.println(queue.poll());//java.lang.ref.WeakReference@74a14482
15     }

PhantomReference和ReferenceQueue的聯合使用效果:

 1     public static void phantomReferenceTest() {
 2         Object a = new Object();
 3         ReferenceQueue<Object> queue = new ReferenceQueue<>();
 4         PhantomReference<Object> phantomReference = new PhantomReference<>(a,queue);
 5         System.out.println(a);//java.lang.Object@4554617c
 6         System.out.println(phantomReference.get());//null
 7         System.out.println(queue.poll());//null
 8         System.out.println("-------------------");
 9         a = null;
10         System.gc();
11         System.out.println(a);//null
12         System.out.println(phantomReference.get());//null
13         //引用在回收之前被加入到了引用隊列中
14         System.out.println(queue.poll());//java.lang.ref.WeakReference@74a14482
15     }

總結

強引用:不回收。

軟引用:內存不夠就回收。

弱引用:一定回收。

虛引用:一定回收,get出來就是null,引用形同虛設,主要和引用隊列聯合使用,在finalize之前會被放到引用隊列中。

與根對象沒有引用關係的:引用不可達,一定回收。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

生態環境部環評司有關負責人就《經濟、技術政策生態環境影響分析技術指南(試行)》有關問題答記者問_租車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

2020-11-10 來源:生態環境部

2020-11-10
來源:生態環境部 分享到:
[打印]
字號:[大] [中] [小]   生態環境部近日印發了《 經濟、技術政策生態環境影響分析技術指南》(試行)(以下簡稱《指南》)。針對《指南》的出台背景、主要內容、實施重點等問題,生態環境部環評司有關負責人回答了記者的提問。
  問:《指南》發布的背景和意義是什麼?   答:《指南》是貫徹落實《中華人民共和國環境保護法》的重要舉措。《環境保護法》第十四條規定“國務院有關部門和省、自治區、直轄市人民政府組織制定經濟、技術政策,應當充分考慮對環境的影響,聽取有關方面和專家的意見”。為貫徹落實上述規定,“十三五”以來,我部組織環境工程評估中心、環境與經濟政策研究中心、清華大學、北京師範大學等單位,針對區域、產業和城鎮化等領域的典型政策開展了環境評價研究,同時借鑒美國、加拿大、英國、歐盟、世界銀行和相關國際組織制定的政策(戰略)環境評價技術指南等,探索形成了適用於政策生態環境影響分析的技術方法、內容框架和成果要求,在此基礎上編製形成《指南》,可以為經濟、技術政策的制定者在分析政策的生態環境影響方面提供參考。
  問:《指南》的定位是什麼?   答:《指南》是推動政策制定過程中充分考慮生態環境影響的技術指引文件。《指南》列舉了適用的政策類型,提出了一般性分析程序和技術路線,提供了推薦性指標體系和技術方法,政策制定部門在開展環境影響分析工作過程中可根據實際情況增補或調整指標體系,選擇或創新技術方法。
  問:政策生態環境影響分析的作用是什麼?   答:經濟、技術政策關係到一個國家、地區或部門長期發展前景,影響涉及時間跨度大,空間範圍廣,影響類型多樣,政策執行過程中不確定性因素多,可能會對生態環境造成潛在的重大影響。《指南》從環境質量、生態保護、資源消耗、應對氣候變化等四個方面構建了較為全面的指標體系,政策制定部門可通過全面梳理重點識別,判斷政策是否存在重大不利生態環境影響。針對具有潛在重大不利生態環境影響的政策內容,分析其影響範圍和程度,預警可能引發的生態環境風險,通過優化政策內容、完善保障措施和制度,從源頭降低生態環境影響,防控生態環境風險。針對促進生態環境保護、改善環境質量的政策內容,通過提高保障措施和制度的有效性,推動政策落地實施。
  問:政策生態環境影響分析是否涉及新增行政程序?   答:根據《環境保護法》第十四條“國務院有關部門和省、自治區、直轄市人民政府組織制定經濟、技術政策,應當充分考慮對環境的影響”的規定,《重大行政決策程序暫行條例》縣級以上地方人民政府在制(修)定相關政策時應在決策啟動階段開展環境影響和環境效益等分析預測的要求,

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

政策制定主體應將生態環境影響分析工作融入政策制定過程。本《指南》僅提供技術指引,不增加行政程序。
  問:《指南》包括哪些主要內容?   答:《指南》包括七部分內容。一是確定經濟、技術政策生態環境影響分析的適用範圍;二是確定政策生態環境影響分析的工作流程;三是提出政策分析內容及步驟,即政策要素解析,相關政策回顧性分析,政策與黨中央、國務院相關決策部署的符合性分析等;四是提出“初步識別”的內容及推薦方法,建議從環境質量、生態保護、資源消耗、應對氣候變化四個方面梳理政策生態環境影響,推薦採用快速、定性分析方法識別政策是否存在重大生態環境影響;五是提出“影響分析”的內容及推薦方法。推薦採用列表法分析政策直接、間接及累積性生態環境影響的範圍和程度,結合不確定性分析預測存在的生態環境風險;六是提出保障措施及制度分析的內容和步驟;七是明確結論與建議。
  問:《指南》推薦採用哪些技術方法?   答:經濟、技術政策生態環境影響範圍廣,影響產生的邏輯鏈條長,執行過程中不確定性因素多,難以定量分析。同時,一些政策出台的周期短、時效性強,需儘快判斷其可能造成的生態環境影響或風險,為政策制定和實施提供支撐和保障,因此《指南》推薦採用快速、定性方法開展生態環境影響分析。在生態環境影響初步識別階段,結合推薦性指標體系採用矩陣分析、檢查表、專家分析等方法,判斷政策是否存在重大不利生態環境影響。在環境影響分析階段,結合政策產生生態環境影響的作用方式和受影響區域特點,採用列表法分析政策對各受影響區域的直接、間接、累積性影響及生態環境風險。鑒於政策生態環境影響分析尚無普遍實踐,開展工作過程中可根據政策類型、政策內容和管理需求合理選擇或創新政策生態環境影響分析技術方法。
  問:《指南》發布后將重點推動哪些後續工作?   答:一是組織開展試點研究,形成案例庫。目前政策生態環境影響分析處於初步推廣階段,下一步將選取典型省份、典型政策領域作為試點推動開展政策生態環境影響分析工作,在試點基礎上逐步完善技術方法體系,建立政策生態環境影響分析案例庫。二是持續開展專題研究,提供更為完善的技術支撐。根據政策類型及政策內容不同,產生生態環境影響的作用機制不同,影響類型和程度也存在很大差異。基於本《指南》提出的一般性程序、技術路線和推薦方法,後續將進一步組織開展專題研究,分析政策生態環境影響機制,研究制定針對不同領域和政策類型的技術路線,提出適用於各分析環節的技術方法,為推動決策機構在政策制定過程中更好考慮對生態環境影響提供技術保障。

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

POCO M3 即將在台發表:6000mAh 超大電量,規格重點搶先看!_租車

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

幾天前,我們曾報導過 POCO 台灣的官方 Facebook 粉絲專頁和官網上線的消息,這幾天 POCO 官方也開始在預告新機即將推出的消息,種種跡象也正暗示著 POCO 品牌獨立後的首款在台發表的新機,就是內建 6000mAh 超大電量的 POCO M3 。定位為中階入門的大電量手機, POCO M3 也早已在上個月就通過台灣 NCC 認證。

▲圖片來源:小米香港官網

POCO M3 即將在台發表:6000mAh 超大電量,規格重點搶先看!

隨著 POCO Taiwan 粉專和官網曝光後,最近在 POCO Taiwan 的 Facebook 粉絲專頁也開始推出問答抽獎活動,截至目前的兩題的答案都是「6000」,這數字正是 POCO M3 的電池容量。另外,這項活動只到 1 月 10 日,也代表在不久後 POCO M3 就會正式在台亮相。(更新:POCO M3 將於 1 月 21 日在台發表)

▲圖片來源:POCO Taiwan(Facebook)

其實早在去年 12 月初, POCO M3 就以型號 M2010J19CG 通過台灣 NCC 認證, POC M3 預計銷售模式將比照目前小米10T、小米10T Pro 方式,由官方授權通路進行販售。

▲圖片來源:NCC

在 NCC 認證通過的資料附件也能見到產品外觀照,確認它就是 POCO M3 :

▲圖片來源:NCC

雖然 POCO M3 只支援 18W 快速充電,不過充電器仍將標配 22.5W 快速充電器:

▲圖片來源:NCC

至於 POCO M3 的規格重點有哪些呢?目前 POCO M3 已在印度、香港等地開賣,這裡也提前為大家簡單介紹 POCO M3 的規格特色:

▲圖片來源:小米香港官網

POCO M3 產品定位為中階入門的 4G 智慧型手機,採用 6.53 吋 FHD+ 解析度的水滴全螢幕:

▲圖片來源:小米香港官網

相機方面, POCO M3 配備 4800 萬像素 AI 三鏡頭主相機,擁有 4800 萬像素 f/1.79 光圈主鏡頭、200 萬像素微距鏡頭以及 200 萬像素景深鏡頭的搭配。前相機則為 800 萬像素自拍鏡頭。

▲圖片來源:小米香港官網

硬體規格方面, POCO M3 搭載 Qualcomm Snapdragon 662 八核心處理器、配備 4GB RAM 和最高 128GB ROM :

▲圖片來源:小米香港官網

POCO M3 超大電量則是 POCO M3 的特色之一, POCO M3 內建 6000mAh 大電量電池並支持 18W 快速充電。 POCO M3 的續航換算日常使用情境,待機可達到 583 小時、通話 40 小時、音樂 196 小時、影片 17 小時。

▲圖片來源:小米香港官網

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

音效方面, POCO M3 內建雙揚聲器,並通過 Hi-Res Audio 高解析度音效認證。另外, POCO M3 仍保留 3.5mm 耳機插孔,對有線耳機需求的用戶來說更為方便:

▲圖片來源:小米香港官網

POCO M3 採用獨立三卡槽設計,可同時支持 4G+4G 雙卡雙待和 microSD 記憶卡擴充容量(最高可擴充至 512GB):

▲圖片來源:小米香港官網

POCO M3 採用側邊指紋辨識,結合於電源鍵更方便於快速解鎖:

▲圖片來源:小米香港官網

即便 POCO M3 內建 6000mAh 大電量電池,仍將重量控制在 200 克以內,機身重量為 198 克:

▲圖片來源:小米香港官網

延伸閱讀:
小米有品推出 Lydsto 手持吸塵打氣機,眾籌價約 860 元

小米11 Lite 通過 FCC 認證,相關規格提前曝光!

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

啪啪,打臉了!領導說:try-catch必須放在循環體外!_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

哈嘍,親愛的小夥伴們,技術學磊哥,進步沒得說!歡迎來到新一期的性能解讀系列,我是磊哥。

今天給大家帶來的是關於 try-catch 應該放在循環體外,還是放在循環體內的文章,我們將從性能業務場景分析這兩個方面來回答此問題。

很多人對 try-catch 有一定的誤解,比如我們經常會把它(try-catch)和“低性能”直接畫上等號,但對 try-catch 的本質(是什麼)卻缺少着最基礎的了解,因此我們也會在本篇中對 try-catch 的本質進行相關的探索

小貼士:我會盡量用代碼和評測結果來證明問題,但由於本身認知的局限,如有不當之處,請讀者朋友們在評論區指出。

性能評測

話不多說,我們直接來開始今天的測試,本文我們依舊使用 Oracle 官方提供的 JMH(Java Microbenchmark Harness,JAVA 微基準測試套件)來進行測試。

首先在 pom.xml 文件中添加 JMH 框架,配置如下:

<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core -->
<dependency>
   <groupId>org.openjdk.jmh</groupId>
   <artifactId>jmh-core</artifactId>
   <version>{version}</version>
</dependency>

完整測試代碼如下:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

/**
 * try - catch 性能測試
 */
@BenchmarkMode(Mode.AverageTime) // 測試完成時間
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) // 預熱 1 輪,每次 1s
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) // 測試 5 輪,每次 3s
@Fork(1) // fork 1 個線程
@State(Scope.Benchmark)
@Threads(100)
public class TryCatchPerformanceTest {
    private static final int forSize = 1000; // 循環次數
    public static void main(String[] args) throws RunnerException {
        // 啟動基準測試
        Options opt = new OptionsBuilder()
                .include(TryCatchPerformanceTest.class.getSimpleName()) // 要導入的測試類
                .build();
        new Runner(opt).run(); // 執行測試
    }

    @Benchmark
    public int innerForeach() {
        int count = 0;
        for (int i = 0; i < forSize; i++) {
            try {
                if (i == forSize) {
                    throw new Exception("new Exception");
                }
                count++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return count;
    }

    @Benchmark
    public int outerForeach() {
        int count = 0;
        try {
            for (int i = 0; i < forSize; i++) {
                if (i == forSize) {
                    throw new Exception("new Exception");
                }
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
}

以上代碼的測試結果為:

從以上結果可以看出,程序在循環 1000 次的情況下,單次平均執行時間為:

  • 循環內包含 try-catch 的平均執行時間是 635 納秒 ±75 納秒,也就是 635 納秒上下誤差是 75 納秒;
  • 循環外包含 try-catch 的平均執行時間是 630 納秒,上下誤差 38 納秒。

也就是說,在沒有發生異常的情況下,除去誤差值,我們得到的結論是:try-catch 無論是在 for 循環內還是 for 循環外,它們的性能相同,幾乎沒有任何差別

try-catch的本質

要理解 try-catch 的性能問題,必須從它的字節碼開始分析,只有這樣我能才能知道 try-catch 的本質到底是什麼,以及它是如何執行的。

此時我們寫一個最簡單的 try-catch 代碼:

public class AppTest {
    public static void main(String[] args) {
        try {
            int count = 0;
            throw new Exception("new Exception");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然後使用 javac 生成字節碼之後,再使用 javap -c AppTest 的命令來查看字節碼文件:

 javap -c AppTest 
警告: 二進制文件AppTest包含com.example.AppTest
Compiled from "AppTest.java"
public class com.example.AppTest {
  public com.example.AppTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0
       1: istore_1
       2: new           #2                  // class java/lang/Exception
       5: dup
       6: ldc           #3                  // String new Exception
       8: invokespecial #4                  // Method java/lang/Exception."<init>":(Ljava/lang/String;)V
      11: athrow
      12: astore_1
      13: aload_1
      14: invokevirtual #5                  // Method java/lang/Exception.printStackTrace:()V
      17: return
    Exception table:
       from    to  target type
           0    12    12   Class java/lang/Exception
}

從以上字節碼中可以看到有一個異常表:

Exception table:
       from    to  target type
          0    12    12   Class java/lang/Exception

參數說明:

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

  • from:表示 try-catch 的開始地址;
  • to:表示 try-catch 的結束地址;
  • target:表示異常的處理起始位;
  • type:表示異常類名稱。

從字節碼指令可以看出,當代碼運行時出錯時,會先判斷出錯數據是否在 fromto 的範圍內,如果是則從 target 標誌位往下執行,如果沒有出錯,直接 gotoreturn。也就是說,如果代碼不出錯的話,性能幾乎是不受影響的,和正常的代碼的執行邏輯是一樣的。

業務情況分析

雖然 try-catch 在循環體內還是循環體外的性能是類似的,但是它們所代碼的業務含義卻完全不同,例如以下代碼:

public class AppTest {
    public static void main(String[] args) {
        System.out.println("循環內的執行結果:" + innerForeach());
        System.out.println("循環外的執行結果:" + outerForeach());
    }
    
    // 方法一
    public static int innerForeach() {
        int count = 0;
        for (int i = 0; i < 6; i++) {
            try {
                if (i == 3) {
                    throw new Exception("new Exception");
                }
                count++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return count;
    }

    // 方法二
    public static int outerForeach() {
        int count = 0;
        try {
            for (int i = 0; i < 6; i++) {
                if (i == 3) {
                    throw new Exception("new Exception");
                }
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
}

以上程序的執行結果為:

java.lang.Exception: new Exception

at com.example.AppTest.innerForeach(AppTest.java:15)

at com.example.AppTest.main(AppTest.java:5)

java.lang.Exception: new Exception

at com.example.AppTest.outerForeach(AppTest.java:31)

at com.example.AppTest.main(AppTest.java:6)

循環內的執行結果:5

循環外的執行結果:3

可以看出在循環體內的 try-catch 在發生異常之後,可以繼續執行循環;而循環外的 try-catch 在發生異常之後會終止循環。

因此我們在決定 try-catch 究竟是應該放在循環內還是循環外,不取決於性能(因為性能幾乎相同),而是應該取決於具體的業務場景

例如我們需要處理一批數據,而無論這組數據中有哪一個數據有問題,都不能影響其他組的正常執行,此時我們可以把 try-catch 放置在循環體內;而當我們需要計算一組數據的合計值時,只要有一組數據有誤,我們就需要終止執行,並拋出異常,此時我們需要將 try-catch 放置在循環體外來執行。

總結

本文我們測試了 try-catch 放在循環體內和循環體外的性能,發現二者在循環很多次的情況下性能幾乎是一致的。然後我們通過字節碼分析,發現只有當發生異常時,才會對比異常表進行異常處理,而正常情況下則可以忽略 try-catch 的執行。但在循環體內還是循環體外使用 try-catch,對於程序的執行結果來說是完全不同的,因此我們應該從實際的業務出發,來決定到 try-catch 應該存放的位置,而非性能考慮

關注公眾號「Java中文社群」回復“乾貨”,獲取 50 篇原創乾貨 Top 榜

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。