特斯拉擠進十大最有價值汽車品牌

特斯拉(Tesla)以矽谷精神來打造汽車,一直受到持「安全第一」保守精神的傳統汽車產業攻擊,不過無可否認的,特斯拉成功在車壇打出一席之地,2016 年 6 月,行銷研究公司 WPP 與 Millward Brown 於 2016 年百大價值品牌報告中,特斯拉品牌價值達 44 億美元,超越凌志(Lexus)成為汽車品牌中第十大最有價值品牌,其中主要原因之一正是其創新精神,儘管如此,特斯拉以矽谷精神造車的品質疑慮卻也從沒停過。   特斯拉的品牌曝光率沒話說,幾乎天天都在媒體版面上,雖然不見得是因為正面的原因,如 Model 3 預購熱賣的消息佔據媒體版面,但隨之而來質疑是否能如期交貨的評論與報導也甚囂塵上。   然而,特斯拉在產業內創新並適應競爭的能力,在 WPP 與 Millward Brown 看來,是未來品牌價值的主要推動力,在兩公司進行的消費者調查中,特斯拉在品牌創新、品牌目標、品牌體驗項目超越平均值,報告中指出,特斯拉的品牌價值在近年來大幅成長,雖然特斯拉以不進行傳統廣告戰聞名,但其少量花費的行銷經費,產生的價值與效用卻相當可觀。   其他汽車品牌則大致沒有變化,豐田(Toyota)以 295 億美元守住王座,福斯(VW)則因為柴油車排放作弊事件形象大受打擊而從第二名跌落,不過旗下保時捷(Porsche)與特斯拉同樣以 44 億美元擠進前十。  
處理問題「誠意」讓人滿意   特斯拉品牌價值節節高升的同時,特斯拉品質疑慮也揮之不去,時常有車主宣稱故障,而 2016 年 4 月時特斯拉回收近 3,000 輛休旅車 Model X,主因為絞鍊故障導致車禍時第三排座椅可能會崩坍,也成為關注焦點。此外,特斯拉傳出 Model S 車主發生事故車輛損毀之後,與特斯拉交涉,最後特斯拉答應支付部分修車費用,但是卻要求車主簽下保密協定。   美國國家公路交通安全管理局(National Highway Traffic Safety Administration,NHTSA)表示這種協定可能妨礙車主向國家公路交通安全管理局回報安全問題,相當不妥,要求特斯拉不可以用保密條文限制車主,特斯拉則回應這只是在給予車主額外福利的同時,不會因此遭認定是車輛本身有安全性問題而遭遇「好心被雷親」賠償損失,並更改與車主間協定的條文。   美國國家公路交通安全管理局對更改後的條文表示滿意,並且檢查 Model S 懸吊系統後,表示沒有安全問題。   事實上 Model S 「問題發生率高於平均」早就為人詬病,不過由於特斯拉保固 8 年,加上高效率的客服,以最快速度幫助消費者解決問題,不論是馬達、差速器、剎車、資訊系統出問題,都以最不讓消費者困擾的方式盡速更換,「誠意」讓人滿意,因此雖故障率高卻還是能享有高滿意度。   但隨著品牌價值登上前十,特斯拉恐怕得更戒慎恐懼,維持得來不易的品牌價值,尤其是當空前數量的 Model 3 大量趕工出貨之後,其品質狀況如何,恐怕將會是特斯拉品牌的生死關鍵。

(首圖來源: CC BY 2.0)

(本文授權轉載自《》─〈〉)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

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

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

三星、LG未獲中國電動車用電池認證

韓國三星SDI、LG Chem兩大電池廠商申請中國電動車用鋰電池認證,但遭拒於門外,意味車用電池在中國銷售時無法獲得補貼,幾乎等同遭市場排擠。兩者均表示將在年內重提申請。

根據《東網》與《MoneyDJ》等媒體之相關報導,三星SDI、LG Chem與其他31家中國電池廠商共同向中國公信部提交電動汽車電池認證,但除了兩家韓廠外,其他廠商均名列20日公布的《汽車動力蓄電池行業規範條件》企業目錄名單。

中國已公告,2018年1月開始,只有配備工信部認證電池的車輛才可獲得電動車採購補貼。由於補貼金佔電動車價格達40%,無補貼的電池很難找到客戶,幾乎等於被排擠於市場之外。

三星SDI、LG Chem均表示不清楚被拒原因,且都將於今年重新遞交申請。

中國電動車競爭日漸激烈,政府也曾祭出保護本土產業的措施,包括要求成品須有一定比例零件於本地生產等。但這次三星SDI、LG Chem踢到鐵板,引發保護政策的疑慮,韓廠憂心中國政府將祭出更嚴密的保護措施。不過,兩家公司已分別在中國南京與西安建立電池工廠,投產後疑慮可望降低。

三星SDI與LG Chem目前共供應全球約1/3電動車用電池,因看好中國市場發展性而積極搶進。LG Chem現有客戶包括通用汽車、福特(Ford)與現代,中國客戶有上汽集團與奇瑞汽車。三星SDI則有鄭州宇通、北汽福田兩家中國客戶,且之前傳出將為特斯拉供應電池產品,但特斯拉已表示Model 3仍將獨家採用Panasonic的電池。

(照片來源:shared by CC 2.0 )

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

※試算大陸海運運費!

和大新廠積極導入生產力4.0;評估赴美設廠

汽車傳動系統製造廠和大今(23)日召開股東會,對於今年展望及未來營運規劃,和大董事長沈國榮表示,目前看來,今年整體景氣及產業方面有些遲緩和壓迫,但對於汽車零組件產業而言,今年仍可望緩步提升;他指出,未來兩年是公司成長關鍵,為因應未來發展所需,旗下大埔美分公司已正式設立,該座新廠亦積極導入生產力4.0;同時,為保有穩定的供貨及因應美國客戶特斯拉(TESLA)需求,公司也在評估前往美國設廠。   在提升生產效率方面,沈國榮指出,在持續提升品質及生產效率下,和大2010年到2015年獲利成長達4.5倍,預期今年成長幅度與2010年相比更將達到5倍;而旗下大埔美新廠也將積極推動生產力4.0,除添購自動化及先進檢驗設備外,亦規劃逐步推行智慧型自動化生產及檢驗,可望進一步提升品質管控及生產效率,以及降低人力成本,且該廠可望於8月加入供貨行列。   在其他產能規劃方面,沈國榮表示,未來兩年相當關鍵,過去接到的包括電動車及燃油車客戶訂單開始提高提貨量,兩年後仍有供應不足壓力,且因公司營收比重來自美國客戶達六成,因此,目前公司已著手了解美國相關法令及尋覓土地,評估在美國設廠的可能性,若接單量更為明朗,將赴美設廠就近供應客戶。   (本文內容由授權使用)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

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

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

台灣特斯拉售價公布,Model S台幣306萬元起跳

特斯拉的台灣櫃點曝光,官網上也更新了台灣車款訊息以及價格。經典車款Model S最低價約為新台幣306.1萬元,而Model X與Model 3的價格則仍待公布。台灣使用者也可購買Powerwall產品。

根據台灣特斯拉所揭露的訊息,Model S車款共分成:60(60kWh電池、後輪驅動)、75(75kWh電池、後輪驅動)、90D(90kWh電池、全時四輪驅動)以及P90D(90kWh Performance電池、全時四輪驅動)等四款,含稅、不含政府補貼的現金售價由新台幣306.1萬元起跳,最昂貴的P90D現金價為502萬元。車主亦可加價選配Autopilot輔助駕駛功能、Ultra Hi-Fi音響等配備。

車款的配備與續航力等訊息也在網站上公開,續航力最佳的90D可行駛557公里。而特斯拉也同步公開油費與牌照稅的節省訊息,Model S每款車輛在五年的行駛當中,平均可節省新台幣6.7萬元。

備受矚目的平價車款Model 3台灣定價預計在2017年公布,有興趣的車主現可支付3.3萬元預購,車輛將在2017年下半年從美國開始陸續交車。若比對Model S 60的美國版定價6.6萬元美金,美國定價3.5萬美金的Model 3,台灣版定價可能會超過新台幣150萬。

台灣客戶可開始在台灣特斯拉官網上預購「能源牆」儲能電池。(來源:Tesla Taiwan)

此外,特斯拉亦將開始在台灣布建超級充電站,主要將設置於主幹道、人口密集區或特定商業場所。台灣使用者也可開始預購儲能系統6.4kWh版的Powerwall(正式定名「能源牆」),以供家庭或搭配電動車使用,亦可整合太陽能板。

(首圖:台灣特斯拉官網 Model S 車款介紹。翻攝台灣特斯拉官網)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

※試算大陸海運運費!

VW電動車電池廠傳將設址中國

電動車的討論與實際需求全球性地提高,傳統汽車廠商也紛紛推出電動車發展時程。德國福斯汽車(Volkswagen,VW)在經歷排氣造假醜聞後,被強迫提前電動車發展時程;而龐大的電池何來?市場傳出VW將在中國設廠的消息。

外電報導,VW已準備開始興建公司第一座專門供應電動車用電池的工廠,廠址位置可能就位於中國。《AutoNews》指出,中國政府積極推動電動車,使中國本地需求潛力龐大;加上中國的原物料、勞力都很豐富,VW可能會考慮在中國設廠,以供應旗下電動車的需求。VW預計在2025年時推出30款電動車產品,旗下車款有三分之一改為電動車款。

VW估計,在中國設置一座電池工廠,約需投資20億歐元;若設置十座工廠,總投資額將達200億歐元。而VW預計,旗下電動車與插電式油電混和車的銷量,到2025年時可達到200~300萬輛。

根據中國工信部近期所推行的電動車補貼清單與辦法可知,中國政府對本國電動車產業採取較明顯的保護手段;直接由海外進口車款、零組件者,較難以獲得購車補貼。國際廠商需在中國本地成立生產鏈,才能獲得補貼資格,進而搶攻中國電動車市場。

(照片來源:Volkswagen)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

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

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

彰化縣祭出電動機車補助,加速改善空氣品質

彰化縣長年受空污所苦,縣府為改善空氣品質,祭出最高新台幣1.9萬元的電動機車購車補助,希望能加速淘汰縣內2.5萬輛老舊機車改用電動車,以減輕空污排放。

彰化縣環保局統計,縣內目前領牌機車共有81.4萬輛,其中有約24.9萬輛是出廠超過12年的二行程老車,空污影響相當大。環保局為減輕PM2.5排放,推出多項補貼措施,目標在今年汰換2.5萬輛老車改用電動車。若能完成目標,每年可減少13公噸PM2.5排放,對縣內空氣環境改善大有助益。

縣府推出的補貼措施依照汰換產品與新購置的電動機車有所不同。汰換二行程機車補貼新台幣1,500元,汰換舊車後新購機車,小型與輕型再補助16,300元、換購重型電動機車則補助19,100元,相當於新車價格的三分之一。

今年前半年,彰化民眾已汰換12,806輛二行程機車,民眾反映普遍良好。但也有民眾希望政府進一步補助電池更換的費用。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

Tesla:自動駕駛未來十年可實現

Tesla 電動車在自動駕駛模式下發生致命車禍,讓自動駕駛技術的前景蒙上了一層陰影,Tesla 聯合創辦人兼CTO JB Straubel 近日在某論壇演講時表示,Tesla 對於產品和技術充滿信心,外界的批評不會對公司內部造成太大影響,未來十年內一定會實現自動駕駛。

JB Straubel 表示Tesla 關注的是如何提高交通的效率,能源的可持續利用,降低交通運行的過程中二氧化碳的排放量,這是Tesla 的目標。目前Tesla 推出了Model S、Model X 和Model 3 三款電動車,這三款產品市場定位是高階轎車、SUV 和平價車,在2016年下半年開放預售的Model 3 預售量已經超過了40 萬台。為了提升電動車系統的性能和便利性,Tesla 還推出了電動車軟體系統,透過不斷更新軟體來實現電動車在短週期內的升級,許多新的功能都是透過軟體的推送提供給車主。

對於近日Tesla 電動車發生的車禍和引發的質疑,JB Straubel 認為這不會給Teals 帶來太大的影響,公司剛剛成立的時候,質疑和批評的聲音也很多,但是Tesla 的團隊對於產品和技術充滿信心,外界的評價不是很重要,每個人對於同一個技術或產品的看法不同很正常,Tesla CEO Elon Musk 在電動車的研發上投入了巨大的成本,成功的幾率並不大,但是仍值得去努力,新創公司從事的業務失敗的概率很大,但不能因此失去信心,融資的目的不僅僅是為了讓公司繼續運營下去,Tesla 只會選擇自己需要的錢。Tesla 關注的技術主要有三個方向,分別是電池技術、二是汽車電子。

對於自動駕駛技術而言,軟體和系統的開發需要投入大量的人力,JB Straubel 認為技術發展的速度很快,未來十年自動駕駛一定會實現。

(本文授權自《》──〈〉。圖片來源:wikipedia)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

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

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

類加載器 – 類的加載、連接與初始化

類的加載、連接與初始化

概述

在Java代碼中,類型的加載、連接與初始化過程都是在程序運行期間完成的

  • 類型:可以理解為一個class
  • 加載:查找並加載類的二進制數據,最常見的情況是將已經編譯完成的類的class文件從磁盤加載到內存中
  • 連接:確定類型與類型之間的關係,對於字節碼的相關處理
    • 驗證:確保被加載的類的正確性
    • 準備:為類的靜態變量分配內存,並將其初始化為默認值。但是在到達初始化之前,類變量都沒有初始化為真正的初始值
    • 解析:在類型的常量池中尋找類、接口、字段和方法的符號引用,把這些符號引用轉換為直接引用的過程
  • 初始化:為類的靜態變量賦予正確的初始值
  • 使用:比如創建對象,調用類的方法等
  • 卸載:類從內存中銷毀

理解:public static int number = 666;

上面這段代碼,在類加載的連接階段,為對象number分配內存,並初始化為0;然後再初始化階段在賦予正確的初始值:666

類的使用方式

Java程序對類的使用方式可分為兩種

  • 主動使用
    • 創建類的實例
    • 訪問某個類或接口的靜態變量,或者對靜態變量賦值
    • 調用類的靜態方法
    • 反射
    • 初始化類的子類
    • Java虛擬機啟動時被標明為啟動類的類(包含main方法)
    • JDK1.7開始提供的動態語言支持(java.lang.invoke.MethodHandle實例的解析結果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應的類沒有初始化,則初始化)
  • 被動使用
    • 除了主動使用的七種情況之外,其他使用Java類的方法都被看作是對類的被動使用,都不會導致類的初始化

所有的Java虛擬機實現必須在每個類或接口被Java程序“首次主動使用”時才初始化他們

代碼理解

示例一:類的加載連接和初始化過程

代碼一

public class Test01 {
    public static void main(String[] args) {
        System.out.println(Child01.str);
    }
}

class Father01 {
    public static String str = "做一個好人!";
    static {
        System.out.println("Father01 static block");
    }
}

class Child01 extends Father01 {
    static {
        System.out.println("Child01 static block");
    }
}

運行結果做一個好人!

Father01 static block
做一個好人!

代碼二

public class Test01 {
    public static void main(String[] args) {
        System.out.println(Child01.str2);
    }
}

class Father01 {
    public static String str = "做一個好人!";

    static {
        System.out.println("Father01 static block");
    }
}

class Child01 extends Father01 {
    public static String str2 = "做一個好人!";
    static {
        System.out.println("Child01 static block");
    }
}

運行結果

Father01 static block
Child01 static block
做一個好人!

分析:

  • 代碼一中,我們通過子類調用父類中的str,這個str是在父類被定義的,對Father01主動使用,沒有主動使用Child01,故Child01的靜態代碼塊沒有執行,父類的靜態代碼塊被執行了。 -> 對於靜態字段來說,只有直接定義了該字段的類才會被初始化。
  • 代碼二中,對Child01主動使用;根據主動使用的7種情況,調動類的子類時,其所有的父類都會被先初始化,所以Father01會被初始化。 -> 當一個類初始化時,要求其父類全部都已經初始化完畢了。

以上驗證的是類的初始化情況,那麼如何驗證類的加載情況呢,可以通過在啟動的時候配置虛擬機參數:-XX:+TraceClassLoading查看

運行代碼一,查看輸出結果,可以看見控制台打印了very多的日誌,第一個加載的是java.lang.Object類(不管加載哪個類,他的父類一定是Object類),後面是加載的一系列jdk的類,他們都位於rt包下。往下查看,可以看見Loaded classloader.Child01,說明即使沒有初始化Child01,但是程序依然加載了Child01類。

[Opened /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded java.lang.Object from /usr/local/jdk1.8/jre/lib/rt.jar]
...
[Loaded java.lang.Void from /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded classloader.Father01 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
[Loaded classloader.Child01 from file:/home/fanxuan/Study/java/jvmStudy/out/production/jvmStudy/]
Father01 static block
做一個好人!
[Loaded java.lang.Shutdown from /usr/local/jdk1.8/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/jdk1.8/jre/lib/rt.jar]

拓展:JVM參數介紹

因為前一章節使用了JVM參數,所以對其做一下簡單的介紹

  • 所有的JVM參數都是以-XX:開頭的
  • 如果形式是:-XX:+<option>,表示開啟option選項
  • 如果形式是:-XX:-<option>,表示關閉option選項
  • 如果形式是:-XX:<option>=<value>,表示將option選項的值設置為value

示例二:常量的本質含義

public class Test02 {
    public static void main(String[] args) {
        System.out.println(Father02.str);
    }
}

class Father02{
    public static final String str = "做一個好人!";

    static {
        System.out.println("Father02 static block");
    }
}

執行結果

做一個好人!

分析

可以看見,此段代碼並沒有初始化Father02類。這是因為final表示的是一個常量,在編譯階段常量就會被存入到調用這個常量的方法所在的類的常量池當中,本質上,調用類並沒有直接引用到定義常量的類,因此並不會觸發定義常量的類的初始化。在本代碼中,常量str會被存入到Test02的常量池中,之後Test02與Father02沒有任何關係,甚至可以刪除Father02的class文件。

我們反編譯一下Test02類

Compiled from "Test02.java"
public class classloader.Test02 {
  public classloader.Test02();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #4                  // String 做一個好人!
       5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

第一塊是Test02類的構造方法,第二塊是我們要看的main方法。可以看見3: ldc #4 // String 做一個好人!,此時這個值已經是確定無疑的做一個好人!了,而不是Father02.str,證實了上面說的在編譯階段常量就會被存入到調用這個常量的方法所在的類的常量池當中

拓展:助記符

因前一章節涉及到了助記符,所以介紹下本章節涉及到的助記符及擴展

  • ldc:表示將int、float或String類型的常量值常量池中推送至棧頂
  • bipush:表示將單字節(-128 -至 127)的常量推送至棧頂
  • sipush:表示將一個短整形(-32768 至 32767)的常量推送至棧頂
  • iconst_1:表示將int類型的1推送至棧頂(這類助記符只有iconst_m1 – iconst_5七個)

示例三:編譯期常量與運行期常量的區別

public class Test03 {
    public static void main(String[] args) {
        System.out.println(Father03.str);
    }
}

class Father03 {
    public static final String str = UUID.randomUUID().toString();

    static {
        System.out.println("Father03 static block");
    }
}

運行結果

Father03 static block
a60c5db4-2673-4ffc-a9f0-2dbe53fae583

分析

本代碼與示例二的區別在於str的值是在運行時確認的,而不是編譯時就確定好的,屬於運行期常量,而不是編譯期常量。當一個常量的值並非編譯期間確定的,那麼其值就不會被放到調用類的常量池中,這時在程序運行時,會導致主動使用這個常量所在的類,導致這個類被初始化。

示例四:數組創建本質

代碼一

public class Test04 {
    public static void main(String[] args) {
         Father04 father04_1 = new Father04();
        System.out.println("-----------");
        Father04 father04_2 = new Father04();
    }
}

class Father04 {
    static {
        System.out.println("Father04 static block");
    }
}

運行結果

Father04 static block
-----------

分析

  • 創建類的實例時,會初始化類
  • 所有的Java虛擬機實現必須在每個類或接口被Java程序“首次主動使用”時才初始化他們

代碼二

public class Test04 {
    public static void main(String[] args) {
        Father04[] father04s = new Father04[1];
        System.out.println(father04s.getClass());
    }
}

運行結果

class [Lclassloader.Father04;

分析

  • 創建數組對象不再主動使用的7種情況內,屬於被動使用,故不會初始化Father04
  • 打印father04s的類型為[Lclassloader.Father04,這是虛擬機在運行期生成的。 -> 對於數組示例來說,其類型是有JVM在運行期動態生成的,表示為[Lclassloader.Father04這種形式,動態生成的類型,其父類就是Object。
  • 對於數組來說,JavaDoc經常將構成數組的元素為Component,實際上就是將數組降低一個維度后的類型

反編譯一下:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: anewarray     #2                  // class classloader/Father04
       4: astore_1
       5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       8: aload_1
       9: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      12: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      15: return
  • anewarray:表示創建一個引用類型(如類、接口、數組)的數組,並將其引用值值壓入棧頂
  • newarray:表示創建一個指定的原始類型(如int、float、char等)的數組,並將其引用值壓入棧頂

示例五:接口的加載與初始化

代碼一

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    int i = 5;
}

interface Child05 extends Father05 {
    int j = 6;
}

運行結果

6

分析

  • 接口中定義的常量本身就是public、static、final的
  • 結果顯而易見,這時我們刪除掉Father05.class文件和Child05.class文件,程序依然可以正常運行
    • 接口中的常量本身就是final常量,會被加載到Test05的常量池中
    • 此時,Father05和Child05都不會被加載

代碼二

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    int i = 5;
}

interface Child05 extends Father05 {
    int j = new Random().nextInt(8);
}

運行結果

6

將Father05.class文件刪除,運行結果

Exception in thread "main" java.lang.NoClassDefFoundError: classloader/Father05
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at classloader.Test05.main(Test05.java:15)
Caused by: java.lang.ClassNotFoundException: classloader.Father05
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 13 more

分析

  • 只有在真正使用到父接口的時候(如引用接口中所定義的常量時),才會加載初始化

代碼三

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Child05.j);
    }
}

interface Father05 {
    Thread thread = new Thread() {
        {
            System.out.println("Father05 code block");
        }
    };
}

class Child05 implements Father05 {
    public static int j = 8;
}

運行結果

8

分析

  • 在初始化一個類時,並不會先初始化他所實現的接口

代碼四

public class Test05 {
    public static void main(String[] args) {
        System.out.println(Father05.thread);
    }
}

interface GrandFather {
    Thread thread = new Thread() {
        {
            System.out.println("GrandFather code block");
        }
    };
}

interface Father05 extends GrandFather{
    Thread thread = new Thread() {
        {
            System.out.println("Father05 code block");
        }
    };
}

運行結果

Father05 code block
Thread[Thread-0,5,main]

分析

  • 在初始化一個接口時,並不會先初始化他的父接口

示例六:類加載器準備階段和初始化階段

代碼一

public class Test06 {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();

        System.out.println("i:" + Singleton.i);
        System.out.println("j:" + Singleton.j);
    }
}

class Singleton {
    public static int i;

    public static int j = 0;

    private static Singleton singleton = new Singleton();

    private Singleton() {
        i ++;
        j ++;
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

運行結果

i:1
j:1

分析

首先Singleton.getInstance();進入SingletongetInstance方法,getInstance會返回Singleton的實例,Singleton的實例是new Singleton();出來的,因此調用了自定義的私有構造方法。在調用構造方法之前,給靜態變量賦值,i默認賦值為0,j顯式的賦值為0,經過構造函數之後,值都為1。

代碼二

public class Test06 {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();

        System.out.println("i:" + Singleton.i);
        System.out.println("j:" + Singleton.j);
    }
}

class Singleton {
    public static int i;

    private static Singleton singleton = new Singleton();

    private Singleton() {
        i ++;
        j ++;
    }

    public static int j = 0;

    public static Singleton getInstance() {
        return singleton;
    }
}

運行結果

i:1
j:0

分析

程序主動使用了Singleton類,準備階段對類的靜態變量分配內存,賦予默認值,下面給出類在連接及初始化階段常量的值的變化

  • i : 0
  • singleton:null
  • j : 0
  • getInstance:初始化
    • i:0
    • singleton:調用構造函數
      • i:1
      • j:1
    • j:0【覆蓋了之前的1】

故返回的值i為1,j為0

深入解析類的加載、連接與初始化

類的加載

  • 將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後再內存中創建一個java.lang.Class對象(規範並未說明Class對象位於哪裡,HotSpot虛擬機將其放在了方法區中)用來封裝類在方法區的數據結構
  • 加載.class文件的方式
    • 從本地系統直接加載
    • 通過網絡下載.class文件
    • 從zip等歸檔文件中加載.class文件
    • 從專有數據庫中提取.class文件
    • 將Java源代碼動態編譯為.class文件
  • 類的加載的最終產品是位於內存中的Class對象
  • Calss對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的接口
  • 有兩種類型的類加載器
    • Java虛擬機自帶的類加載器
      • 根類加載器(Bootstrap):該加載器沒有父加載器。他負責加載虛擬機的核心類庫,如java.lang.*等。根類加載器從系統屬性sun.boot.class.path所指定的目錄中加載類庫。根類加載器的實現依賴於底層操作系統,呀沒有繼承java.lang.CalssLoader類
      • 擴展類加載器(Extension):父加載器為根加載器。從java.ext.dirs系統屬性所指定的目錄中加載類庫,或者從JDK的安裝目錄的jre\lib\ext子目錄(擴展目錄)下加載類庫,如果用戶創建的JAR文件放在這個目錄下,也會自動由擴展類加載器加載。擴展類加載器是純Java類,是java.lang.ClassLoader類的子類
      • 系統(應用)類加載器(System):父加載器為擴展加載器。從環境變量classpath或者系統屬性java.class.path所指定的目錄中加載類,是用戶自定義類加載器的默認父加載器。系統類加載器是純Java類,是java.lang.ClassLoader類的子類
    • 用戶自定義的類加載器
      • java.lang.ClassLoader的子類
      • 用戶可以定製類的加載方式
  • 類加載器並不需要等到某個類被“首次使用”時再加載他
  • JVM規範允許類加載器在預料某個類將要被使用時就預先加載他,如果在預先加載的過程中遇到了.class文件缺失或存在錯誤,類加載器必須在程序首次主動使用時才報告錯誤(LinkageError錯誤)。如果這個類一直沒有被程序主動使用,那麼類加載器就不會報告錯誤

類的連接

類被加載后,就進入連接階段。連接就是將已經讀入到內存中的類的二進制數據合併到虛擬機的運行時環境中去

類的驗證

類的驗證的內容

  • 類文件的結構檢查
  • 語義檢查
  • 字節碼驗證
  • 二進制兼容性驗證

類的準備

在準備階段,Java虛擬機為類的靜態變量分配內存,並設置默認的初始值。例如對於下面的Sample類,在準備階段,將為int類型的靜態變量i分配4個字節的內存空間,並且賦默認值0;為long類型的靜態變量j分配8個字節的內存空間,並賦予默認值0

public class Sample {
    private static int i = 8;
    private static long j = 8L;
    ......
}

類的初始化

在初始化階段,Java虛擬機執行類的初始化語句,為類的靜態變量賦予初始值。在程序中,靜態變量的初始化有兩種途徑:

  • 在靜態變量的聲明處初始化
  • 在靜態代碼塊中初始化

靜態變量的聲明語句,預計靜態代碼塊都被看作類的初始化語句,Java虛擬機會按照初始化語句在類文件中的先後順序來依次執行他們

類的初始化步驟

  • 假如這個類還沒有被加載和連接誒,需要先進行加載和連接
  • 假如類存在直接父類,並且這個父類還沒有被初始化,需要先初始化直接父類
  • 假如類中存在初始化語句,需要依次執行這些初始化語句

類的初始化時機

  • 當Java虛擬機初始化一個類時,要求他的所有父類都已經被初始化,但是這條規則並不適用於接口

    • 在初始化一個類時,並不會先初始化他所實現的接口
    • 在初始化一個接口時,並不會先初始化他的父接口

    因此,一個父接口並不會因為他的子接口或實現類的初始化而初始化,只有當程序首次使用特定接口的靜態變量時,才會導致該接口的初始化。代碼參照代碼理解-接口的初始化

  • 只有當程序訪問的靜態變量或者靜態方法確實在當前類或者當前接口中定義時,才認為是對類或接口的主動使用

  • 調用ClassLoader類的loadClass方法加載一個類,並不是對類的主動使用,不會導致類的初始化

拓展部分

類實例化

類的生命周期除了前文提到的加載、連接、初始化之外,還有類示例化,垃圾回收和對象終結

  • 為新的對象分配內存
  • 為實例變量賦予默認值
  • 為實例變量賦予正確的初始值
  • Java編譯器為它編譯的每一個類都至少生成一個實例初始化方法,在Java的class文件中,這個實例初始化方法被稱為<init>。針對源代碼中每一個類的構造方法,Java編譯器都產生一個<init>方法

類的卸載

  • 當一個類被加載、連接和初始化后,它的生命周期就開始了。當代表該類的Class對象不再被引用,即不可觸及時,Class對象就會結束生命周期,這個類在方法區內的數據也會被卸載,從而結束自己的生命周期
  • 一個類何時結束生命周期,取決於代表它的Class對象何時結束生命周期
  • 由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命周期中,始終不會被卸載。Java虛擬機本身會始終引用這些類加載器,而這類加載器則會始終引用它們所加載的類的Class對象,因此這些Class對象始終是可觸及的;由用戶自定義的類加載器所加載的類是可以被卸載的

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

常見的8中數據結構

 

  • 原文:
  • 譯者:

本文採用意譯,版權歸原作者所有

1976 年,一個瑞士計算機科學家寫一本書。即:算法 + 數據結構 = 程序。40 多年過去了,這個等式依然成立。

很多代碼面試題都要求候選者深入理解數據結構,不管你來自大學計算機專業還是編程培訓機構,也不管你有多少年編程經驗。有時面試題會直接提到數據結構,比如“給我實現一個二叉樹”,然而有時則不那麼明顯,比如“統計一下每個作者寫的書的數量”。

什麼是數據結構?

數據結構是計算機存儲、組織數據的方式。對於特定的數據結構(比如數組),有些操作效率很高(讀某個數組元素),有些操作的效率很低(刪除某個數組元素)。程序員的目標是為當前的問題選擇最優的數據結構。

為什麼我們需要數據結構?

數據是程序的核心要素,因此數據結構的價值不言而喻。無論你在寫什麼程序,你都需要與數據打交道,比如員工工資、股票價格、雜貨清單或者電話本。在不同場景下,數據需要以特定的方式存儲,我們有不同的數據結構可以滿足我們的需求。

8 種常用數據結構

  1. 數組
  2. 隊列
  3. 鏈表
  4. 前綴樹
  5. 哈希表

1. 數組

數組(Array)大概是最簡單,也是最常用的數據結構了。其他數據結構,比如棧和隊列都是由數組衍生出來的。

下圖展示了 1 個數組,它有 4 個元素:

每一個數組元素的位置由数字編號,稱為下標或者索引(index)。大多數編程語言的數組第一個元素的下標是 0。

根據維度區分,有 2 種不同的數組:

  • 一維數組(如上圖所示)
  • 多維數組(數組的元素為數組)

數組的基本操作

  • Insert – 在某個索引處插入元素
  • Get – 讀取某個索引處的元素
  • Delete – 刪除某個索引處的元素
  • Size – 獲取數組的長度

常見數組代碼面試題

2. 棧

撤回,即 Ctrl+Z,是我們最常見的操作之一,大多數應用都會支持這個功能。你知道它是怎麼實現的嗎?答案是這樣的:把之前的應用狀態(限制個數)保存到內存中,最近的狀態放到第一個。這時,我們需要棧(stack)來實現這個功能。

棧中的元素採用 LIFO (Last In First Out),即後進先出。

下圖的棧有 3 個元素,3 在最上面,因此它會被第一個移除:

棧的基本操作

  • Push —  在棧的最上方插入元素
  • Pop — 返回棧最上方的元素,並將其刪除
  • isEmpty —  查詢棧是否為空
  • Top —  返回棧最上方的元素,並不刪除

常見的棧代碼面試題

3. 隊列

隊列(Queue)與棧類似,都是採用線性結構存儲數據。它們的區別在於,棧採用 LIFO 方式,而隊列採用先進先出,即FIFO(First in First Out)。

下圖展示了一個隊列,1 是最上面的元素,它會被第一個移除:

隊列的基本操作

  • Enqueue —  在隊列末尾插入元素
  • Dequeue —  將隊列第一個元素刪除
  • isEmpty —  查詢隊列是否為空
  • Top —  返回隊列的第一個元素

常見的隊列代碼面試題

4. 鏈表

鏈表(Linked List)也是線性結構,它與數組看起來非常像,但是它們的內存分配方式、內部結構和插入刪除操作方式都不一樣。

鏈表是一系列節點組成的鏈,每一個節點保存了數據以及指向下一個節點的指針。鏈表頭指針指向第一個節點,如果鏈表為空,則頭指針為空或者為 null。

鏈表可以用來實現文件系統、哈希表和鄰接表。

下圖展示了一個鏈表,它有 3 個節點:

鏈表分為 2 種:

  • 單向鏈表
  • 雙向鏈表

鏈表的基本操作

  • InsertAtEnd —  在鏈表結尾插入元素
  • InsertAtHead —  在鏈表開頭插入元素
  • Delete —  刪除鏈表的指定元素
  • DeleteAtHead —  刪除鏈表第一個元素
  • Search —  在鏈表中查詢指定元素
  • isEmpty —  查詢鏈表是否為空

常見的隊列代碼面試題

5. 圖

圖(graph)由多個節點(vertex)構成,節點之間闊以互相連接組成一個網絡。(x, y)表示一條邊(edge),它表示節點 x 與 y 相連。邊可能會有權值(weight/cost)。

圖分為兩種:

  • 無向圖
  • 有向圖

在編程語言中,圖有可能有以下兩種形式表示:

  • 鄰接矩陣(Adjacency Matrix)
  • 鄰接表(Adjacency List)

遍歷圖有兩周算法

  • 廣度優先搜索(Breadth First Search)
  • 深度優先搜索(Depth First Search)

常見的圖代碼面試題

6. 樹

樹(Tree)是一個分層的數據結構,由節點和連接節點的邊組成。樹是一種特殊的圖,它與圖最大的區別是沒有循環。

樹被廣泛應用在人工智能和一些複雜算法中,用來提供高效的存儲結構。

下圖是一個簡單的樹以及與樹相關的術語:

樹有很多分類:

  • N 叉樹(N-ary Tree)
  • 平衡樹(Balanced Tree)
  • 二叉樹(Binary Tree)
  • 二叉查找樹(Binary Search Tree)
  • 平衡二叉樹(AVL Tree)
  • 紅黑樹(Red Black Tree)
  • 2-3 樹(2–3 Tree)

其中,二叉樹和二叉查找樹是最常用的樹。

常見的樹代碼面試題

7. 前綴樹

前綴樹(Prefix Trees 或者 Trie)與樹類似,用於處理字符串相關的問題時非常高效。它可以實現快速檢索,常用於字典中的單詞查詢,搜索引擎的自動補全甚至 IP 路由。

下圖展示了“top”, “thus”和“their”三個單詞在前綴樹中如何存儲的:

單詞是按照字母從上往下存儲,“p”, “s”和“r”節點分別表示“top”, “thus”和“their”的單詞結尾。

常見的樹代碼面試題

8. 哈希表

哈希(Hash)將某個對象變換為唯一標識符,該標識符通常用一個短的隨機字母和数字組成的字符串來代表。哈希可以用來實現各種數據結構,其中最常用的就是哈希表(hash table)。

哈希表通常由數組實現。

哈希表的性能取決於 3 個指標:

  • 哈希函數
  • 哈希表的大小
  • 哈希衝突處理方式

下圖展示了有數組實現的哈希表,數組的下標即為哈希值,由哈希函數計算,作為哈希表的鍵(key),而數組中保存的數據即為值(value):

常見的哈希表代碼面試題

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

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

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

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

前蘋果資深副總 傳接手電動車計畫

日前國外媒體《The Information》才報導,蘋果的電動車計畫可能順延至 2021 年;而《華爾街日報》引述知情人士的說法,曾任蘋果資深副總裁的Bob Mansfield 將接掌電動車計畫。

熟知蘋果電動車計畫Project Titan 的內部人士向《華爾街日報》透露,曾任技術部門資深副總裁的Bob Mansfield 將接手這項計畫。不過,目前蘋果官方與Bob Mansfield 本人都不願對於報導內容發表任何評論。

Bob Mansfield 於1999 年加入蘋果,在已故執行長Steve Jobs 底下出任管理階層;過去他曾主導硬體開發工程,產品包括MacBook Air、iMac、iPad 等。蘋果曾在2012 年宣布Bob Mansfield 將要退休,但後來又被執行長Tim Cook 說服、高薪留任公司;2013 年開始他從經營團隊名單隱身,官方僅表示他負責特別專案項目,並直接向Tim Cook 彙報。

Bob Mansfield 與像是設計長Jonathan Ive 等高層一向較少在公開場合露面,而在產品發表會或精心製作的產品影片當中可見他的身影。不過本月份開始,蘋果員工發現負責電動車計畫的資深經理轉而向Bob Mansfield 彙報。

當重點產品iPhone 銷售成長放緩、影響營收與獲利後,新的發展計畫成了蘋果迫切需要的項目。該公司雖未公開承認正在開發一款電動車,不過國外媒體陸續報導,已有數百名員工加入專案,並且聘請來自汽車產業的電池技術與自動駕駛專家,這項計畫可望成為未來推動蘋果成長的發展項目之一。

(本文授權自《》──〈〉)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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