Java基礎系列5:Java代碼的執行順序

該系列博文會告訴你如何從入門到進階,一步步地學習Java基礎知識,並上手進行實戰,接着了解每個Java知識點背後的實現原理,更完整地了解整個Java技術體系,形成自己的知識框架。

 

一、構造方法

構造方法(或構造函數)是類的一種特殊方法,用來初始化類的一個新的對象。Java 中的每個類都有一個默認的構造方法,它必須具有和類名相同的名稱,而且沒有返回類型。構造方法的默認返回類型就是對象類型本身,並且構造方法不能被 static、final、synchronized、abstract 和 native 修飾。

提示:構造方法用於初始化一個新對象,所以用 static 修飾沒有意義;構造方法不能被子類繼承,所以用 final 和 abstract 修飾沒有意義;多個線程不會同時創建內存地址相同的同一個對象,所以用 synchronized 修飾沒有必要。

構造方法的語法格式如下:

public class Person {
	
	/**
	 * 1.構造方法沒有返回值 默認返回類型就是對象類型本身
	 * 2.構造方法的方法名和類名相同
	 */
	
	//無參構造方法
	public Person() {
		System.out.println("我是無參構造方法");
	}
	
	//有參構造方法
	public Person(String username,Integer age) {
		System.out.println("我是有參構造"+"姓名:"+username+"  密碼:"+age);
	}
	
	public static void main(String[] args) {
		Person p1=new Person();//調用無參構造
		
		Person p2=new Person("小王",12);//調用有參構造
	}

}

  

關於構造方法,需要注意:

  • 如何調用:
    • 構造方法在實例化的時候調用,如上述代碼中的Person p1=new Person(),這裏便調用了Person類的無參構造,構造方法由系統自動調用
  • 構造函數重載
    • 我們知道方法可以重載(方法名相同,參數列表不同),那麼構造方法也是方法的一種,當然也可以繼承,如上述代碼中的兩個構造方法,一個無參構造方法,一個帶兩個參數的構造方法。
    • 當有多個構造方法時,程序會在你創建類時根據你傳入的參數決定調用哪個構造方法
  • 默認構造方法
    • 細心的讀者可能會有疑問,之前創建類的時候我並沒有聲明構造函數,但是也可以創建類,是不是可以說類不需要構造函數也可以創建。不是滴,當你沒有显示聲明構造函數時,程序會自動生成一個默認的無參構造函數
    • 並且該構造函數的權限是隨着類的改變而改變的(類為public,構造函數也為public;類改為private,構造函數也改為private);而當該類一旦聲明了構造函數以後,java 是不會再給該類分配默認的構造函數。就是說,一旦你聲明了構造函數,並且該構造函數有形參,那麼你就不能pen ipen=new pen();像這樣聲明一個對象了。
  • 構造方法作用:
    • 構造函數是用於對象初始化
    • 一個對象建立,構造函數只運行一次,而一般方法可以被該對象調用多次。

 

二、代碼塊

1、普通代碼塊:

普通代碼塊是我們用得最多的也是最普遍的,它就是在方法名後面用{}括起來的代碼段。普通代碼塊是不能夠單獨存在的,它必須要緊跟在方法名後面。同時也必須要使用方法名調用它。

public class Test {
    public void test(){
        System.out.println("普通代碼塊");
    }
}

  

2、構造代碼塊:

在類中直接定義沒有任何修飾符、前綴、後綴的代碼塊即為構造代碼塊。我們明白一個類必須至少有一個構造函數,構造函數在生成對象時被調用。構造代碼塊和構造函數一樣同樣是在生成一個對象時被調用

public class Test{
  {
      System.out.println("我是構造代碼塊");
  }
}    

 

注意:

  • 構造代碼塊的作用是給對象初始化。
  • 對象一建立就調用構造代碼塊了,而且優於構造函數執行。這裏強調一下,有對象創建,才會執行構造代碼塊,類不能調用構造代碼塊的,而且構造代碼塊與構造函數的執行順序是前者先於後者執行。
  • 構造代碼塊與構造函數的區別是:構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什麼樣的對象,但無論建立哪個對象,都會先執行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。

  

 

3、靜態代碼塊:

想到靜態我們就會想到static,靜態代碼塊就是用static修飾的用{}括起來的代碼段,它的主要目的就是對靜態屬性進行初始化。

public class Test {
    static{
        System.out.println("靜態代碼塊");
    }
}

  

注意:

  • 靜態代碼塊隨着類的加載而執行,而且只會執行一次,並優於主函數。具體說靜態代碼塊由類調用,類調用時先執行靜態代碼塊,然後才執行主函數。
  • 靜態代碼塊是給類初始化的,而構造代碼塊是給對象初始化的。
  • 靜態代碼塊中的變量是局部變量,和普通方法中的局部變量沒有區別。
  • 一個類中可以有多個靜態代碼塊。

 

三、Java類的初始化順序

1、一個類的情況:

A:

public class Test {
	
	public Test(){
		System.out.println("Test構造函數");
	}
	
	{
		System.out.println("Test構造代碼塊");
	}
	
	static {
		System.out.println("靜態代碼塊");
	}
	
	
	public static void main(String[] args) {
		
	}

}

  

結果:

靜態代碼塊

  

B:

public class Test {
	
	public Test(){
		System.out.println("Test構造函數");
	}
	
	{
		System.out.println("Test構造代碼塊");
	}
	
	static {
		System.out.println("靜態代碼塊");
	}
	
	
	public static void main(String[] args) {
		Test t=new Test();//創建了一個對象
		
	}

}

  

這段代碼相比於上述代碼多了一個創建對象的代碼

結果:

靜態代碼塊
Test構造代碼塊
Test構造函數

  

C:

public class Test {
	
	public Test(){
		System.out.println("Test構造函數");
	}
	
	{
		System.out.println("Test構造代碼塊");
	}
	
	static {
		System.out.println("靜態代碼塊");
	}
	
	
	public static void main(String[] args) {
		Test t1=new Test();//創建了一個對象
		
		Test t2=new Test();
		
	}

}

  

結果:

靜態代碼塊
Test構造代碼塊
Test構造函數
Test構造代碼塊
Test構造函數

  

由此結果可以看出:靜態代碼塊只會在類加載的時候執行一次,而構造函數和構造代碼塊則會在每次創建對象的都會執行一次

 

對於一個類而言,按照如下順序執行:

  1. 執行靜態代碼塊
  2. 執行構造代碼塊
  3. 執行構造函數

對於靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序依次是(靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器。

 

D:

public class Test {
	
	//靜態變量
	public static String staticField="靜態變量";
	
	//變量
	public String field="變量";
	
	//靜態初始化塊
	static {
		System.out.println(staticField);
		System.out.println("靜態初始化塊");
	}
	
	{
		System.out.println(field);
		System.out.println("初始化塊");
	}
	
	//構造函數
	public Test() {
		System.out.println("構造函數");
	}
	
	public static void main(String[] args) {
		Test t=new Test();
	}

}

  

結果:

靜態變量
靜態初始化塊
變量
初始化塊
構造函數

  

2、繼承情況下的代碼執行順序:

class TestA{
	public TestA() {
		System.out.println("A的構造函數");
	}
	
	{
		System.out.println("A的構造代碼塊");
	}
	
	static {
		System.out.println("A的靜態代碼塊");
	}
}

public class TestB extends TestA {
	
	public TestB() {
		System.out.println("B的構造函數");
	}
	
	{
		System.out.println("B的構造代碼塊");
	}
	
	static {
		System.out.println("B的靜態代碼塊");
	}

	public static void main(String[] args) {
		TestB t=new TestB();
	}
	
}

  

這裡有兩個類,屬於繼承的關係,讀者先不要看答案,自己思考一下結果是啥?

1 A的靜態代碼塊
2 B的靜態代碼塊
3 A的構造代碼塊
4 A的構造函數
5 B的構造代碼塊
6 B的構造函數

結果

 

 

當設計到繼承時,代碼的執行順序如下:

1、執行父類的靜態代碼塊,並初始化父類的靜態成員

2、執行子類的靜態代碼塊,並初始化子類的靜態成員

3、執行父類的構造代碼塊,執行父類的構造函數,並初始化父類的普通成員變量

4、執行子類的構造代碼塊,執行子類的構造函數,並初始化子類的普通成員變量

 

Java初始化流程圖:

 

 

 

class Parent {
	/* 靜態變量 */
	public static String p_StaticField = "父類--靜態變量";
	/* 變量 */
	public String p_Field = "父類--變量";
	protected int i = 9;
	protected int j = 0;
	/* 靜態初始化塊 */
	static {
		System.out.println(p_StaticField);
		System.out.println("父類--靜態初始化塊");
	}
	/* 初始化塊 */
	{
		System.out.println(p_Field);
		System.out.println("父類--初始化塊");
	}

	/* 構造器 */
	public Parent() {
		System.out.println("父類--構造器");
		System.out.println("i=" + i + ", j=" + j);
		j = 20;
	}
}

public class SubClass extends Parent {
	/* 靜態變量 */
	public static String s_StaticField = "子類--靜態變量";
	/* 變量 */
	public String s_Field = "子類--變量";
	/* 靜態初始化塊 */
	static {
		System.out.println(s_StaticField);
		System.out.println("子類--靜態初始化塊");
	}
	/* 初始化塊 */
	{
		System.out.println(s_Field);
		System.out.println("子類--初始化塊");
	}

	/* 構造器 */
	public SubClass() {
		System.out.println("子類--構造器");
		System.out.println("i=" + i + ",j=" + j);
	}

	/* 程序入口 */
	public static void main(String[] args) {
		System.out.println("子類main方法");
		new SubClass();
	}
}

  

結果:

父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
子類main方法
父類--變量
父類--初始化塊
父類--構造器
i=9, j=0
子類--變量
子類--初始化塊
子類--構造器
i=9,j=20

  

(1)訪問SubClass.main(),(這是一個static方法),於是裝載器就會為你尋找已經編譯的SubClass類的代碼(也就是SubClass.class文件)。在裝載的過程中,裝載器注意到它有一個基類(也就是extends所要表示的意思),於是它再裝載基類。不管你創不創建基類對象,這個過程總會發生。如果基類還有基類,那麼第二個基類也會被裝載,依此類推。

(2)執行根基類的static初始化,然後是下一個派生類的static初始化,依此類推。這個順序非常重要,因為派生類的“static初始化”有可能要依賴基類成員的正確初始化。

(3)當所有必要的類都已經裝載結束,開始執行main()方法體,並用new SubClass()創建對象。

(4)類SubClass存在父類,則調用父類的構造函數,你可以使用super來指定調用哪個構造函數。基類的構造過程以及構造順序,同派生類的相同。首先基類中各個變量按照字面順序進行初始化,然後執行基類的構造函數的其餘部分。

(5)對子類成員數據按照它們聲明的順序初始化,執行子類構造函數的其餘部分。 

 

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

減量力道不足 國際智庫提長期氣候策略

文:楊竣文(台灣大學政治學研究所碩士生)

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

日新潟診所倉庫 赫見3頭熊準備冬眠

摘錄自2019年12月8日中央社、9日公共電視報導

氣候暖化讓各地生態都在改變,日本新潟有診所發現三頭熊疑似找不到適合地方冬眠,居然把診所倉庫,當成冬眠的場所。

日本放送協會(NHK)報導,8日上午8時45分(台灣時間7時45分)左右,南魚沼市二日町一家診所業者進入診所時發現有熊,立即打電話報警說:「診所內有一頭熊。」NHK記者現場報導,「現在可能是要將熊送上車運走,好像是小熊的樣子,感覺掙扎得相當厲害。」 當地政府表示,預計將把3頭熊帶到野外放生

警察在發現熊之後,在診所倉庫周邊架設障礙物,下午3時30左右對熊發射麻醉槍。熟知熊生態的新潟大學農學部(農學系)教授箕口秀夫表示,目前正是熊的冬眠期,這兩頭熊可能無法找到岩洞或木洞等適當的地方冬眠,所以選這家診所當冬眠地。今年熊吃的食物不足,很多熊來到山下有住家的地方覓食,或許這兩頭熊是冬眠前夕在市區附近覓食。對熊而言,這是緊急措施狀況。

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

2020氣候變遷績效報告:31國碳排下降 台灣退步居倒數第三

環境資訊中心綜合外電;鄒敏惠編譯、陳文姿報導

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

減少汽車碳排雙管齊下,南韓要衝氫動力汽車

全球各國很少在什麼事情上取得共識,對抗氣候變遷倒是頭一遭,讓各懷鬼胎的人類能夠一致以減少排放溫室氣體為目標。在這個願景下,各國想盡辦法減少碳排放,如台灣廠商將電動機車變成一種時尚,南韓則是立志要大力推廣氫動力汽車。

目前汽車製造商包括現代、豐田都有生產氫動力車,現代在 2013 年開始大量生產氫動力車,主要是在歐洲與加州銷售,豐田是在去年開始販售第一款消費性燃料電池汽車,但因全球氫動力車因為價格太高與缺少加氣站,銷售仍不見起色。   《華爾街日報》報導,巴黎氣候變遷會議之後,南韓宣誓未來五年要增加氫動力車銷售數量從現在的 50 輛到 9,000 輛,2030 年要到 63 萬輛,等於每賣出十輛新車,就有一輛是氫動力汽車。氫動力車結合氫與氧來產生電力,副產品就是從排氣管排放的水蒸氣。   南韓政府將補貼每輛氫動力車 275 萬韓圜,約當 23,250 美元,氫動力車售價大約 8,500 萬韓圜,接近 240 萬台幣,補貼約 3%。   除了補貼,南韓還要增加加氣站從目前的 10 座,到 2030 年的 520 座。南韓宣誓未來五年,減少運輸工具碳排放 11%,約 380 萬噸。低碳排放汽車包括混合動力車與電動車將在 2020 年占南韓總汽車銷售量的 20%,現在約 2%。

(首圖來源:)

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

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

東風汽車、法商PSA聯手開發電動車

中國東風汽車宣布將與法商PSA宣布展開合作,共同開發小型電動車,目標全球市場。

PSA集團旗下擁有Peugeot、Citroen、DS等汽車品牌。本次與東風汽車的合作,將共同開發電動車專屬底盤平台e-CMP,並以之為基礎發展一系列小型電動車款,市場放眼全球。PSA預告,2019年時,Peugeot、Citroen、DS等三品牌都會有電動車款問世。

東風汽車則表示,兩家公司將在研究開發、市場行銷、生產、財務、人力資源等方面合作,加速雙方在全球市場的發展。

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

web應用安全框架選型:Spring Security與Apache Shiro

一、 SpringSecurity 框架簡介

官網:

源代碼:

Spring Security 是強大的,且容易定製的,基於Spring開發的實現認證登錄與資源授權的應用安全框架。

SpringSecurity 的核心功能:

  • Authentication:認證,用戶登陸的驗證(解決你是誰的問題)
  • Authorization:授權,授權系統資源的訪問權限(解決你能幹什麼的問題)
  • 安全防護,防止跨站請求,session 攻擊等

二、比較一下shiro與Spring Security

目前在java web應用安全框架中,與Spring Security形成直接競爭的就是shiro,二者在核心功能上幾乎差不多,但從使用的角度各有優缺點。筆者認為:沒有最好的,只有最合適的。

2.1 用戶量

從使用情況上看,二者都在逐步提高使用量。shiro的使用量一直高於spring security.

2.2.使用的方便程度

通常來說,shiro入門更加容易,使用起來也非常簡單,這也是造成shiro的使用量一直高於Spring Security的主要原因。但是從筆者的角度來看,二者其實都簡單,我說說我的理由:

  • 在沒有Spring Boot之前,Spring Security的大部分配置要通過XML實現,配置還是還是非常複雜的。但是有了 Spring Boot之後,這一情況已經得到顯著改善。
  • Spring Security之所以看上去比shiro更複雜,其實是因為它引入了一些不常用的概念與規則。大家應該都知道2/8法則,這在Spring Security裏面體現的特別明顯,如果你只學Spring Security最重要的那20%,這20%的複雜度和shiro基本是一致的。也就是說,不重要的那80%,恰恰是Spring Security比shiro的“複雜度”。

也就是說,如果有人能幫你把Spring Security最重要的那20%摘出來,二者的入門門檻、複雜度其實是差不太多的。

2.3.社區支持

Spring Security依託於Spring龐大的社區支持,這點自不必多說。shiro屬於apache社區,因為它的廣泛使用,文檔也非常的全面。二者從社區支持來看,幾乎不相上下。

但是從社區發展的角度看,Spring Security明顯更佔優勢,隨着Spring Cloud、Spring Boot、Spring Social的長足進步,這種優勢會越來越大。因為Spring Security畢竟是Spring的親兒子,Spring Security未來在於Spring系列框架集成的時候一定會有更好的融合性,前瞻性、兼容性!這也是為什麼我們要學Spring Security的主要原因!

2.4.功能豐富性

Spring Security因為它的複雜,所以從功能的豐富性的角度更勝一籌。其中比較典型的如:

  • Spring Security默認含有對OAuth2.0的支持,與Spring Social一起使用完成社交媒體登錄也比較方便。shiro在這方面只能靠自己寫代碼實現。
  • 還有一種普遍說法:Spring Security在網絡安全的方面下的功夫更多,但是筆者並未有非常直接的感受,有可能出現安全問題的時候才會感到不夠安全的痛。

三、總結

如果你只是想實現一個簡單的web應用,shiro更加的輕量級,學習成本也更低。如果您正在開發一個分佈式的、微服務的、或者與Spring Cloud系列框架深度集成的項目,筆者還是建議您使用Spring Security。

期待您的關注

  • 博主最近新寫了一本書:
  • 本文轉載註明出處(必須帶連接,不能只轉文字):。

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

算法核心——空間複雜度和時間複雜度超詳細解析

算法核心——空間複雜度和時間複雜度超詳細解析

一、什麼是算法

算法

  • 一個有限指令集
  • 接受一些輸入(有些情況下不需要收入)
  • 產生輸出
  • 一定在有限步驟之後終止
  • 每一條指令必須:
  1. 有充分明確的目標,不可以有歧義
  2. 計算機能處理的範圍之內
  3. 描述應不依賴於任何一種計算機語言以及具體的實現手段

其實說白了,算法就是一個計算過程解決問題的方法。我們現在已經知道數據結構表示數據是怎麼存儲的,而“程序=數據結構+算法”,數據結構是靜態的,算法是動態的,它們加起來就是程序

對算法來說有輸入,有輸出,相當於函數參數返回值。我們寫算法的時候習慣把算法封裝到一個函數中。

二、什麼是好的算法

好,從上面我們知道了什麼是算法,下面我再說什麼是好的算法
在解決同一個問題的時候,我們通常會有很多種不一樣的算法,區別就在於,有的算法比較笨,有的算法比較聰明,那我們怎麼去衡量它們誰好誰壞呢?我們通常有下面兩個指標:

  • 空間複雜度:根據算法寫成的程序在執行時佔用存儲單元的長度。
  • 時間複雜度:根據算法寫成的程序在執行時耗費時間的長度。

先舉個例子說,如果讓你打印十個整數,你那個程序可能瞬間就給出結果了,如果讓你打印十萬個整數呢?這你就得多等一會了。所以這個程序運行的時間,就跟你要處理的數據是十個還是十萬個是相關的,這個十萬就是我們要處理的數據的規模。我們把它叫做n,是一個變量的話,那我們這個程序所用的時間空間都跟這個n是有直接關係的。解決一個問題有很多中不同的方法,你在設計這個方法的時候,一定要把這兩個要素考慮清楚。一不小心,如果空間複雜度太大的話,你那個程序就可能直接爆掉了,非正常中斷,我一會會在後面講,時間複雜度如果太大的話,你就可能等很長時間都等不出結果。

時間複雜度

先來看上面圖片中的幾組代碼,我是用Python表示的,你在看的時候考慮兩個問題:

 

  1. 四組代碼中,哪組的運行時間最短?
  2. 用什麼方式來體現算法運行的快慢?

剛才說n可以看作數據的規模,規模不一樣,運行時間肯定也不一樣,而且所用時間也不好確定,不同的n會得到不同的時間,所以我們用時間複雜度來表示算法運行的快慢。
先來看下面圖片中的幾個生活中的事件,估計時間:

這裏你會發現我們會用“”表示一個大概,後面還有相應的時間單位,那時間複雜度也參照類似的方法:
時間複雜度:用來評估算法運行效率的一個式子

看上面圖片所示,先說print(‘Hello World’),它的時間複雜度表示為O(1),O嚴格來說,它表示數學上一個式子的上界,我們可以簡單的理解為就是一個估計,大約,相當於上面說的“”。1可以理解為是個運行單位(類似於秒這樣的單位),為什麼是O(1),因為print(‘Hello World’)只執行了一次,同理分析第二個:

 

for i in range(n):
    print('Hello World')

它的時間複雜度表示為O(n),因為這組代碼執行了n次。n還是個單位,同理,分析第三個:

for i in range(n):
    for j in range(n):
        print('Hello World')

它的時間複雜度表示為O(),因為是有兩層循環,所以是,還是個單位。第四個你自己就可以分析了,我就不多此一舉了。但千萬不要以為就是這麼簡單,咱再看下面代碼圖片:

看到這個圖片,你是不是感覺很良好,和你猜的差不多是吧,哈哈,不要高興的太早,告訴你們,錯了,它們的時間複雜度不是這樣的。
為什麼?我說了,“1”是單位,但“3”不是單位,3是3乘1,就比如說在生活中,問你一壺水燒多長時間,沒有人回答說是三個幾分鐘或者幾個三分鐘。再說第二個,是單位,n也是個單位,但是比n大,所以我們在估計時用大單位,就好比生活中問你大概睡了多久,你一般說是幾個小時,而不是說幾個小時零幾分鐘,你強調的是一個大概的時間,明白了吧。
所以正確的時間複雜度是這樣的:

第一個為什麼是O(1),首先print(‘Hello World’)打印一次和打印三次實際的影響不大吧,就是不管執行幾次,只要它的規模不上升到n這麼大的時候,換句話說,1是個單位,所以不管怎樣,因為這是表示近似,不是表示精確的,所以是O(1).好,再看下面這個圖片:

當你的循環減半的時候,時間複雜度就會變為O(logn)。所以你可以這樣記,當算法過程出現循環折半的時候,複雜度式子中會出現logn。

 

時間複雜度小結

  • 時間複雜度是用來估計算法運行時間的一個式子(單位)
  • 一般來說,時間複雜度高的算法比時間複雜度低的算法慢
常見的時間複雜度(按效率排序)

複雜問題的時間複雜度

如何簡單快速地判斷算法複雜度

空間複雜度

在空間複雜度中需要注意的一點就是理解“空間換時間”,在研究一個算法的時候,時間比空間重要。

 

此篇完

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

說服川普抗暖化 影后珍芳達曾想祭出美女戰術

摘錄自2019年12月18日中央社報導

珍芳達將在12月21日歡慶82歲生日,17日她在全國記者俱樂部(National Press Club)表示,她曾試圖在2016年美國總統川普當選後,安排包括女星潘蜜拉安德森在內的一群「美麗、性感、傑出」環保人士與川普會面,以說服他對付全球暖化問題。珍芳達(Jane Fonda)曾經跟川普女婿庫許納(Jared Kushner)和女兒伊凡卡(Ivanka Trump)討論她的想法,但並未得到回覆。最終這讓她搬到華盛頓住上幾個月,利用自己的名人力量動員群眾。

珍芳達曾分別以1971年「柳巷芳草」(Klute)與1978年「歸返家園」(Coming Home)兩部作品,摘下奧斯卡影后殊榮。

長年投身社會運動的珍芳達經常參與氣候變遷抗議活動,曾於今年10月在美國國會山莊外被警方逮捕。

 

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

【其他文章推薦】

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

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

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

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

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

Saft將供應61輛龐巴迪電車電池系統

世界級電池製造商Saft(帥福得)與法國龐巴迪(Bombardier)公司達成合作,將由Saft提供122組MX鎳鎘電池系統供龐巴迪61輛FLEXITY有軌電車運行於瑞士巴爾塞市。電池之生產與供貨將在2017年之前完成。

龐巴迪的FLEXITY有軌電車採低地板式設計,結合傳統的底盤結構,創造出更適合城市機動性要求的車體。2012年,龐巴迪與巴爾塞市交通部簽訂合約,巴爾塞市將出資1.84億歐元採購61輛FLEXITY有軌電車,用於取代既有的101輛有軌電車。

每輛FLEXITY有軌電車將搭載兩套Saft MSX 24V定制電池系統,為牽引系統提供緊急備用電源。當電纜供電中斷時,FLEXITY電車仍能繼續行駛到有電地段;而在沒有電纜的地區,Saft MSX也能驅動有軌電車短途行駛,增強機動性能。

Saft已在2013年為兩輛行駛於巴爾塞市的FLEXITY電車提供四套電池系統展開營運,而其餘59輛電車的電池將陸續開始交貨,預計在2017年完成。本次合約代表Saft在歐洲輕軌電車領域的業績成長,年成長率來到15%。

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

【其他文章推薦】

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

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

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

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

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