程序,進程,線程
程序:Program,是一個指令的集合
進程:Process,(正在執行中的程序)是一個靜態的概念
進程是程序的一次靜態態執行過程, 佔用特定的地址空間.
每個進程都是獨立的,由3部分組成cpu,data,code
缺點:內存的浪費,cpu的負擔
線程:是進程中一個“單一的連續控制流程” (a single sThread,equential flow of control)/執行路徑
線程又被稱爲輕量級進程(lightweight process)。
Threads run at the same time, independently of one another
一個進程可擁有多個並行的(concurrent)線程
一個進程中的線程共享相同的內存單元/內存地址空間à可以訪問相同的變量和對象,而且它們從同一堆中分配對象à通信、數據交換、同步操作
由於線程間的通信是在同一地址空間上進行的,所以不需要額外的通信機制,這就使得通信更簡便而且信息傳遞的速度也更快。
一個進程中至少有一個線程
Thread和Runnable
繼承Thread類方式的缺點:那就是如果我們的類已經從一個類繼承(如小程序必須繼承自 Applet 類),則無法再繼承 Thread 類
通過Runnable接口實現多線程
優點:可以同時實現繼承。實現Runnable接口方式要通用一些。
1)避免單繼承
2)方便共享資源 同一份資源 多個代理訪問
對象流 ObjectinputstreamObjectOutputstream
1、類必須實現Serializable接口
2、給類加個序列化編號,給類定義一個標記,
新的修改後的類還可以操作曾經序列化的對象
3、靜態是不能被序列化的,
序列化只能對堆中的進行序列化 ,不能對“方
法區”中的進行序列化
4、不需要序列化的字段前加 transient
Java流的分類
1
2
3功能不同
節點流:可以直接從數據源或目的地讀寫數據。
處理流(包裝流):不直接連接到數據源或目的地,是其他流進行封裝。目的主要是簡化操作和提高性能。
節點流和處理流的關係
節點流處於io操作的第一線,所有操作必須通過他們進行
處理流可以對其他流進行處量(提高效率或操作靈活性)
各種流適用
文本文件的讀寫
用FileInputStream和FileOutputStream讀寫文本文件
用BufferedReader和BufferedWriter讀寫文本文件
二進制文件的讀寫
使用DataInputStream和DataOutputStream讀寫二進制文件以及基本數據類型數據的讀寫
對象的讀寫
使用ObjectInputStream和ObjectOutputStream讀寫對象(序列化與反序列化)
集合
Collection 接口存儲一組不唯一,無序的對象
List 接口存儲一組不唯一,有序(插入順序)的對象
Set 接口存儲一組唯一,無序的對象
Map接口存儲一組鍵值對象,提供key到value的映射
List接口的實現類
凡是可以操作索引的方法都是該體系特有方法
ArrayList實現了長度可變的數組,在內存中分配連續的空間。
優點:遍歷元素和隨機訪問元素的效率比較高
缺點:添加和刪除需要大量移動元素效率低,按照內容查詢效率低
LinkedList採用鏈表存儲方式。
優點:插入、刪除元素時效率比較高
缺點:遍歷和隨機訪問元素效率低下
Iterator 接口
可以使用Iterator遍歷的本質是什麼?
實現Iterable接口
所有實現了Collection接口的容器類都有一個iterator方法用以返回一個實現了Iterator接口的對象。
所有的集合類均未提供相應的遍歷方法,而是把遍歷交給迭代器完成。迭代器爲集合而生,專門實現集合遍歷
Iterator對象稱作迭代器,用以方便的實現對容器內元素的遍歷操作。
Iterator接口定義了3個方法:
boolean hasNext(); //判斷是否有元素沒有被遍歷
Object next(); //返回遊標當前位置的元素並將遊標移動到下一個位置
void remove(); //刪除遊標左面的元素,在執行完next之後該
//操作只能執行一次
Set接口
Set接口存儲一組唯一,無序的對象(存入和取出的順序不一定一致)
操作數據的方法與List類似,Set接口不存在get()方法
增 offerFirst(Object obj) offerLast(Object obj)
刪 pollFirst() pollLast()
查 peekFirst() peekLast()
link.getFirst(); //將元素移除後再取元素
HashSet: 採用Hashtable哈希表存儲結構
優點:添加速度快,查詢速度快,刪除速度快
缺點:無序
LinkedHashSet 採用哈希表存儲結構,同時使用鏈表維護次序
有序(添加順序)
TreeSet 採用二叉樹(紅黑樹)的存儲結構
優點:有序(排序後的升序)查詢速度比List快(按照內容查詢)
缺點:查詢速度沒有HashSet快
HashSet是如何保證元素的唯一性的呢?
答:是通過元素的兩個方法,hashCode和equals方法來完成
如果元素的HashCode值相同,纔會判斷equals是否爲true
如果元素的hashCode值不同,不會調用equals方法
爲什麼需要泛型
解決數據類型操作不統一產生的異常
使用泛型可以更好的去保護數據類型
Map
特點key-value映射
HashMap Key無序 唯一(Set) Value無序 不唯一(Collection)
LinkedHashMap 有序的HashMap 速度快
TreeMap 有序 速度沒有hash快
問題:Set與Map有關係嗎?
採用了相同的數據結構,只用於map的key存儲數據,以上是Set
增 put(key,value)
遍歷 keySet() entrySet() values()
Collections工具類
Collections和Collection不同,前者是集合的操作類,後者是集合接口
Collections提供的靜態方法
addAll():批量添加
sort():排序
binarySearch():二分查找
fill():替換
shuffle():隨機排序
reverse():逆續
集合和數組的比較
數組不是面向對象的,存在明顯的缺陷,集合彌補了數組的一些缺點,比數組更靈活更實用,可大大提高軟件的開發效率,而且不同的集合框架類可適用不同場合。具體如下:
1:數組能存放基本數據類型和對象,而集合類中只能存放對象。
2:數組容易固定無法動態改變,集合類容量動態改變。
3:數組無法判斷其中實際存有多少元素,length只告訴了數組的容量,而集合的size()可以確切知道元素的個數
4:集合有多種實現方式和不同適用場合,不像數組僅採用順序表方式
5:集合以類的形式存在,具有封裝、繼承、多態等類的特性,通過簡單的方法和屬性即可實現各種複雜操作,大大提高了軟件的開發效率。
Collection和Collections的區別
Collection是Java提供的集合接口,存儲一組不唯 一,無序的對象。它有兩個子接口List和Set。
Java還有一個Collections類,專門用來操作集合類,它提供了一系列的靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
ArrayList和LinkedList的聯繫和區別
ArrayList實現了長度可變的數組,在內存中分配連續空間。遍歷元素和隨機訪問元素效率比較高。
LinkedList採用鏈表存儲方式。插入、刪除元素效率比較高
Vector和ArrayList的聯繫和區別
實現原理相同,功能相同,都是長度可變的數組結構,很多時候可以互用
兩者的主要區別如下
Vector是早期的JDK接口,ArrayList是替代Vector的新接口
Vector線程安全,ArrayList重速度輕安全,線程非安全
長度需要增長時,Vector默認增長一倍,ArrayList增長50% (1.5+1)
HashMap和Hashtable的聯繫和區別
實現原理相同,功能相同,底層都是哈希表結構,查詢速度快,在很多情況下可以互用
兩者的主要區別如下
Hashtable是早期的JDK提供的接口,HashMap是新版的JDK提供的接口
Hashtable繼承Dictionary類,HashMap實現Map接口
Hashtable是線程安全,HashMap線程非安全
Hashtable不允許null值,HashMap允許null值
JDK1.5的新特性有哪些?
泛型
Foreach
自動拆/裝箱
枚舉
可變參數
靜態導入