標籤:隱藏資料 table 有序 ret key 個數 字元流 比較大小 val
來源:locality,
http://www.jianshu.com/p/a0b8b6f17888
前言:
我相信每一個程式員都是為了生活而努力著的。很多人因為興趣,從此踏上了這條‘燒腦大行動’的金橋;也有很多人因為夢想和執著,奮不顧身融入這個職業;還有很多人因為被現實逼得太無奈,不得不為自己、為家人、為未來謀這麼一條坎坷的路。
這裡,我不去評價什麼,再說我也沒有資格去評價啊。言歸正傳,下面我寫這篇文章的定位是各位在場的讀者,如果你認為我接下來說的內容會跟書裡說的差不多,那麼請高抬貴腳移步它處,但是我相信你絕對不會這樣覺得的。不知道作為程式員的你們,是否還在抱著面試或者筆試題複習呢?是否還在抱著各種面試書亂翻呢?
我只說一點,面試的目的不是讓考官知道你怎麼樣,而是讓你自己清楚自己怎麼樣。也就是說你會什麼、能夠做什麼!舉個例子,如果你去面試Java工程師,你至少要會該職位的職能,而不是只會面面試、做做筆試題。所以,這就是我寫這篇文章的初衷!
一、基礎篇
1.物件導向的三大特性
繼承、封裝、多態
什麼是繼承?
①繼承是物件導向程式設計能夠提高軟體開發效率的重要原因之一。
②繼承是具有傳遞性的,就像現實中孫子不僅長得像爸爸而且還像他爺爺。
③繼承來的屬性和方法是隱式的,也就是在本類裡面是看不見的。
④一個類只能有一個父類,也就是類只能是單繼承。
⑤一個介面可以有多個父類,也就是介面可以是多繼承。
實際項目開發中,一個類繼承於另一個類,那麼前者就是後者的子類,反則反之。
什麼是封裝?
對象資料和操作該對象的指令都是對象自身的一部分,能夠實現儘可能對外部隱藏資料。
實際項目開發中,使用封裝最多的就是實體類,常常和JavaBean(類必須是具體的和公用的,並且具有無參數的構造器)一起使用。
那麼,實體類有那些東西呢?
答:私人的成員變數、無參數的構造器、有參數的構造器、setter和getters方法、重寫tostring方法、重寫hashCode和equals方法。
什麼是多態?
①多態就是對象擁有多種形態:引用多態和方法多態。
②引用多態:父類的引用可以指向本類對象、父類的引用可以指向子類的對象。
③方法多態:建立本類對象時,調用的方法為本類的方法;建立子類對象時,調用的方法為子類重寫的方法或者繼承的方法。
④存在多態的必要條件:繼承、重寫。
⑤多態的作用是消除類型之間的耦合關係。
在實際項目開發中,A類繼承B類,如果在A類中不重寫B類的方法的時候,輸出的仍舊是B類方法裡面的資訊(B b=new A());如果在A類中重寫B類的方法的時候,輸出的是A類方法裡面的資訊(B b=new A())。
2.Java集合架構樹
Collection介面:它是Java集合架構的一個根介面,也是List、Set和Queue介面的父介面。同時它定義了可用於操作List、Set和Queue的方法—增刪改查。
Map介面:它提供了一種映射關係,其中的元素是以索引值對(key-value)的形式儲存的。Map介面有一個重要的實作類別HashMap。
①在Map介面中的索引值對是以Entry類型的對象執行個體形式存在。
②在Map介面中索引值(Key值)是不可以重複的,value值卻可以重複,也就是存在多對一的關係。
③在Map介面中提供了分別返回Key值的集合、value值的集合以及Entry集合的方法。
④Map支援泛型,同時Key值和value值都是可以為null的。
⑤在HashMap中的Entry對象是無序排序的,這點特性和List介面是相反的。
⑥在HashMap中有且只能有一個Key值為null的映射。(註:key值是不能重複的)
List介面:List介面有一個重要的實作類別ArrayList(數組序列)。
①List是元素有序並且可以重複的集合。
②List可以精確的控制每個元素的插入位置,或刪除某個元素的位置。
Comparator介面:臨時的比較規則。如果某一個類要實現這個介面,那必然要實現它的Compare()方法。
Comparable介面:預設的比較規則。當實現了這個介面,則表示這個類的執行個體可以比較大小,可以進行自然排序。如果某一個類要實現這個介面,那必然要實現它的CompareTo()方法。
3.Java中的IO流
位元組流:
//一個位元組一個位元組的讀寫
FileInputStream in=new FileInputStream("源檔案");
FileOutputStream out=new FileOutputStream("目標檔案");
......
in.close();
out.close();
首先要記住,一旦使用了IO流最後一定要記得關閉,這是常識。
//利用緩衝區,高效的讀取位元組
BufferedInputStream in=new BufferedInputStream(new FileInputStream("源檔案");
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("目標檔案");
......
in.close();
out.close();
字元流:
InputStreamReader isr=new InputStreamReader(new FileInputStream("源檔案路徑"),"設定編碼");
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("目標檔案路徑"),"設定編碼");
......
osw.close();
isr.close();
也可以這樣寫:
FileReader fr=new FileReader("源檔案路徑");
FileWriter fw=new FileWriter("目標檔案路徑");
......
fr.close();
fw.close();
//利用緩衝區,高效的讀取字元
BufferedReader br=new BufferedReader(new FileReade("源檔案路徑");
PrintWriter pw=new PrintWriter("目標檔案路徑");
......
br.close();
pw.close();
序列化和還原序列化:
//對象的序列化
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
這裡的file指的是String file="檔案在項目中的路徑";
//對象的還原序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
4.Java的Socket通訊(多線程)
思路:
①首先建立伺服器端Socket,指定並偵聽某一個連接埠,然後迴圈監聽開始等待用戶端的串連….
②建立用戶端socket,指定伺服器位址和連接埠,然後擷取輸出資料流,向伺服器端發送請求,並關閉socket輸出資料流。
③服務端接收到用戶端的請求後,建立新線程並啟動。
④建立線程處理類,執行線程操作,擷取輸入資料流,服務端讀取用戶端使用者詳情,關閉資源。
⑤執行線程操作,擷取輸出資料流,響應用戶端請求,用戶端接受到服務端的響應,關閉資源。
簡單點講,就相當於我跟你說話(用戶端→服務端),你收到我說的話(服務端→線程處理類),大腦進行思考後(線程處理類),做出回答我的話(線程處理類→用戶端)。
5.關係型資料庫
資料庫的三範式:
①欄位不可分。
②有主鍵,非主鍵欄位依賴主鍵。
③非主鍵欄位不能互相依賴。
T-SQL:
在整個資料庫中,查詢操作佔據增刪改查的80%,而說到查詢,T-SQL語句自然不能少。上示。
增:
①插入單行
insert into <表名> (列名) values (列值)
②將現有的表資料添加到一個已有表
insert into <已有的新表> (列名) select <源表列名> from <源表名>
③直接拿現有表資料建立一個新表並填充
select <建立表列名> into <建立表名> from <源表名>
刪:
①刪除滿足條件的行
delete from <表名> where <刪除條件>
②刪除整個表
truncate table <表名>
註:刪除表的所有行,但表的結構、列、約束、索引等不會被刪除;不能用語有外建約束引用的表。
改:
①更新
update <表名> set <列名=更新值> where <更新條件>
子查詢:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
其中:
①SELECT * FROM t1 …稱為外查詢。
②SELECT column1 FROM t2 稱為子查詢。
所以,我們就說子查詢是嵌套在外查詢內部的。而事實上它也有可能在子查詢內部再嵌套一個或者多個子查詢。這裡要注意,子查詢必須出現在圓括弧之間哦。
面試的角度詮釋 Java 工程師(一)(上)