Java基礎總結

面向對象

面向對象是一種思想,是基於面向過程而言的,就是說面向對象是將功能等通過對象來實現,將功能封裝進對象之中,讓對象去實現具體的細節;這種思想是將數據作爲第一位,而方法或者說是算法作爲其次,這是對數據一種優化,操作起來更加的方便,簡化了過程。面向對象有三大特徵:封裝性、繼承性、多態性,其中封裝性指的是隱藏了對象的屬性和實現細節,僅對外提供公共的訪問方式,這樣就隔離了具體的變化,便於使用,提高了複用性和安全性。對於繼承性,就是兩種事物間存在着一定的所屬關係,那麼繼承的類就可以從被繼承的類中獲得一些屬性和方法;這就 提高了代碼的複用性。繼承是作爲多態的前提的。多態是說父類或接口的引用指向了子類對A象,這就提高了程序的擴展性,也就是說只要實現或繼承了同一個接口或類,那麼就可以使用父類中相應的方法,提高程序擴展性,但是多態有一點不好之處在於:父類引用不能訪問子類中的成員。

舉例來說:就是:比如說你要去飯店吃飯,你只需要飯店,找到飯店的服務員,跟她說你要吃什麼,然後叫會給你做出來讓你吃,你並不需要知道這個飯是怎麼錯的,你只需要面向這個服務員,告訴他你要吃什麼,然後他也只需要面向你吃完收到錢就好,不需要知道你怎麼對這個飯進行吃。

1、特點:

1:將複雜的事情簡單化。

2:面向對象將以前的過程中的執行者,變成了指揮者。

3:面向對象這種思想是符合現在人們思考習慣的一種思想。

2、面向對象的三大特徵:封裝,繼承、多態

1.封裝:只隱藏對象的屬性和實現細節,僅對外提供公共訪問方式

好處:將變化隔離、便於使用、提高複用性、提高安全性

原則:將不需要對外提供的內容隱藏起來;把屬性隱藏,提供公共方法對其訪問

2.繼承:提高代碼複用性;繼承是多態的前提

注:

①子類中所有的構造函數都會默認訪問父類中的空參數的構造函數,默認第一行有super();若無空參數構造函數,子類中需指定;另外,子類構造函數中可自己用this指定自身的其他構造函數。

3.多態

是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象

好處:提高了程序的擴展性

弊端:當父類引用指向子類對象時,雖提高了擴展性,但只能訪問父類中具備的方法,不可訪問子類中的方法;即訪問的侷限性。

前提:實現或繼承關係;覆寫父類方法。

 

一、集合

 

1、特點:存儲對象;長度可變;存儲對象的類型可不同;

2、集合框架

 

 

2Collection

1List有序的;元素可重複,有索引

(add(index,element)、add(index,Collection)、remove(index)、set(index,element)、get(index)、subList(from, to)、listIterator())

ArrayList:底層是數組結構,查詢快,增刪慢,不同步。

LinkedList:底層是鏈表結構,增刪快,查詢慢,不同步

addFist();addLast()  getFirst();getLast()

removeFirst();removeLast()獲取並刪除元素,無元素將拋異常:NoSuchElementException

替代的方法(JDK1.6):

offerFirst();offerLast();

peekFirst();peekLast();無元素返回null

pollFirst();pollLast();刪除並返回此元素,無元素返回null     

Vector:底層是數組結構,線程同步,被ArrayList取代了

注:了對於判斷是否存在,以及刪除等操作,以依賴的方法是元素的hashCodeequals方法

ArrayList判斷是否存在和刪除操作依賴的是equals方法

 

2Set:無序的,無索引,元素不可重複

HashSet:底層是哈希表,線程不同步,無序、高效

保證元素唯一性:通過元素的hashCode和equals方法。若hashCode值相同,則會判斷equals的結果是否爲true;hashCode不同,不會調用equals方法

LinkedHashSet:有序,是HashSet的子類

TreeSet:底層是二叉樹,可對元素進行排序,默認是自然順序

       保證唯一性:Comparable接口的compareTo方法的返回值

===TreeSet兩種排序方式:兩種方式都存在時,以比較器爲主

第一種:自然排序(默認排序):

       添加的對象需要實現Comparable接口,覆蓋compareTo方法

第二種:比較器

       添加的元素自身不具備比較性或不是想要的比較方式。將比較器作爲參數傳遞進去。

       定義一個類,實現Comparator接口,覆蓋compare方法。當主要條件相同時,比較次要條件。

 

3Map集合:

1HashTable:底層數據結構是哈希表,不可存入null鍵和null值。同步的

       Properties繼承自HashTable,可保存在流中或從流中加載,是集合和IO流的結合產物

2HashMap:底層數據結構是哈希表;允許使用null鍵和null值,不同步,效率高

       TreeMap

              底層數據結構時二叉樹,不同步,可排序

              Set很像,Set底層就是使用了Map集合

方法:

V put(K key, V value);  void putAll(Map m)

void clear();  V remove(Object key)

booleancontainsKey(Object key); containsValue(Object key); isEmpty()

V get(Object key); intsize(); Collection<V> values()

Set<K>keySet(); Set<Map.Entry<K,V>> entrySet()

 

2.3Map集合兩種取出方式:

第一種:Set<K> keySet()

       取出Map集合中的所有鍵放於Set集合中,然後再通過鍵取出對應的值

Set<String> keySet= map.keySet();

Iterator<String>it = keySet.iterator();

while(it.hasNext()){

       String key = it.next();

       String value = map.get(key);

//…..

}

第二種:Set<Map.Entry<K,V>> entrySet()

       取出Map集合中鍵值對的映射放於Set集合中,然後通過Map集合中的內部接口,然後通過其中的方法取出

Set<Map.Entry<String,String>>entrySet = map.entrySet();

Iterator<Map.Entry<String,String>>it = entrySet.iterator();

While(it.hasNext()){

       Map.Entry<String,String> entry = it.next();

       String key = entry.getKey();

       String value = entry.getValue();

       //……

}

 

2.4CollectionMap的區別:

Collection:單列集合,一次存一個元素

Map:雙列集合,一次存一對集合,兩個元素(對象)存在着映射關係

 

2.5、集合工具類:

Collections:操作集合(一般是list集合)的工具類。方法全爲靜態的

sort(List list);list集合進行排序;sort(List list, Comparator c)按指定比較器排序

fill(List list, T obj);將集合元素替換爲指定對象;

swap(List list, int I,int j)交換集合指定位置的元素

shuffle(List list); 隨機對集合元素排序

reverseOrder() :返回比較器,強行逆轉實現Comparable接口的對象自然順序

reverseOrder(Comparatorc):返回比較器,強行逆轉指定比較器的順序

 

2.6CollectionCollections的區別:

Collectionsjava.util下的工具類,實現對集合的查找、排序、替換、線程安全化等操作。

Collection:是java.util下的接口,是各種單列集合的父接口,實現此接口的有ListSet集合,存儲對象並對其進行操作。

 

3Arrays

       用於操作數組對象的工具類,全爲靜態方法

asList():將數組轉爲list集合

       好處:可通過list集合的方法操作數組中的元素:

isEmpty()contains()indexOf()set()

       弊端:數組長度固定,不可使用集合的增刪操作。

如果數組中存儲的是基本數據類型,asList會將數組整體作爲一個元素存入集合

集合轉爲數組:Collection.toArray()

       好處:限定了對集合中的元素進行增刪操作,只需獲取元素

 

二、IO流

1、結構:

  

字節流:InputStreamOutputStream

字符流:ReaderWriter

Reader:讀取字符流的抽象類

       BufferedReader:將字符存入緩衝區,再讀取

              LineNumberReader:帶行號的字符緩衝輸入流

       InputStreamReader:轉換流,字節流和字符流的橋樑,多在編碼的地方使用

              FileReader:讀取字符文件的便捷類。

 

Writer:寫入字符流的抽象類

       BufferedWriter:將字符存入緩衝區,再寫入

       OutputStreamWriter:轉換流,字節流和字符流的橋樑,多在編碼的地方使用

              FileWriter:寫入字符文件的便捷類。

 

InputStream:字節輸入流的所有類的超類

       ByteArrayInputStream:含緩衝數組,讀取內存中字節數組的數據,未涉及流

       FileInputStream:從文件中獲取輸入字節。媒體文件

              BufferedInputStream:帶有緩衝區的字節輸入流

              DataInputStream:數據輸入流,讀取基本數據類型的數據

       ObjectInputStream:用於讀取對象的輸入流

       PipedInputStream:管道流,線程間通信,與PipedOutputStream配合使用

       SequenceInputStream:合併流,將多個輸入流邏輯串聯。

OutputStream:此抽象類是表示輸出字節流的所有類的超類

       ByteArrayOutputStream:含緩衝數組,將數據寫入內存中的字節數組,未涉及流

       FileOutStream:文件輸出流,將數據寫入文件

              BufferedOutputStream:帶有緩衝區的字節輸出流

              PrintStream:打印流,作爲輸出打印

              DataOutputStream:數據輸出流,寫入基本數據類型的數據

       ObjectOutputStream:用於寫入對象的輸出流

       PipedOutputStream:管道流,線程間通信,與PipedInputStream配合使用

2、流操作規律:

       明確源和目的:

              數據源:讀取,InputStreamReader

              目的:寫入:OutStreamWriter

       數據是否是純文本:

              是:字符流,ReaderWriter

              否:字節流,InputStreamOutStream

       明確數據設備:

              源設備:內存、硬盤、鍵盤

              目的設備:內存、硬盤、控制檯

       是否提高效率:用BufferedXXX

3、轉換流:將字節轉換爲字符,可通過相應的編碼表獲得

       轉換流都涉及到字節流和編碼表

 

三、多線程

       進程和線程:

1)進程是靜態的,其實就是指開啓的一個程序;而線程是動態的,是真正執行的單元,執行的過程。其實我們平時看到的進程,是線程在執行着,因爲線程是作爲進程的一個單元存在的。

2)同樣作爲基本的執行單元,線程是劃分得比進程更小的執行單位。

3)每個進程都有一段專用的內存區域。與此相反,線程卻共享內存單元(包括代碼和數據),通過共享的內存單元來實現數據交換、實時通信與必要的同步操作。

1、創建線程的方式:

創建方式一:繼承Thread

    1:定義一個類繼承Thread

    2:覆蓋Thread中的run方法(將線程運行的代碼放入run方法中)。

    3:直接創建Thread的子類對象

    4:調用start方法(內部調用了線程的任務(run方法));作用:啓動線程,調用run方法

 

方式二:實現Runnable

    1:定義類實現Runnable接口

    2:覆蓋Runnable接口中的run方法,將線程的任務代碼封裝到run中

    3:通過Thread類創建線程對象

4、並將Runnable接口的子類對象作爲Thread類的構造函數參數進行傳遞

作爲參數傳遞的原因是讓線程對象明確要運行的run方法所屬的對象。

區別:

       繼承方式:線程代碼放在Thread子類的run方法中

       實現方式:線程存放在接口的子類run方法中;避免了單繼承的侷限性,建議使用。

2、線程狀態:

新建:start()

臨時狀態:具備cpu的執行資格,但是無執行權

運行狀態:具備CPU的執行權,可執行

凍結狀態:通過sleep或者wait使線程不具備執行資格,需要notify喚醒,並處於臨時狀態。

消亡狀態:run方法結束或者中斷了線程,使得線程死亡。

3、多線程安全問題:

多個線程共享同一數據,當某一線程執行多條語句時,其他線程也執行進來,導致數據在某一語句上被多次修改,執行到下一語句時,導致錯誤數據的產生。

因素:多個線程操作共享數據;多條語句操作同一數據

解決:

       原理:某一時間只讓某一線程執行完操作共享數據的所有語句。

       辦法:使用鎖機制:synchronizedlock對象

4、線程的同步:

當兩個或兩個以上的線程需要共享資源,他們需要某種方法來確定資源在某一刻僅被一個線程佔用,達到此目的的過程叫做同步(synchronization)。

同步代碼塊:synchronized(對象){},將需要同步的代碼放在大括號中,括號中的對象即爲鎖。

同步函數:放於函數上,修飾符之後,返回類型之前。

5waitsleep的區別:(執行權和鎖區分)

wait:可指定等待的時間,不指定須由notifynotifyAll喚醒。

       線程會釋放執行權,且釋放鎖。

sleep:必須制定睡眠的時間,時間到了自動處於臨時(阻塞)狀態。

       即使睡眠了,仍持有鎖,不會釋放執行權。

發佈了21 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章