陸去年新能源汽車保有量年增1.7倍,純電動車占57%

大陸公安部交管局公布,截至去(2015)年底,大陸機動車保有量達2.79億輛,其中汽車1.72億輛。在新能源汽車部分,截至去年底,大陸新能源汽車保有量已達58.32萬輛,年增169.48%;其中,純電動汽車保有量33.2萬輛,占56.93%,其保有量與2014年相比增幅達317.06%。

  隨著大陸經濟持續發展,民眾購車剛性需求旺盛,汽車保有量繼續呈快速增長趨勢,去年新註冊登記的汽車達2,385萬輛,保有量淨增1,781萬輛,均為歷史最高水準。汽車占機動車的比率迅速提高,近5年汽車占機動車比率從47.06%提高到61.82%。   大陸全國已有40個城市的汽車保有量超過百萬輛,北京、成都、深圳、上海、重慶、天津、蘇州、鄭州、杭州、廣州、西安等11個城市汽車保有量超過200萬輛。   截至去年底,大陸小型載客汽車達1.36億輛,其中,私家車達1.24億輛,占91.53%;與2014年相比,私家車增加1,877萬輛,增長17.77%。全國平均每百戶家庭擁有31輛私家車,北京、成都、深圳等大城市每百戶家庭擁有私家車超過60輛。   (本文內容由授權使用;首圖來源: CC BY 2.0)

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

【其他文章推薦】

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

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

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

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

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

特斯拉神秘新車型:Model Y或將今年3月發佈

據外媒報導,特斯拉將會在今年3月的發佈會上同時展示至少兩款不同款式的新汽車。其中,原定計劃的Model 3將是標準款轎車,而另一款神秘汽車則會是運動型SUV系列。

特斯拉首席技術官JB Straubel事實上早在去年6月就展示了一款由Model 3系列演變出的運動型SUV。隨後在10月,CEO伊隆•馬斯克(Elon Musk)也通過Twitter表示,Model 3的衍生型號將會被稱為Model Y。然而對於透露這樣一則資訊,馬斯克很快表示反悔,並迅速刪除了相關推文。

截至目前,有關特斯拉神秘新型號汽車的消息十分有限,尤其是該款車型是否也會隨Model 3同一時間上市。如果Model Y真的是Model 3的衍生版本,那前者極有可能與後者採用同樣底盤,並共用大部分生產線。

Model 3的預設售價為3.5萬美元,一次充電後的有效里程為200英里(約合320公里)。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

電動車五日環台之旅,充電設備是最大考驗

由台灣電動車經銷、維修商綠動未來所主辦的第一屆電動車環台Party活動,歷經五日純電動行程,於2月1日順利抵台北101大樓。雖然台灣各地的充電設備分布不均,但這次活動仍證明電動車環島的可行性,主辦單位希望能藉此鼓勵更多民眾加入電動車行列。

綠動未來創辦人劉小麟表示,參加本次環島活動的車款分別是Tesla Model S、Luxgen M7 EV+ 以及Nissan Leaf 輕巧通勤車,皆為純電動車,且Luxgen、Nissan的車款都是都市用車,充飽電後的續航力只有150公里,在環島過程中也因此面臨較大的充電考驗。而Tesla Model S 每次充飽電可行駛480公里,影響相對輕微。

台灣各地充電設備空間分布不均。劉小麟紀錄環台過程的充電狀況,統計台灣東部的宜蘭、花蓮、台東三縣市均無充電設備,西部的新竹、苗栗、雲林、嘉義、高雄、屏東則沒有公共充電站。環台期間,須商借個人充電站協助充電,或者到汽車廠、警察局與消防隊,甚至在投宿的民宿充電。不過,用一般電源充電所需時間長,也因此限制電動車環島之旅的機動性;相較之下,專為電動車設計的快充充電站僅需幾十分鐘就能充飽電池再上路。

在成功完成純電環島之旅後,劉小麟也規劃開始募款,希望能帶著國產的Luxgen M7 EV 到西班牙參加六月即將展開的世界電動車環球賽,挑戰80天、20國、25,000公里的長征之旅。

(照片來源:臉書專頁)

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

類型擦除真的能完全擦除一切信息嗎?java 泛型揭秘

背景

我們都知道泛型本質上是提供類型的”類型參數”,它們也被稱為參數化類型(parameterized type)或參量多態(parametric polymorphism)。其實泛型思想並不是 Java 最先引入的,C++ 中的模板就是一個運用泛型的例子。

GJ(Generic Java)是對 Java 語言的一種擴展,是一種帶有參數化類型的 Java 語言。用 GJ 編寫的程序看起來和普通的 Java 程序基本相同,只不過多了一些參數化的類型同時少了一些類型轉換。實際上,這些 GJ 程序也是首先被轉化成一般的不帶泛型的 Java 程序后再進行處理的,編譯器自動完成了從 Generic Java 到普通 Java 的翻譯。

 

什麼是真實的java泛型

我們都知道編譯器會進行泛型擦除,編譯器可以在對源程序(帶有泛型的 Java 代碼)進行編譯時使用泛型類型信息保證類型安全,對大量如果沒有泛型就不會去驗證的類型安全約束進行驗證,同時在生成的字節碼當中,將這些類型信息清除掉。下面我們先驗證一下:

public static void main(String[] args) {
 ArrayList<Integer> ints = new ArrayList<Integer>();
 ints.add(1); 
 ints.add(2);
 ints.add(3);
 
 ArrayList<String> sts = new ArrayList<String>();
 sts.add("a");
 sts.add("b");
 sts.add("c");
 
 System.out.println(ints.getClass() == sts.getClass()); 
 }
上面打印的結果是true,原因是:

按照理解,泛型擦除后將不能找回原來的類型,都是Object形式的,真的如此嗎?

看一下如下代碼:

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

public class ClassTest {
     public static void main(String[] args) throws Exception {
     ParameterizedType type = (ParameterizedType) 
     Bar.class.getGenericSuperclass();
     System.out.println(type.getActualTypeArguments()[0]);
     
     ParameterizedType fieldType = (ParameterizedType) 
     Foo.class.getField("children").getGenericType();
     System.out.println(fieldType.getActualTypeArguments()[0]);
     
     ParameterizedType paramType = (ParameterizedType) 
     Foo.class.getMethod("foo", List.class)
     .getGenericParameterTypes()[0];
     System.out.println(paramType.getActualTypeArguments()[0]);
     
     System.out.println(Foo.class.getTypeParameters()[0]
     .getBounds()[0]);
     }
     
     class Foo<E extends CharSequence> {
     public List<Bar> children = new ArrayList<Bar>();
     public List<StringBuilder> foo(List<String> foo) {return null; }
     public void bar(List<? extends String> param) {}
     }
     
     class Bar extends Foo<String> {}
    }

打印出

class java.lang.String
class com.javapuzzle.davidwang456.ClassTest$Bar
class java.lang.String
interface java.lang.CharSequence

你會發現每一個類型參數都被保留了,而且在運行期可以通過反射機制獲取到。那麼到底什麼是“類型擦除”?至少某些東西被擦除了吧?是的。事實上,除了結構化信息外的所有東西都被擦除了 —— 這裏結構化信息是指與類結構相關的信息,而不是與程序執行流程有關的。換言之,與類及其字段和方法的類型參數相關的元數據都會被保留下來,可以通過反射獲取到。

參考資料

【1】http://techblog.bozho.net/on-java-generics-and-erasure/

【2】https://www.ibm.com/developerworks/cn/java/j-lo-gj/?mhsrc=ibmsearch_a&mhq=%E7%B1%BB%E5%9E%8B%E6%93%A6%E9%99%A4

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

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

Vue躬行記(8)——Vue Router

  雖然Vue.js未提供路由功能,但是官方推出了Vue Router(即vue-router庫),以插件的形式支持。它與Vue.js深度集成,可快速的創建單頁應用(Single Page Application,SPA)。

一、基本用法

  首先需要引入vue和vue-router兩個庫,如果像下面這樣全局引用(即存在全局變量Vue),那麼vue-router會自動調用Vue.use()方法註冊其自身;但如果以模塊的方式引用,那麼就得顯式地調用Vue.use()。

<script src="js/vue.js"></script>
<script src="js/vue-router.js"></script>

  然後添加兩個內置的組件,第一個是導航用的router-link組件,它默認會被渲染成<a>元素,如果要渲染成其它元素,那麼可以使用它的tag屬性;第二個是路徑匹配時用於渲染視圖的router-view組件,它還是一個函數式組件,如下所示。

<div id="container">
  <router-link to="/main">首頁</router-link>
  <router-link to="/list">列表</router-link>
  <router-view></router-view>
</div>

  再聲明要渲染的組件,這些組件會與指定的路由映射,下面是兩個非常簡單的自定義組件。

const Main = { template: '<div>首頁</div>' };
const List = { template: '<div>列表</div>' };

  接着定義路由配置,添加一組路徑以及對應的組件,如下所示。

const routes = [
  { path: '/main', component: Main },
  { path: '/list', component: List }
];

  最後創建路由器實例,並將之前的路由配置傳遞進來,在掛載根實例時,需要將它注入,從而讓整個應用都有路由功能,如下所示。

const router = new VueRouter({
  routes: routes
});
var vm = new Vue({
  el: "#container",
  router: router
});

  注意,router實例包含三個導航方法:push()、replace()和go(),可以用編程的方式進行導航。

  頁面在渲染完成后,得到的DOM結構如下所示,此時router-view組件所佔的位置無任何內容。

<div id="container">
  <a href="#/main" class="">首頁</a>
  <a href="#/list" class="">列表</a>
</div>

  當router-link組件所對應的路由匹配成功時,其渲染出的元素會被自動添加一個CSS類:router-link-active。例如點擊首頁鏈接,得到的結構如下所示,注意,此時router-view組件被替換成了Main組件中的內容。

<div id="container">
  <a href="#/main" class="router-link-active">首頁</a>
  <a href="#/list" class="">列表</a>
  <div>首頁</div>
</div>

二、路由模式

  Vue Router默認採用URL hash模式來保持頁面和URL的同步,其創建的URL格式需要包含井號(#),如下所示。

http://pwstrick.com/#/main

  Vue Router還有另外一種history模式,利用HTML5 History來保持頁面和URL的同步,其創建的URL格式在視覺上更為簡潔清晰,如下所示。

http://pwstrick.com/main

  如果要開啟history模式,那麼需要在路由配置時添加mode選項,並賦予history關鍵字,如下所示(直接修改了上一節中的示例)。

const router = new VueRouter({
  mode: "history",
  routes: routes
});

  注意,當直接訪問history模式創建的URL時,會返回一個404頁面。為了避免這種情況的發生,建議在服務器上配置一個默認的候選頁面。

三、路由

  本節不僅會介紹動態路由的概念,還會分析路由的命名和嵌套等操作。

1)動態路由

  Vue Router採用的路徑匹配引擎是path-to-regexp,它支持動態路由的匹配,例如有一個List組件,需要根據路徑中的頁碼參數把組件渲染成不同的內容,可以像下面這樣配置。

const List = { template: '<div>{{$route.params.page}}</div>' };
const routes = [
  { path: '/list/:page', component: List }
];

  在路由配置中,以冒號開頭的:page是路徑參數,它的值會被保存到路由對象$route的params屬性中。路由對象不僅包含解析URL得到的信息(例如路徑、查詢字符串、錨點等),還有匹配到的路由信息(例如路由名稱、路由記錄等)。當路徑是/list/1時,$route.params的值為{page: 1},params是一個對象,其鍵值與路徑參數對應。注意,一條路徑可以包含多個不同的路徑參數。

  當一個路徑能匹配多個路由時,匹配優先級會按照路由的定義順序來排,即先定義的,優先級高。下面的配置包含兩個路由,當路徑是/list/1時,只會渲染List組件。

const routes = [
  { path: '/list/:page', component: List },
  { path: '/list/1', component: Main }
];

2)命名路由

  可以在配置時為路由標識一個名稱,從而就能在使用時省略路徑了,如下所示,name屬性的值就是路由名稱。

const routes = [
  { path: '/list/:page', component: List, name: "list" }
];

  如果要導航到一個命名路由,那麼需要動態地綁定to屬性,併為其傳入路由的名稱以及可選的URL參數,如下所示。

<router-link :to="{ name: 'list', params: {page: 3} }">第三頁</router-link>

3)嵌套路由

  Vue Router允許嵌套路由,可通過多層嵌套的組件實現。下面是一個使用示例,首先在一個組件中聲明router-view視圖組件,如下所示。

const List = { template: '<router-view></router-view>' };
const Detail = { template: '<div>詳情</div>' };

  然後在路由配置中,添加children選項,並定義子路由。

const routes = [
  {
    path: "/list",
    component: List,
    children: [{ path: "detail", component: Detail }]
  }
];

  在經過這一系列操作后,當路徑是/list/detail時,Detail組件就會被渲染到List組件的視圖中。

  嵌套路由可用來渲染多個不同層級的視圖,而利用命名視圖可渲染多個同級的視圖。在下面的代碼中,為第二個router-view組件添加了name屬性,賦予它一個名稱,而第一個router-view組件的默認名稱為default。

<router-view></router-view>
<router-view name="detail"></router-view>

  在路由配置時,新增用於記錄各個命名組件的components選項,如下所示。

const routes = [
  {
    path: "/named",
    components: {
      default: Main,
      detail: Detail
    }
  }
];

  當路徑是/named時,Main和Detail兩個組件會被同時渲染。

四、重定向和別名

1)重定向

  在路由配置中,通過redirect選項可重定向到一個新的頁面,該選項可取的值有三種,分別是路徑、命名路由和回調函數,如下所示,其中函數中的to參數表示目標路由對象。

const routes = [
  { path: "/list/1", redirect: "/main" },
  { path: "/list/1", redirect: {name: "main"} },
  { path: "/list/1", redirect: to => "/main" }
];

  當訪問的路徑是/list/1時,瀏覽器的地址欄會變成/main,匹配的將是路徑為/main的路由。

2)別名

  在路由配置中,通過alias選項可定義路由的別名,如下所示。

const routes = [
  { path: "/list/4", component: Detail, alias: "/detail" }
];

  當訪問的路徑是/main時,瀏覽器的地址欄保持為/main,但匹配的將是路徑為/list/4的路由。

五、組件傳參

  除了在組件中通過$route.params獲取路由參數之外,還能將路由參數作為組件的props傳入,從而將組件和路由解耦,如下所示。

const List = {
  props: ["page"],
  template: "<div>{{page}}</div>"
};
const routes = [
  { path: "/list/:page", component: List, props: true }
];

  需要注意的是,在路由配置時要添加props選項,並賦予true后,才會讓路由參數和props關聯。

六、導航守衛

  導航守衛就是路由發生變化時的鈎子函數,Vue Router提供了三類守衛:全局、路由獨享和組件級。

1)全局守衛

  在路由器實例上可註冊三個全局守衛,分別是beforeEach()、beforeResolve()和afterEach()。

  beforeEach()是一個全局前置守衛,包含三個參數(如下所示),其中to是目標路由對象、from是來源路由對象,next是一個回調函數,用於解析(resolve)當前守衛。

router.beforeEach((to, from, next) => {
  next();
});

  由於導航在所有守衛解析之前會處於等待狀態(即不會改變路徑,也不會渲染對應的組件),因此在回調中不能省略next()函數。注意,該函數不僅能處理導航,還能將其中斷或重定向,甚至註冊一個錯誤。

  beforeResolve()是一個全局解析守衛,其參數和beforeEach()的相同,在導航被確認前,並且組件內的守衛和異步路由組件被解析之後調用。afterEach()是一個全局後置守衛,它只有to和from兩個參數。

2)路由守衛

  在路由配置中可直接定義beforeEnter()守衛,作用於某個單獨的路由而非全局,其參數和beforeEach()的相同,如下所示。

const routes = [
  {
    path: "/list",
    component: List,
    beforeEnter: (to, from, next) => {
      next();
    }
  }
];

3)組件守衛

  組件內的導航守衛包含三個,如下所列,它們的參數都和beforeEach()的相同,也是to、from和next。

  (1)beforeRouteEnter():由於該組件在導航確認前被調用,因此組件還未被創建,從而訪問this無法得到組件實例。但next()函數能接收一個參數為組件實例的回調,如下所示。

const List = {
  beforeRouteEnter: function(to, from, next) {
    next(vm => { 
      //vm是組件實例
    });
  }
};

  (2)beforeRouteUpdate():可通過this得到組件實例,當路由發生變化,但復用了一個組件時,會調用該守衛。例如一個路徑為/list/:page的路由(如下配置所示),在將/list/1導航至list/2時,由於渲染的都是List組件,因此會調用beforeRouteUpdate()守衛。

const routes = [
  {
    path: "/list/:page",
    component: List
  }
];

  (3)beforeRouteLeave():也可通過this得到組件實例,當路由改變,並且渲染的組件不同時,會調用該守衛。例如有兩條路徑/main和/list,分別對應Main和List組件,在List組件中聲明了beforeRouteLeave()守衛(如下所示),當從/list導航至/main時,會彈出確認框,判斷是否需要取消本次導航。

const List = {
  beforeRouteLeave: function(to, from, next) {
    const answer = window.confirm("是否離開當前頁?");
    answer ? next() : next(false);
  }
};

4)解析流程

  完整的導航解析流程如下所列。

(1)導航被觸發。

(2)在失活的組件里調用beforeRouteLeave()守衛。

(3)調用全局的beforeEach()守衛。

(4)在重用的組件里調用beforeRouteUpdate()守衛。

(5)在路由配置里調用beforeEnter()守衛。

(6)解析異步路由組件。

(7)在被激活的組件里調用beforeRouteEnter()守衛。

(8)調用全局的beforeResolve()守衛。

(9)導航被確認。

(10)調用全局的afterEach()守衛。

(11)觸發DOM更新。

(12)用創建好的實例調用beforeRouteEnter()守衛中傳給next參數的回調函數。

 

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

什麼情況用ArrayList or LinkedList呢?

ArrayList 和 LinkedList 是 Java 集合框架中用來存儲對象引用列表的兩個類。ArrayList 和 LinkedList 都實現 List 接口。先對List做一個簡單的了解:

列表(list)是元素的有序集合,也稱為序列。它提供了基於元素位置的操作,有助於快速訪問、添加和刪除列表中特定索引位置的元素。List 接口實現了 Collection 和 Iterable 作為父接口。它允許存儲重複值和空值,支持通過索引訪問元素。

 

讀完這篇文章要搞清楚的問題:ArrayList和LinkedList有什麼不同之處?什麼時候應該用ArrayList什麼時候又該用LinkedList呢?

 

下面以增加和刪除元素為例比較ArrayList和LinkedList的不同之處

增加元素到列表尾端:

在ArrayList中增加元素到隊列尾端的代碼如下:

public boolean add(E e){
   ensureCapacity(size+1);//確保內部數組有足夠的空間
   elementData[size++]=e;//將元素加入到數組的末尾,完成添加
   return true;      
} 

 

ArrayList中add()方法的性能決定於ensureCapacity()方法。ensureCapacity()的實現如下:

public vod ensureCapacity(int minCapacity){
  modCount++;
  int oldCapacity=elementData.length;
  if(minCapacity>oldCapacity){    //如果數組容量不足,進行擴容
      Object[] oldData=elementData;
      int newCapacity=(oldCapacity*3)/2+1;  //擴容到原始容量的1.5倍
      if(newCapacitty<minCapacity)   //如果新容量小於最小需要的容量,則使用最小
                                                    //需要的容量大小
         newCapacity=minCapacity ;  //進行擴容的數組複製
         elementData=Arrays.copyof(elementData,newCapacity);
  }
}

 

可以看到,只要ArrayList的當前容量足夠大,add()操作的效率非常高的。只有當ArrayList對容量的需求超出當前數組大小時,才需要進行擴容。擴容的過程中,會進行大量的數組複製操作。而數組複製時,最終將調用System.arraycopy()方法,因此add()操作的效率還是相當高的。

LinkedList 的add()操作實現如下,它也將任意元素增加到隊列的尾端:

public boolean add(E e){
   addBefore(e,header);//將元素增加到header的前面
   return true;
}

 

其中addBefore()的方法實現如下:

private Entry<E> addBefore(E e,Entry<E> entry){
     Entry<E> newEntry = new Entry<E>(e,entry,entry.previous);
     newEntry.provious.next=newEntry;
     newEntry.next.previous=newEntry;
     size++;
     modCount++;
     return newEntry;
}

 

可見,LinkeList由於使用了鏈表的結構,因此不需要維護容量的大小。從這點上說,它比ArrayList有一定的性能優勢,然而,每次的元素增加都需要新建一個Entry對象,並進行更多的賦值操作。在頻繁的系統調用中,對性能會產生一定的影響。

增加元素到列表任意位置

除了提供元素到List的尾端,List接口還提供了在任意位置插入元素的方法:void add(int index,E element);

由於實現的不同,ArrayList和LinkedList在這個方法上存在一定的性能差異,由於ArrayList是基於數組實現的,而數組是一塊連續的內存空間,如果在數組的任意位置插入元素,必然導致在該位置后的所有元素需要重新排列,因此,其效率相對會比較低。

以下代碼是ArrayList中的實現:

public void add(int index,E element){
   if(index>size||index<0)
      throw new IndexOutOfBoundsException(
        "Index:"+index+",size: "+size);
         ensureCapacity(size+1);
         System.arraycopy(elementData,index,elementData,index+1,size-index);
         elementData[index] = element;
         size++;
}

 

可以看到每次插入操作,都會進行一次數組複製。而這個操作在增加元素到List尾端的時候是不存在的,大量的數組重組操作會導致系統性能低下。並且插入元素在List中的位置越是靠前,數組重組的開銷也越大。

而LinkedList此時显示了優勢:

public void add(int index,E element){
   addBefore(element,(index==size?header:entry(index)));
}

 

可見,對LinkedList來說,在List的尾端插入數據與在任意位置插入數據是一樣的,不會因為插入的位置靠前而導致插入的方法性能降低。

刪除任意位置元素

對於元素的刪除,List接口提供了在任意位置刪除元素的方法:

public E remove(int index);

 

對ArrayList來說,remove()方法和add()方法是雷同的。在任意位置移除元素后,都要進行數組的重組。ArrayList的實現如下:

public E remove(int index){
   RangeCheck(index);
   modCount++;
   E oldValue=(E) elementData[index];
  int numMoved=size-index-1;
  if(numMoved>0)
     System.arraycopy(elementData,index+1,elementData,index,numMoved);
     elementData[--size]=null;
     return oldValue;
}

 

可以看到,在ArrayList的每一次有效的元素刪除操作后,都要進行數組的重組。並且刪除的位置越靠前,數組重組時的開銷越大。

public E remove(int index){
  return remove(entry(index));         
}
private Entry<E> entry(int index){
  if(index<0 || index>=size)
      throw new IndexOutBoundsException("Index:"+index+",size:"+size);
      Entry<E> e= header;
      if(index<(size>>1)){//要刪除的元素位於前半段
         for(int i=0;i<=index;i++)
             e=e.next;
     }else{
         for(int i=size;i>index;i--)
             e=e.previous;
     }
         return e;
}

 

在LinkedList的實現中,首先要通過循環找到要刪除的元素。如果要刪除的位置處於List的前半段,則從前往後找;若其位置處於後半段,則從后往前找。因此無論要刪除較為靠前或者靠後的元素都是非常高效的;但要移除List中間的元素卻幾乎要遍歷完半個List,在List擁有大量元素的情況下,效率很低。

容量參數

容量參數是ArrayList和Vector等基於數組的List的特有性能參數。它表示初始化的數組大小。當ArrayList所存儲的元素數量超過其已有大小時。它便會進行擴容,數組的擴容會導致整個數組進行一次內存複製。因此合理的數組大小有助於減少數組擴容的次數,從而提高系統性能。

public  ArrayList(){
  this(10);  
}
public ArrayList (int initialCapacity){
   super();
   if(initialCapacity<0)
       throw new IllegalArgumentException("Illegal Capacity:"+initialCapacity)
      this.elementData=new Object[initialCapacity];
}

 

ArrayList提供了一個可以制定初始數組大小的構造函數:

public ArrayList(int initialCapacity) 

 

現以構造一個擁有100萬元素的List為例,當使用默認初始化大小時,其消耗的相對時間為125ms左右,當直接制定數組大小為100萬時,構造相同的ArrayList僅相對耗時16ms。

遍歷列表

遍歷列表操作是最常用的列表操作之一,在JDK1.5之後,至少有3中常用的列表遍歷方式:

 

  • forEach操作

  • 迭代器

  • for循環。

 

String tmp;
long start=System.currentTimeMills();    //ForEach 
for(String s:list){
    tmp=s;
}
System.out.println("foreach spend:"+(System.currentTimeMills()-start));
start = System.currentTimeMills();
for(Iterator<String> it=list.iterator();it.hasNext();){    
   tmp=it.next();
}
System.out.println("Iterator spend;"+(System.currentTimeMills()-start));
start=System.currentTimeMills();
int size=;list.size();
for(int i=0;i<size;i++){                     
    tmp=list.get(i);
}
System.out.println("for spend;"+(System.currentTimeMills()-start));

 

構造一個擁有100萬數據的ArrayList和等價的LinkedList,使用以上代碼進行測試,測試結果:

可以看到,最簡便的ForEach循環並沒有很好的性能表現,綜合性能不如普通的迭代器,而是用for循環通過隨機訪問遍歷列表時,ArrayList表項很好,但是LinkedList的表現卻無法讓人接受,甚至沒有辦法等待程序的結束。這是因為對LinkedList進行隨機訪問時,總會進行一次列表的遍歷操作。性能非常差,應避免使用。

總結

ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:

 

1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。

 

對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;

 

而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。

2.在ArrayList的中間插入或刪除一個元素意味着這個列表中剩餘的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。

3.LinkedList不支持高效的隨機元素訪問。

4.ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間

 

可以這樣說:當操作是在一列數據的後面添加數據而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會有更好的性能;當操作是在一列數據的前面或中間添加或刪除數據,並且按照順序訪問其中的元素時,就應該使用LinkedList了。

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

英國投入4000萬英鎊大力推廣電動車

據報導,英國將率先在倫敦和諾丁漢等城市推廣電動車,並投入4000萬英鎊,以實現改善空氣品質、創造就業和普及低排放交通工具等目標。

資金由英國政府超低排放項目提供並將在上述城市中建立電動車基礎設施,其中包括建設未來社區,給予超低排放汽車以優先行駛以及停放權,建立電動汽車體驗中心,為公眾提供超低排放汽車知識的普及和服務,以及出臺超低排放汽車購置短期貸款服務和汽車租賃計畫,建設超低排放汽車優惠停放點,建設充電樁以及太陽能停車換乘系統等等。

據瞭解,這一項目只是英國政府發展低排放交通工具總體規劃的一部分。英國計畫到2020年總計投入6億英鎊,發展低排放交通工具,其中包括對電動車銷售進行補貼,推廣低排放公車和計程車,資助新一代車身材料和車用電池技術的研發等等。

此外,凡是在英國買電動車的人,都可以得到最高5000英鎊的補助金,英國政府也承諾,未來會繼續發電動車補貼,根據駕駛的車型決定發補助金的數量,從2500-5500英鎊之間不等。英國還將開放電動車上公交專用道,未來開電動車的人,可能不會在塞車時段卡在車陣當中。

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

【其他文章推薦】

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

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

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

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

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

※試算大陸海運運費!

中國財政部2月1日起檢查新能源汽車騙補

中國財政部2月1日召開新能源汽車推廣應用補助資金專項檢查佈置視訊會議,此舉標誌著財政部組織的新能源汽車推廣應用補助資金專項檢查正式開始。

這次檢查財政部將組織全國35個專員辦檢查北京、上海、江蘇等25個省市,覆蓋2013—2015年度獲得中央財政補助資金支援的全部90家新能源汽車生產企業,延伸部分購買使用新能源汽車的企事業單位以及地方政府相關部門。

此次檢查不僅針對中央財政補助資金,對省、市、縣三級提供的新能源補助資金也一併檢查,發現問題一併處理、一併追究責任。檢查工作2016年2月1日正式啟動,至3月下旬結束。

此次檢查以檢查「騙補」為重點,突出重點地區、重點企業、重點車型。檢查組要緊緊圍繞新能源汽車生產、銷售、運營各個環節,逐一排查有無造假騙補的問題。

此外,財政部去年已明確,2017年至2018年新能源汽車補貼標準,將在2016年基礎上下調20%,2019年至2020年下降40%,2020年以後補貼政策將退出。

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

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

瑞典設立百萬美元獎項 尋求永續糧食解決方案

摘錄自2020年2月21日中央社報導

德國與瑞典籌辦人士表示,由於氣候變遷威脅世界糧食供給,增長中的人口需要可永續糧食系統,瑞典已創立兩個100萬美元獎項,尋求餵飽數十億人口的解決方案。

德國波茨坦氣候影響研究中心(Potsdam Institute for Climate Change Impact Research)主任羅克斯特倫(Johan Rockstrom)在聲明中表示:「我們需要糧食系統革命,否則可能破壞我們星球的穩定。新的糧食星球獎(Food Planet Prize)旨在為此目標做出貢獻。」

瑞典科特伯格福斯基金會(Curt Bergfors Foundation)則指出,每年將頒發兩項糧食星球獎,第一項是獎勵「現有的可擴大永續糧食解決方案」,第二項則是獎勵「可能改變全球糧食產業的創新計畫」。科特伯格福斯基金會表示,將於2020年底首次頒發這些獎項。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※試算大陸海運運費!

東南亞穿山甲走私猖獗 20年近90萬隻受害

摘錄自2020年2月20日中央社報導

國際瀕臨絕種野生動植物貿易調查委員會(TRAFFIC)今(20日)表示,過去20年間,據信有近90萬隻穿山甲在東南亞各地遭非法販運,凸顯各界處理非法交易問題時面臨的挑戰。

法新社報導,穿山甲是全世界非法販運量最大的哺乳動物。針對穿山甲身體部位的走私猖獗,因這些部位在中國和越南等國家具高度傳統藥用價值。此外,穿山甲肉被視為美味佳餚。多年來在生物多樣豐富的東南亞地區被嚴重盜獵,而在非洲也逐漸成為盜獵目標。

TRAFFIC在新發布的報告中估計,2000年至2019年間,約有89萬5000隻穿山甲在東南亞遭到走私。報告也提到,單在2017年至2019年間,馬來西亞、新加坡和越南就查獲超過9萬6000公斤的穿山甲鱗片。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?