JAVA 語言的主要特徵:
簡單 、動態、高性能、跨平臺、面象對象、分佈式、多線程、安全、健壯性html
Class Arrays:
This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists.前端
經常使用方法有: asList ,copyOf, fill ,sortjava
public static <T> List<T> asList(T... a)
public static <T> T[] copyOf(T[] original,int newLength)
public static void fill(Object[] a,Object val)
public static void fill(Object[] a,int fromIndex,int toIndex,Object val)
parallelSort: public static <T extends Comparable<? super T>> void parallelSort(T[] a)
類和對象
成員方法修飾符:主要有public、private、protect、final 、static、abstract和 synchronized 7種,用來講明方法的訪問權限
方法傳參:
–值傳遞:表示方法接收的是調用者提供的變量的值。
–引用傳遞:表示方法接收的是調用者提供的變量地址。
–一個方法能夠修改傳遞引用所對應的變量值,而不能修改傳遞值調用所對應的變量值。
方法傳參(基本數據類型):–方法不會改變實參的值
方法傳參(引用類型):–方法體內,經過引用改變了實際參數對象的值
Java參數傳遞機制: –http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
對象和對象的引用 –http://jingyan.baidu.com/article/a501d80cf734c3ec630f5e25.html
Java類庫中幾個重要的包
- java.lang –包含一些造成語言核心的類,如String、Math、Integer和Thread。
- •java.awt –包含了構成抽象窗口工具包(AWT)的類,這個包被用來構建和管理應用程序的圖形用戶界面。
- •java.applet –包含了可執行applet 特殊行爲的類。
- java.net –包含執行與網絡相關的操做的類和處理接口及統一資源定位器(URLs)的類。
- •java.io –包含處理I/O 文件的類。
- •java.util –包含爲任務設置的實用程序類,如隨機數發生、定義系統特性和使用與日期日曆相關的函數。
訪問修飾符與封裝
• public公共成員
– 成員方法或變量聲明爲public,稱爲公共成員
-- 能夠被全部的類訪問的成員(前提所屬類自己是可見的)
• private私有成員
– 不能被其所在類之外的任何類訪問
• 聲明爲private的成員,稱爲私有成員
• protected保護成員和默認成員
– 聲明爲protected的成員,稱爲保護成員
– 能夠被同一包內的類訪問和被子類繼承
• 沒有任何修飾符的成員,稱爲默認成員
– 只能被同一包內的類訪問sql
對象的繼承
–Java 中的單繼承機制:一個類只能有一個直接父類;
–final修飾的類不能有子類;String是典型特例
–Object類是全部Java類的頂級父類。數據庫
實例化子類對象時系統會先調用父類的構造方法,而後再調用子類的構造方法。編程
– JVM默認會調用父類中無參數的構造方法,若父類中沒有無參數的構造方法,程序會報錯。後端
抽象類:
abstract修飾的類稱爲抽象類,抽象類的特色:
–不能實例化對象;
–類中能夠定義抽象方法(abstract修飾的方法);
–抽象類中能夠沒有抽象方法。
•abstract修飾的方法稱爲抽象方法,抽象方法只有方法的聲明沒有方法實現,即沒有方法體。包含抽象方法的類自己必須被聲明爲抽象的數組
子類繼承抽象類必須實現抽象類中全部的抽象方法,不然子類也必須定義爲抽象類。安全
接口:
Java中的接口是一系列方法的聲明,是一些方法特徵的集合,接口能夠看作是一種特殊的抽象類,其中包含常量和方法的聲明,而沒有變量和方法的實現網絡
– 一個類能夠同時實現多個接口;
– 一個接口能夠被多個無關的類實現;
– 一個類實現接口必須實現接口中全部的抽象方法,不然必須定義爲抽象類。
接口的繼承:
Java中接口能夠繼承接口,與類的繼承概念一致,一個接口繼承一個父接口就會繼承父接口中定義的全部方法和屬性。
• Java中接口的繼承是多繼承機制,即一個接口能夠同時繼承多個接口。
Class Class<T>
- java.lang.Class<T>
-
- Type Parameters:
-
T
- the type of the class modeled by thisClass
object. For example, the type ofString.class
isClass<String>
. UseClass<?>
if the class being modeled is unknown - Class 對象的方法
-
Object()
– 默認構造方法。
• clone()
– 建立並返回此對象的一個副本。
• equals(Object obj)
– 指示某個其餘對象是否與此對象「相等」。
• finalize()
– 當垃圾回收器肯定不存在對該對象的更多引用時,由對象的垃圾
回收器調用此方法。
• getClass()
– 返回一個對象的運行時類。hashCode()
–返回該對象的哈希碼值。
•notify()
–喚醒在此對象監視器上等待的單個線程。
•notifyAll()
–喚醒在此對象監視器上等待的全部線程。
•toString()
–返回該對象的字符串表示。
•wait()
–致使當前的線程等待,直到其餘線程調用此對象的notify() 方法或notifyAll() 方法。•wait(long timeout)
–致使當前的線程等待,直到其餘線程調用此對象的notify() 方法或notifyAll() 方法,或者超過指定的時間量。
•wait(long timeout, int nanos)
–致使當前的線程等待,直到其餘線程調用此對象的notify() 方法或notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量。
nanosecond: 十億分之一秒;
The amount of real time, measured in nanoseconds, is given by: 1000000*timeout+nanos
包裝器類
•Java中的八種基本數據類型自己只能表示一種數值,爲了能將基本類型視爲對象來處理,並能鏈接相關的方法,Java爲每一個基本類型提供了包裝類。
•Java的八種基本數據類型對應的包裝器類分別爲:Byte,Short,Character,Integer,Long,Float,Double,Boolean。
包裝器類型對象共同的特色:
–對象一旦賦值,其值不能再改變。
裝箱、拆箱
•在Java中一些運算或程序對數據類型是有限制的,好比:++/--操做符只能操做基本類型數據,集合中只能存放包裝器類型對象等等。
•思考:如何對Integer類型的數據進行++/--操做?
Integer y = new Integer (567);
intx = y.intValue();
x++;
y = new Integer(x);
基本數據類型的加寬帶來的方法重載問題
基本數據類型會被加寬到更寬泛的基本數據類型
–基本數據類型和對應的包裝器類型是不一樣的數據類型
自動裝箱帶來的方法重載問題
自動裝箱給方法的重載帶來了必定的難題;
可變元參數列表帶來的方法重載問題
可變元參數列表給方法的重載帶來了必定的難題;
重載方法調用規則
選擇重載時匹配哪一個方法時遵循如下原則:
–是否有直接匹配的
–是否加寬後直接可以匹配的
–是否裝箱後可以匹配的
–先裝箱後加寬後可否匹配
•能夠先裝箱,後加寬(int能夠經過Integer編程Object)
–是否有不定長參數可以匹配的
Static修飾符
聲明爲static的變量實質上就是全局變量
• 當聲明一個對象時,並不產生static變量的拷貝
• 該類全部的實例變量共享同一個static變量
• 在類裝載時,只分配一塊存儲空間,全部此類的對象均可
以操控此塊存儲空間
static{後面跟着一段代碼,這是用來進行顯式的靜態變量
初始化,這段代碼只會初始化一次,且在類被第一次裝載
時
• 涉及到繼承的時候,會先初始化父類的static變量,而後
是子類的
• 子類實例化對象時的執行順序
– 父類的靜態代碼塊
– 子類的靜態代碼塊
– 父類的構造方法
– 子類的構造方法
靜態類
• 一般一個普通類不容許聲明爲靜態的,只有一個內部類才能夠。
• 聲明爲靜態的內部類能夠直接做爲一個普通類來使用,而不需實例化一個外部類
static和final一塊兒使用
– static final用來修飾成員變量和成員方法,可簡單理解爲「全局常量」
– 對於變量,表示一旦賦值就不可修改,而且經過類名能夠訪問
– 對於方法,表示不可覆蓋,而且能夠經過類名直接訪問
內部類(inner class)
是定義在另外一個類中的類。
•內部類的特色:
–內部類是一種編譯時的語法,編譯後生成的兩個類是獨立的兩個類。(對於一個名爲outer的外部類和其內部定義的名爲inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類)。
–能夠自由訪問外部類的任何成員(包括私有成員),但外部類不能直接訪問內部類的成員。
–內部類可爲靜態,能夠用protected、private修飾,而外部類只能使用public和缺省的包訪問權限。
–用內部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現了比外部類的private還要小的訪問權限
枚舉Enum
Java中的enum本質就是一個clas
枚舉與類的區別:
枚舉不能夠實例化
一般只爲枚舉成員變量提供get方法,而不提供set方法
枚舉的特色:
數據集
–他們的數值在程序中是穩定的
–元素個數有限
•全部枚舉類都繼承了Enum類的方法
–toString
–Equals
–Hashcode
–…
–注:equals、hashcode方法是final 的,因此不能夠被枚舉重寫(只能夠繼承)。可是,能夠重寫toString方法
–Java 不容許使用= 爲枚舉常量賦值
除了不能繼承,基本上能夠將Enum 自做一個常規的類異常和斷言
異常和斷言
異常分爲2大類
–Error:描述了Java運行系統中的內部錯誤以及資源耗盡錯誤
•惟一的解決方法:盡力使程序安全地終止
–Exception:程序中須要關注的
•運行時錯誤(RuntimeException):在Java 虛擬機正常運行期間拋出的異常,由程序錯誤致使。Java編譯器容許程序中不對這類異常作出處理。
–錯誤的類型轉換
–數組下標越界
–訪問空指針
•其餘錯誤(如:IO異常、SQL異常):通常是外部錯誤,Java編譯器要求在程序中必須處理這類異常
異常處理的優點
Java採用異常類表示異常
–把異常狀況表示成異常類,能夠充分發揮類的可擴展和可重用的優點
•異常流程的代碼和正常流程的代碼分離,提升了程序的可讀性,簡化了程序的結構
•Java能夠靈活的處理異常,若是當前方法有能力處理異常,就捕獲並處理它,不然只需拋出異常,交由方法調用者來處理
異常處理機制
對於異常Java中提供了兩種常見的方式:
–捕獲異常
–拋出異常
斷言
•JavaSE1.4中引入的新特性,用於檢查程序的安全性。
•關鍵字assert、java.lang.AssertError類
•當須要在一個值爲FALSE時中斷當前操做的話,可使用斷言
–可看作是異常處理的高級形式,斷言的布爾狀態爲true則沒問題,若是爲false,則拋出AssertError異常。
•兩種形式
–assertExpression1
–assertExpression1:Expression2
•斷言在默認狀況下是關閉的,啓用斷言驗證假設須用到java命令的參數-ea
•在Eclipse中的run configuration中添加默認參數-ea
容器和泛型
集合 Java提供的這一套容器類,其中基本類型是List、Set、Queue和Map,這些對象類型也稱之爲集合類。
List :
列表(List ):關心的是索引
–對象按索引存儲
–能夠存儲重複元素
–具備與索引相關的一套方法
•主要實現類
–ArrayList:線性表
•快速迭代,少許插入刪除
–LinkedList:鏈表
•迭代速度慢,快速插入刪除
Set
•集(Set)是最簡單的一種集合:關心惟一性
–對象無序存儲
–不能存儲重複元素
•主要實現類
–HashSet:使用被插入對象的Hash碼
–LinkedHashSet:HashSet的ordered版本
–TreeSet:二叉樹結構,保證元素按照元素的天然順序進行升序排序
HashSet
•基於HashMap 實現的,HashSet 底層採用HashMap 來保存全部元素
•不容許有重複元素
•不關心集合中元素的順序
TreeSet
•TreeSet(樹集)相似HashSet(散列集)
•能夠以任意順序將元素插入到集合中
•對集合遍歷時,每一個值會自動的按照排序後的順序呈現
•添加操做速率比散列集慢(由於迭代器老是以排好序的順序訪問每一個元素)
Queue
•java.util.Queue
•隊列是一種特殊的線性表,只容許在表的前端(front,隊頭)進行刪除操做,而在表的後端(rear,隊尾)進行插入操做
•繼承了Collection接口
•LinkedList實現了Queue接口
Queue接口經常使用方法
•add(E e): 增長一個元素。成功時返回true,若是隊列已滿,則拋出一個IIIegaISlabEepeplian異常
•remove(): 移除並返回隊列頭部的元素。若是隊列爲空,則拋出一個NoSuchElementException異常
•Element(): 返回隊列頭部的元素。若是隊列爲空,則拋出一個NoSuchElementException異常
•offer(E e): 添加一個元素並返回true。若是隊列已滿,返回false
•poll(): 移除並返問隊列頭部的元素。若是隊列爲空,則返回null
•peek(): 返回隊列頭部的元素。若是隊列爲空,則返回null
•put(E e): 添加一個元素。若是隊列滿,則阻塞
•take(): 移除並返回隊列頭部的元素。若是隊列空,則阻塞
Map接口
•映射(Map)
–對象以鍵-值對(key-value)存儲
–key不容許有重複,value容許有重複
•Map中元素,能夠將key序列、value序列單獨抽取出來
–使用keySet()抽取key序列,將map中的全部keys生成一個Set。
–使用values()抽取value序列,將map中的全部values生成一個Collection。
HashMap
•基於哈希表的Map 接口的實現
•HashMap是非線程安全的
•經常使用方法:
–Object put(K key,V value)
–Object get(Object K)
–containsKey(Object K)
•遍歷HashMap
TreeMap
–基於紅黑樹實現
–按照元素的天然順序排序
•LinkedHashMap
–HashMap的ordered版本
迭代器(Iterator)
•Iterator:「輕量級」對象
•iterator()方法是java.lang.Iterable接口,被Collection繼承。
•主要功能:用於對容器的遍歷
•主要方法
–Boolean hasNext():判斷是否有能夠元素繼續迭代
–Object next():返回迭代的下一個元素
–void remove():從迭代器指向的集合中移除迭代器返回的最後一個元素
泛型
重寫hashCode和equals方法
hashCode契約
•equals方法比較相等的兩個對象hashCode返回值必須相同
•equals方法比較不相等的兩個對象hashCode返回值能夠不相同,也能夠相同
•若是沒有修改對象的equals比較內的任何屬性信息,則這個對象屢次調用hashCode返回相同結果
自反的: •對任意的x引用,x.equals(x)都應返回true
對稱的: •對任意的x、y引用,當且僅當x.equals(y)時,y.equals(x)才返回true
傳遞的: •對任意的x、y、z引用,若是x.equals(y)和y.equals(z)返回true,則z.equals(x)返回true
一致的:•對任意的x、y引用,對象中的信息沒有作修改的前提下屢次調用x.equals(y)返回一致的結果
非空: •對任意非NULL引用x,x.equals(null)返回false
泛型 引入:Generics
爲了提升代碼的重用性,用通用的數據類型Object來實現
•優勢
–靈活
–通用性強
•缺點
–處理值類型時,會出現裝箱、折箱操做,性能損失很是嚴重
–處理引用類型時,雖然沒有裝箱和折箱操做,但將用到數據類型的強制轉換操做,增長處理器的負擔
–若是處理數據是數組,數組中數據類型不一致
•運行時類型轉換異常
•編譯器沒法檢查出來
使用泛型
既加強代碼通用性,又避免編譯器沒法檢查編譯錯誤的問題——泛型
•泛型用一個通用的數據類型T來代替object,在類實例化時指定T的類型,運行時自動編譯爲本地代碼,運行效率和代碼質量都有很大提升,而且保證數據類型安全
•泛型的做用就是提升代碼的重用性,避免強制類型轉換,減小裝箱拆箱提升性能,減小錯誤
泛型(Generics)
–所謂泛型,即經過參數化類型來實如今同一份代碼上操做多種數據類型
–泛型編程是一種編程範式,它利用「參數化類型」將類型抽象化,從而實現更爲靈活的複用
–泛型賦予了代碼更強的類型安全,更好的複用,更高的效率,更清晰的約束
使用通配符(?)
•接受所聲明變量類型的任何子類型
–void addAnimal(List<? extends Animal> animals)
–Animal能夠是類或接口
•接受父類型的變量
–void addAnimal(List<? super Dog> animals)
–接受super右邊類型或其超類型
•List<?> 與List<? extents Object>徹底相同
•List<Object>與List<?>徹底不一樣
流和文件
程序如何與外部資源進行交互呢?
•例如:我但願讀取本地的一個文本文件顯示在屏幕上怎麼辦呢?
Java程序與外部交互的主要手段就是流!!
Java中流的處理
•在Java中對於不一樣的流提供了相應的處理類:
–字節輸入流:InputStream類
–字節輸出流:OutputStream類
–字符輸入流:Reader類
–字符輸出流:Writer類
根據操縱對象的類型分類
•字符流:讀取單位爲字符,由於數據編碼的不一樣,而有了對字符進行高效操做的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。讀取的字節數由字符編碼肯定。
•字節流:讀取單位爲字節,通常用於文件傳輸
只要處理純文本數據,優先考慮字符流,其餘的形式採用字節流。
Java中字符流的處理
• 字符流的輸入輸出主要以字符爲單位。主要用於外部設備
中字符序列的讀取和外部設備中字符序列的顯示。Java採
用16位的Unicode來表示字符串和字符。
• 對於字符流的資源比較單一,就是字符序列。
對象流:
序列化的概念
• Java容許咱們在內存中經過定義對象來保存對象狀態,可是當JVM中止時對象就沒法保存。
• 如何持久化保存對象狀態呢?
• Java對象序列化就可以幫助咱們實現該功能。在保存對象時把其轉換爲一組字節,等待須要時再將本身組裝回以前
的對象。
對象序列化注意事項
• 類必須實現Serializable或Externalizable接口才能被序列化
• 實現Serializable的類中如有不參與序列化的變量可用transient關鍵字修飾
• 用static修飾的靜態成員變量,不參加序列化過程
JDK8 新特性:日期
舊版本:Java中用於表示日期的類
–Date類
–Calendar類
•日期的格式化和解析
–DateFormate
–SimpleDateFormate
JDK8日期新特性
•新日期、時間的一些相關概念
–瞬時時間(Instant)
–持續時間(duration)
–日期(date)
–時間(time)
–時區(time-zone)
–時間段(Period)
新特性——日期
•java.time包
•關鍵類
–Instant——它表明的是時間戳
–LocalDate——不包含具體時間的日期,好比2014-01-14。它能夠用來存儲生日,週年記念日,入職日期等。
–LocalTime——它表明的是不含日期的時間
–LocalDateTime——它包含了日期及時間,不過仍是沒有偏移信息或者說時區。
–ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間爲基準的。
字符串解析
Java中字符串相關類包括:
– 字符串常量類
• java.lang.String
– 字符串變量類
• java.lang.StringBuffer
• java.lang.StringBuilder
• java.util.StringTokenizer
String類
• String是字符串常量類
– String對象的值一經賦值,其值不可變
– 指的是所指向的內存值不可修改,但能夠改變指向
• String類型變量的初始化
– 構造方法初始化
• String name= new String(「zhangxiao」);
– 字符串常量初始化
• String sex = 「男」;
• String類是final的,沒法被繼承
String中經常使用的字符串處理方法
• 字符串鏈接
– concat(String str)
– 「+」運算符
• 字符串查找
– indexOf (String str)
– lastIndexOf(String str)
– charAt(int indexOf)
– startsWith(String prefix)
• 字符串分割
– split(String regex):字符串分割
– compareTo(String str):字符串比較
– equalslgnoreCase(String str):忽略大小寫
字符串替換
– replace(char oldChar, char newChar)
• 字符串求子串
– substring(int beginIndex, int endIndex)
• 字符串大小寫轉換
– toUpperCase() 小寫轉大寫
– ToLowerCase()大寫轉小寫
StringBuffer類
StringBuffer類是一個字符串變量類
– StringBuffer對象的值能夠修改
– 主要用於對字符串作大量修改的操做時
• StringBuffer變量的初始化
– 構造方法初始化
– StringBuffer sb = new StringBuffer(「Hello」);
字符串鏈接
– append(Object obj)
• 字符串刪除
– delete(int start,int end)
• 字符串插入
– insert(int offset,Object obj)
• 字符串逆序
– reverse()
• 轉換爲String對象
– toString()
StringBuilder類
• StringBuilder類與StringBuffer類的方法調用是一致的。
• StringBuilder類與StringBuffer類的區別:
– StringBuffer是線程安全的
– StringBuilder是非線程安全的
StringTokenzier類
• StringTokenizer類主要用途是將字符串以定界符爲界,
分析爲一個個獨立的token(可理解爲單詞)。
• StringTokenizer中的定界符能夠本身指定。
• StringTokenizer經常使用的方法:
– hasMoreTokens:是否有更多的分隔符
– nextToken:返回下一個分隔符前的內容值
日期類:
Java中經常使用的表示日期的類有三個
– java.util.Date:JDK 1.1後,java.util.Date 類中的大多數方法已經不推薦使用。
– java.sql.Date:主要針對數據庫操做中的SQL使用,只有日期沒有時間部分。
– java.util.Calendar:翻譯爲中文稱爲「日曆」,JDK1.1以後Calendar逐步取代了java.util.Date類,提供了更多的方式來表示
日期和時間。
Date類
• java.util.Date類其實是一個包裹類,它包含的是一個長整型數據, 表示的是從GMT(格林尼治標準時間)1970年1
月1日00:00:00這一刻以前或者是以後經歷的毫秒數.
– Date類提供了兩個重載的構造方法
– Date():以本地當前時間構造一個Date對象。
– Date(long date):以距離基準(1970 年1 月1 日00:00:00 GMT)時間的毫秒值構造Date對象。
– Date date = new Date();
– System.out.println(date.getTime()); //獲得毫秒值
Calendar類
java.util.Calendar類中文翻譯爲「日曆」,Calendar類中定義了足夠的方法來表述日曆的規則。
– Calendar類的方便之處就在於其能夠靈活的設置和獲取日期對應的年、月、日、時、分、秒信息,而且能夠靈活的對日期進行加
減操做。
• Calendar是一個抽象類,Java中提供了Calendar的一個具體實現類GregorianCalendar。
• 建立Calendar類型對象:
– 經過其中的靜態方法Calendar.getInstance()。
– 獲得的對象是一個Calendar類的對象。
• Calendar中的set(int field)和get(int field)方法能夠用來
設置和讀取日期的特定部分
Calendar類屬性常量(一)
• HOUR:get 和set 的字段數字,指示上午或下午的小時
• DATE:set和get的字段數字,指示一個月中的某一天。
• MONTH:指示月份的get 和set 的字段數字。
• YEAR:指示年的get 和set 的字段數字。
• DAY_OF_MONTH:get 和set 的字段數字,指示一個月中的某天。
• DAY_OF_WEEK:get 和set 的字段數字,指示一個星期中的某天。
• DAY_OF_WEEK_IN_MONTH:get 和set 的字段數字,指示當前月中的第幾個星期。
DAY_OF_YEAR:get 和set 的字段數字,指示當前年中的天數。
• WEEK_OF_MONTH:get 和set 的字段數字,指示當前月中的星期數。
• WEEK_OF_YEAR:get 和set 的字段數字,指示當前年中的星期數。
• HOUR_OF_DAY:get 和set 的字段數字,指示一天中的小時。
• AM_PM:get 和set 的字段數字,指示HOUR 是在中午以前仍是在中午以後。
• PM:指示從中午到午夜以前這段時間的AM_PM 字段值
• AM:指示從午夜到中午以前這段時間的AM_PM 字段值
Calendar與Date的轉換
• 從一個Calendar 對象中獲取Date 對象
– Calendar calendar = Calendar.getInstance();
– Date date =calendar.getTime();
• 從一個Date對象得到Calendar對象
– Calendar calendar = Calendar.getInstance();
– Date date = new Date(long 型參數);
– calendar.setTime(date);
DateFormate
• DateFormat 是日期/時間格式化的抽象類,它以與語言
無關的方式格式化並解析日期或時間。
• DateFormate實例建立
– DateFormat df = DateFormat.getDateInstance(參數)
– 參數的取值
• DateFormat.SHORT 徹底爲數字,如12-9-10
• DateFormat.MEDIUM 較長,如2012-9-10
• DateFormat.LONG 更長,如2012年9月10日
• DateFormat.FULL 是徹底指定,如2012年9月10日星期一
• DateFormate格式化、解析日期的方法
– String format(Date date):格式化日期
– Date parse(String sateStr):解析字符串
線程和多線程
程序、進程、線程
–程序是一段靜態的代碼,是應用軟件執行的藍本;
–進程是程序的一次動態執行過程,它對應了從代碼加載、執行至執行完畢的一個完整過程,這個過程也是進程自己從產生、發展至消亡的過程
–線程是比進程更小的執行單位。進程在其執行過程當中,能夠產生多個線程,造成多條執行線索,每條線索,即每一個線程也有它自身的產生、存在和消亡的過程,也是一個動態的概念
Java中的線程
–若是main方法中沒有建立其餘的線程,那麼當main方法執行完最後一個語句,JVM就會結束Java應用程序——單線程
–若是main方法中又建立了其餘線程,那麼JVM就要在主線程和其餘線程之間輪流切換,JVM要等程序中全部線程都結束以後才結束程序——多線程
•多線程的優點:
–減輕編寫交互頻繁、涉及面多的程序的困難.
–程序的吞吐量會獲得改善.
–由多個處理器的系統,能夠併發運行不一樣的線程.(不然,任什麼時候刻只有一個線程在運行)
–「同時」執行是人的感受,在線程之間實際上輪換執行。
線程的生命週期
•線程完整的生命週期包括五個狀態:新建、就緒、運行、阻塞和死亡.
•新建狀態:線程對象已經建立,尚未在其上調用start()方法。
•可運行狀態:當線程調用start方法,但調度程序尚未把它選定爲運行線程時線程所處的狀態。
•運行狀態:線程調度程序從可運行池中選擇一個線程做爲當前線程時線程所處的狀態。這也是線程進入運行狀態的惟一方式
等待/阻塞/睡眠狀態:其共同點是:線程仍舊是活的,可是當前沒有條件運行。它是可運行的,當某件事件出現,他可能返回到可運行狀態。
•死亡狀態:當線程的run()方法完成時就認爲它死去。線程一旦死亡,就不能復生。一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。
Java中兩種建立線程的方式:
–繼承Thread類
•重寫run() 方法
•new一個線程對象
•調用對象的start() 啓動線程
實現Runnable接口
–實現run() 方法
–建立一個Runnable類的對象r,new MyRunnable()
–建立Thread類對象並將Runnable對象做爲參數,new Thread(r)
–調用Thread對象的start()啓動線程
反射
程序運行時,容許改變程序結構或變量類型——這種語言稱爲動態語言
– 從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言
– Java有着一個很是突出的動態相關機制:Reflection
在運行狀態中,對於任意一個類,都可以知道其全部屬性和方法;對於任意一個對象,都可以調用其任意一個方法;
——這種動態獲取信息以及動態調用對象的方法的功能稱爲java語言的反射機制
Java反射提供如下功能
1 在運行時判斷任意一個對象所屬的類
2 在運行時構造任意一個類的對象
3 在運行時判斷任意一個類所具備的成員變量和方法
4 在運行時調用任意一個對象的方法
5 生成動態代理
Java反射機制中設計的類
• Class:類的實例表示正在運行的Java 應用程序中的類和接口
• Field:提供有關類或接口的屬性的信息,以及對它的動態訪問權限
• Constructor:提供關於類的單個構造方法的信息以及對它的訪問權限
• Method:提供關於類或接口上單獨某個方法的信息
Class類
• Class 類十分特殊,其實例用以表達Java程序運行時的類和接口
• 獲取Class對象
– 經過Object的getClass()方法
– 經過Class的getSuperClass()方法
– 經過Class的靜態forName()方法
– 對於包裝器類型,經過類名.TYPE屬性
Java反射機制的應用
• 操做數據庫
– 動態建立SQL語句
• 解析XML
– 解析XML動態生成對象
• 動態代理
• 其它的框架中使用
– Struts框架、Spring框架、Hibernate框架
Java反射機制的缺點
• 主要的缺點是對性能有影響
– 使用反射基本上是一種解釋操做,您能夠告訴JVM您但願作什麼而且它知足您的要求。這類操做老是慢於直接執行相同的操做
Java8 新特性 --Lambda表達式
Lambda表達式是方法的實現
•Lambda表達式語法格式
([參數1],[參數2],…)->{ }
•做用:
–匿名內部類的簡化寫法
Lambda表達式的侷限性
–接口
–僅包含一個抽象方法
JDK8新特性——方法引用
方法引用可看作是一個Lambda表達式
•須要一個明確的目標類型充當功能性接口的實例
–被引用的方法與功能接口的SAM(Single Abstract Method) 參數、返回類型相匹配
•借用C++ 的做用域解析操做符「::」
•做用
–提升複雜的Lambda表達式的可讀性
–邏輯更清晰
方法簽名與功能性接口的SAM 一致 (SAM接口,即Single Abstract Method interfaces)
–功能接口有惟一的抽象方法
–引用方法的參數與抽象方法的參數列表相同
•例子:
Runnable r = MyProgram::main;
void main(String... args) 與run() 方法能配上對
方法引用形式
•靜態方法(ClassName::methName)
•對象的實例方法(instanceRef::methName)
•對象的super 方法(super::methName)
•類型的實例方法(ClassName::methName, 引用時和靜態方法是同樣的,但這裏的methName是個實例方法)
•類的構造方法(ClassName::new)
•數組的構造方法(TypeName[]::new)
JDK8新特性——Function與Stream
Function簡介
•函數接口(SAM)
–一種只定義了一個抽象方法的接口
–支持lambda表達式
•java.util.function包
–專門給新增的API使用的函數接口(>40個)
•新註釋@FunctionalInterface
–爲了強調接口是函數接口,防止往這個接口裏增長方法
Function接口的主要方法
–R apply(T t):將Function對象應用到輸入的參數上,而後返回計算結果。
•其餘方法
–andThen(Function after) 返回一個先執行當前函數對象apply方法再執行after函數對象apply方法的函數對象。
–compose(Function before)返回一個先執行before函數對象apply方法再執行當前函數對象apply方法的函數對象。
–identity() 返回一個執行了apply()方法以後只會返回輸入參數的函數對象
Stream接口
Stream接口
•java.util.stream包
–用不多的代碼完成許多複雜的功能
–經過流來遍歷集合
–從集合和數組來建立流
–聚合流的值
•更像具備Iterable的集合類,但行爲和集合類又有所不一樣
–Filter 過濾
–Sort 排序
–Map 映射
–Match 匹配
–Count 計數
–……
Stream接口引入目的
–爲何不在集合類實現這些操做,而是定義了全新的Stream API?
•Oracle官方解釋
–是集合類持有的全部元素都是存儲在內存中的,很是巨大的集合類會佔用大量的內存,而Stream的元素倒是在訪問的時候才被計算出來,這種「延遲計算」的特性有點相似Clojure的lazy-seq,佔用內存不多
–集合類的迭代邏輯是調用者負責,一般是for循環,而Stream的迭代是隱含在對Stream的各類操做中,例如map()。
Stream擴展
有多種方式生成Stream Source
•從Collection 和數組
–Collection.stream()
–Collection.parallelStream()
–Arrays.stream(T array) or Stream.of()
•從BufferedReader
–java.io.BufferedReader.lines()
有多種方式生成Stream Source
•靜態工廠
•java.util.stream.IntStream.range()
•java.nio.file.Files.walk()
•本身構建
–java.util.Spliterator
•其它
–Random.ints()
–BitSet.stream()
–Pattern.splitAsStream(java.lang.CharSequence)
–JarFile.stream()
其餘類和接口:
•Collector接口
•Collectors類
•IntStream接口
•DoubleStream接口
•……
Stream特性總結
•不是IO,不是集合框架,對集合對象功能的加強,它專一於對集合對象進行各類很是便利、高效的集合操做以及大批量數據操做
•借住於Lambda表達式,極大的提升編程效率和程序可讀性
•它不是數據結構也沒有內部存儲,只是用操做管道從source抓取數據
•它不修改本身所封裝的底層數據結構的數據。如filter操做會產生一個不包含被過濾元素的新Stream,而不是從source刪除那些元素
•全部Stream的操做必須以lambda表達式爲參數
Stream的特性
•很容易生成數組或list。
•惰性化。
•不少Stream操做是向後延遲的,一直到它弄清楚了最後須要多少數據纔會開始。
•Intermediate操做永遠是惰性化的。
•並行能力,當一個Stream是並行化的,就不須要再多寫多線程代碼,全部對它的操做會自動並行進行的
•能夠是無限的大小,limit(n)和findFirst這類的short-circuiting操做能夠對無限的Stream進行運算並很快完成。
Java8新特性 Annatation
Annatation做用
•幫助開發者提高代碼的質量和可讀性
•自動化代碼分析的準確性
•功能
–做爲特定的標記
–額外信息的載體
•Java 8 對Annotation 引入了兩項重要的改變
–Type Annotation
–Repeating Annotation
Annatation使用
•元註解
•註解的聲明
•註解的使用
•重複註解
Annatation使用——元註解
•不一樣於java中的註釋
•註解是一種類型,能夠對方法、類、參數、包、域以及變量等添加標記(即附上某些信息),以後經過反射將標記的信息提取出來以供使用
•java.lang.annotation包提供了4種元註解
@Target @Rentation @Document @Inherited
•@Target:表示該註解用於什麼位置,可選的參數是ElementType枚舉中的成員
–ElementType在SE1.8中又加入了兩個成員
TYPE_PARAMETER、TYPE_USE
TYPE 類型聲明(類,接口,enum)
FIELD 成員變量聲明(對象,屬性,enum的實例)
METHOD 方法聲明
PARAMETER 參數聲明
CONSTRUCTOR 構造器聲明
LOCAL_VARIABLE 局部變量聲明
ANNOTATION_TYPE 註解聲明
PACKAGE 包聲明
•@Retention: 表示須要在什麼級別保存該註解信息(生命週期),可選的參數是RetentionPolicy枚舉中的成員
SOURCE 停留在java源文件,會將被編譯器丟棄
CLASS 停留在class文件中,但會被VM丟棄
RUNTIME 內存中的字節碼,VM在運行期間保留註解
–注意,只有聲明爲RUNTIME,才能夠經過反射機制讀取註解的信息
•@Document: 將註解包含在Javadoc中
•@Inherited: 容許子類繼承父類中的註解,只針對CLASS級別的註解有效
註解的聲明
•語法——關鍵字@interface定義
•默認繼承Annotation接口
•元素:表示一些值,相似接口中無參的方法
•經過default提供默認值(不能爲null)
Annatation使用——註解的使用
•必須對註解內的元素進行賦值(有默認值的元素除外)
•註解只有一個元素且該元素的名稱是value的話,在使用註解的時候能夠省略"value="直接寫須要的值便可
Annatation使用——重複註解 @Repeatable•SE1.8引入了重複註解的特性–容許在聲明同一類型時屢次使用同一個註解