1. 程式人生 > >1、java中自己覺得重要的部分——未完待續

1、java中自己覺得重要的部分——未完待續

一、JAVA基礎語言:

1、集合/容器部分:

1、Collection 增加、遍歷、刪除:

public interface Collection<E> extends Iterable<E> 



2、List:

public interface List<E> extends Collection<E> 


3、LinkedList——List——Collection:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable




4、ArrayList——List——Collection:

public class ArrayList<E> extends AbstractList<E>

        implements List<E>, RandomAccess, Cloneable, java.io.Serializable



5、Set:

public interface Set<E> extends Collection<E> 


6、LinkedHashSet——HashSet——Set——Collection:

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

public class HashSet<E>
    extends AbstractSet<E>

    implements Set<E>, Cloneable, java.io.Serializable

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {

public abstract class AbstractCollection<E> implements Collection<E> {



7、TreeSet——SortedSet——Set:

public class TreeSet<E> extends AbstractSet<E>

    implements NavigableSet<E>, Cloneable, java.io.Serializable

public interface NavigableSet<E> extends SortedSet<E> {

public interface SortedSet<E> extends Set<E> {


8、Map:


9、HashMap——Map:

public class HashMap<K,V> extends AbstractMap<K,V>

    implements Map<K,V>, Cloneable, Serializable {


10、TreeMap——SortedMap——Map:

public class TreeMap<K,V>
    extends AbstractMap<K,V>

    implements NavigableMap<K,V>, Cloneable, java.io.Serializable


11、ArrayList和Vector的區別?

答:
這兩個類都實現了List介面(List介面繼承了Collection介面),他們都是 有序集合,即儲存
在這兩個集合中的元素的位置都是有順序的,相當於一種動態的陣列,我們以後可以 按位
置索引號取出某個元素
,,並且其中的資料是 允許重複的,這是HashSet之類的集合的最大
不同處, HashSet之類的集合不可以按索引號去檢索其中的元素也不允許有重複的元素
本來題目問的與hashset沒有任何關係,但為了說清楚ArrayList與Vector的功能,我們使用對
比方式,更有利於說明問題)。
接著才說ArrayList與Vector的區別,這主要包括兩個方面: .
(1)同步性:
Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而ArrayList是執行緒序
不安全的,它的方法之間是執行緒不同步的。
如果只有一個執行緒會訪問到集合,那最好是使
用ArrayList,因為它不考慮執行緒安全,效率會高些;如果有多個執行緒會訪問到集合,那最
好是使用Vector,因為不需要我們自己再去考慮和編寫執行緒安全的程式碼。
備註:對於Vector&ArrayList、 Hashtable&HashMap,要記住執行緒安全的問題,記住Vector
與Hashtable是舊的,是java一誕生就提供了的,它們是執行緒安全的, ArrayList與HashMap是
java2時才提供的,它們是執行緒不安全的。所以,我們講課時先講老的。
(2)資料增長:
ArrayList與Vector都有一個初始的容量大小,當儲存進它們裡面的元素的個數超過了
容量時,就需要增加ArrayList與Vector的儲存空間,每次要增加儲存空間時,不是隻增加
一個儲存單元,而是增加多個儲存單元,每次增加的儲存單元的個數在記憶體空間利用與程
序效率之間要取得一定的平衡。 Vector預設增長為原來兩倍,而ArrayList的增長策略在文
檔中沒有明確規定(從原始碼看到的是增長為原來的1.5倍)
。 ArrayList與Vector都可以設
置初始的空間大小, Vector還可以設定增長的空間大小,而ArrayList沒有提供設定增長空
間的方法。

總結:即Vector增長原來的一倍, ArrayList增加原來的0.5倍。

12、 HashMap和Hashtable的區別?

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

一.歷史原因:

Hashtable是基於陳舊的Dictionary類的, HashMap是Java1.2引進的Map介面的一個實現

二.同步性:

Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的

三.值:

只有HashMap可以讓你將空值作為一個表的條目的key或value 


13、 List 和 Map 區別?

         一個是儲存單列資料的集合另一個是儲存鍵和值這樣的雙列資料的集合List中儲存的
資料是有順序,並且允許重複
; M ap中儲存的資料是沒有順序的,其鍵是不能重複的,它
的值是可以有重複的。


14、 List、 Map、 Set三個介面,存取元素時,各有什麼特點?

set:

        Set裡面不允許有重複的元素,所謂重複,即不能有兩個相等(注意,不是僅僅是相同)的物件

Set集合的add方法有一個boolean的返回值,當集合含有與某個,元素equals相等的元素時,此時add方法無法加入該元素,返回結果為false。

Set取元素時,沒法說取第幾個,只能以Iterator介面取得所有的元素,再逐一遍歷各個元素。

List:

        add(Obj e)方法時,先來後到的順序排序。

也可以插隊,即呼叫add(int index,Obje)方法。

一個物件可以被反覆儲存進List中,每呼叫一次add方法,這個物件就被插入進集合中一次,其實,並不是把這個物件本身儲存進了集合中,而是在集合中用一個索引變數指向這個物件。

List除了可以以Iterator介面取得所有的元素,再逐一遍歷各個元素之外,還可以呼叫get(index i)來明確說明取第幾個。

map:

        put(obj key,objvalue),每次儲存時,要儲存一對key/value,不能儲存重複的key,這個重複的規則也是按equals比較相等.

            取則可以根據key獲得相應的value,即get(Object key)返回值為key所對應的value。另外,也可以獲得所有的key的結合,還可以獲得所有的value的結合,還可以獲得key和value組合成的Map.Entry物件的集合。

總結:List 以特定次序來持有元素,可有重複元素。 Set 無法擁有重複元素,內部排序。 Map儲存key-value值, value可多值。


15、說出ArrayList,Vector, LinkedList的儲存效能和特性?

        說出ArrayList,Vector, LinkedList的儲存效能和特性ArrayList和Vector都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢。

Vector由於使用了synchronized方法(執行緒安全),通常效能上較ArrayList差。

LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。

LinkedList也是執行緒不安全的, LinkedList提供了一些方法,使得LinkedList可以被當作堆疊和佇列來使用


16、String StringBuffer StringBuilder

String:執行緒不安全—每次新建一個物件—頻繁拼接不建議用

StringBuffer:執行緒安全—每次結果都會對 StringBuffer 物件本身進行操作,而不是生成新的物件——頻繁操作字串可考慮使用

StringBuilder:執行緒不安全—與StringBuilder方法差不多——但是效率高

2、執行緒部分:

2、1程式——程序——多工——執行緒——併發——並行:

2、2執行緒生命週期:

新建(new)—就緒(start())—執行(執行run)—阻塞(sleep()\yield()\wait()\join())—消亡(正常結束\故障\異常)

2、3排程及優先順序:

排程分類:

    分時模型:分一個時間片給你

    搶佔模型:高優先順序執行(java支援的)

優先順序:1——10 10級 普通優先順序是5


2、4實現方式:

1、繼承Thread   2、實現Runnable介面   3、執行緒池建立

4、如何選取:

當你繼承了一個類了,那隻能用實現介面或則是執行緒池這種了嘛。


2、4併發/同步控制:

1、synchronized(對像){臨界程式碼塊}  共享變數是私有靜態變數。

2、public synchronized int fun1(){方法塊}

3、一個物件的互斥鎖在某一時刻只能被一個執行緒擁有,但一個執行緒同一時刻可以擁有多個物件的互斥鎖,擁有一個物件的互斥鎖後才可以呼叫互斥方法。


2、4通訊:

基本方法:

1、wait()

2、notify \notifyAll()

詳見:點選開啟連結


3、JVM部分(GC、類載入機制、記憶體):

3、1GC:

3、2類載入機制:

3、3記憶體:點選開啟連結

3、4執行:就是一個虛擬的計算機、處於JDK最底層,將.java檔案執行以後的二進位制檔案.class檔案翻譯成具體平臺的機器碼去執行,實現了”一次編譯到處執行的關鍵非同步“。

詳見:點選開啟連結


4、NIO/IO模式:

5、介面抽象類:

1、構造方法:抽象可以有、介面不可以有

2、成員方法:

     抽象類:可以有abstract的,也可以有一般的普通成員變數。

     介面:只能是public abstract 的。

3、成員變數:

     抽象類:private public protected 預設都行 final static 任意。

      介面:只能是public static final 。

4、單繼承多實現:一個類已經繼承了一個類,那隻能拿介面來實現一下了。

6、設計模式:

二、資料庫:

三、演算法資料結構P272:

1、時間複雜度:

2、連結串列、增、刪、查、改:

點選開啟連結

3、棧和佇列:

5、堆:

6、串:

7、樹遍歷與二叉樹性質、森林轉化、哈夫曼樹、哈夫曼編碼:

8、圖廣度優先、深度優先、最小生成樹(Kruskal、Prim):

9、查詢:順序查詢、有序查詢、分塊查詢

10、二叉排序樹:插入、刪除

11、B樹插入、刪除:

12、雜湊表:雜湊函式、各種方法

13、直接排序:直接插入排序、折半插入、表插入、希爾排序、

14、交換排序:氣泡排序、快速排序

15、選擇排序:簡單選擇排序、樹形選擇排序、堆排

16、歸併排序:

17、基數排序:多關鍵字排序、鏈式基數


四、J2EE:

1、jsp

1、1內建物件有哪些?

1、1、1 request:

request.getParameter();獲取引數

requet.getMethod():客戶提交方式

request.getProtocol();使用的協議

request.getRequestURL():請求字串客戶端的地址

request.getRemoteAddr():客戶端IP

request.getServerName():伺服器主機名

request.getServerPort();伺服器埠

request.getRemotoHost();客戶端主機名

request.getHeader("host");獲取協議定義頭資訊host

request.getHeader("user-agent");獲取定義頭資訊user-agent


1、1、2 response

<%response.setHeader("refresh","10");%>自動重新整理

<%response.setHeader("refresh","10;URL=index.jsp")%>頁面跳轉

<%response.sendRedirect("login.jsp")%>地址會變


1、1、3 out

1、1、4 session

1、生命週期:同一個瀏覽器各頁面的跳轉,伺服器為每一個session物件其實是給了一個ID,且唯一,關閉瀏覽器就結束。

2、方法:get/setAttribute()/removeAttribute()/getCreateTime()/setMaxInactionInterval()/invalidate()

3、應用:傳資料的時候使用

4、session ID唯一的保證:客戶訪問伺服器上的JSP頁面時,JSP容器會自動建立一個session物件,併為其分配一個唯一的ID,然後JSP容器還會將此ID傳到客戶端中儲存下來,具體儲存在cookie中。

5、JSP執行原理:JSP為每個客戶啟動一個執行緒,即JSP容器為每個執行緒分配不同的session物件,當客戶同一WEB應用的其他頁面,或則是從該伺服器轉到其他伺服器在回來的時候,不會重建Session,直到客戶關閉瀏覽器,伺服器上的session才被撤銷。


1、1、5 application

1、生命週期:一個WEB應用一個application,伺服器關閉,application被銷燬。

2、方法:

3、應用:存一些全域性資訊,一個網頁被訪問多少次

4、servletContext物件提供的服務:


1、1、6 page

1、1、7 pageContext

1、1、8 config

1、1、9  exception


1、2JSP執行過程:

1)首先,客戶端發出請求(request ),請求訪問JSP網頁

2)接著,JSP Container將要訪問的.JSP檔案 轉譯成Servlet的原始碼(.java檔案)

3)然後,將產生的Servlet的原始碼(.java檔案)經過編譯,生成.class檔案,並載入到記憶體執行

4)最後把結果響應(response )給客戶端

   執行JSP網頁檔案時,需要經過兩個時期:轉譯時期(TranslationTime)和請求時期(RequestTime)。

   轉譯時期:JSP轉譯成Servlet類(.class檔案)。

   請求時期:Servlet類(.class檔案)執行後,響應結果至客戶端。

  轉譯期間主要做了兩件事情:

   (1)將JSP網頁轉譯為Servlet原始碼(.java),此段稱為轉譯時期(Translation time);

   (2)將Servlet原始碼(.java)編譯成Servlet類(.class),此階段稱為編譯時期(Compilation time)。

其實,JSP就是一個Servlet。


1、3JSP的執行原理

(1)WEB容器JSP頁面的訪問請求時,它將把該訪問請求交給JSP引擎去處理。Tomcat中的JSP引擎就是一個Servlet程式,它負責解釋和執行JSP頁面。
(2)每個JSP頁面在第一次被訪問時,JSP引擎先將它翻譯成一個Servlet源程式接著再把這個Servlet源程式編譯成Servlet的class類檔案,然後再由WEB容器像呼叫普通Servlet程式一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程式。
(3)Tomcat 5把為JSP頁面建立的Servlet原始檔和class類檔案放置在“apache-tomcat-5.5.26\work\Catalina\localhost\<應用程式名>\”目錄中,Tomcat將JSP頁面翻譯成的Servlet的包名為org.apache.jsp(即:apache-tomcat-5.5.26\work\Catalina\localhost\org\apache\jsp\檔案下)


1、4JSP標籤:

<jsp:include>先編譯在插入

<%@ include file="url"%>先插入在編譯

<jsp:forward page="url">:重定向到另一頁面,位址列是當前的,內容是另一個頁面的。

<jsp:useBean>

<jsp:setProperty>

<jsp:getProperty>


1、5JSP亂碼

訪問引數亂碼:

<%String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")%>

表單提交資訊亂碼:

<%request.setCharacterEncoding("UTF-8")%>


2、servlet

2、1、生命週期(執行過程)?

詳見:點選開啟連結


3、struct


五、SSM

詳見:點選開啟連結

六、SSH

詳見:點選開啟連結

MH對比

詳見:點選開啟連結

七、專案:

1、電子檔案安全管理系統

2、基於微信小程式的教學輔助軟體

3、基於j2ee的網際網路金融平臺開發


八、概率統計:

1、期望

2、概率

九、計算機組成原理

十、作業系統

十一、計算機網路

1、兩個模型對應的協議及作用

OSI:

物理層:通過媒介傳輸位元,確定機械及電氣規範(位元Bit)

資料鏈路層:將位元組裝成幀和點到點的傳遞(幀Frame)

網路層:負責資料包從源到宿的傳遞和網際互連(包PackeT)

傳輸層:提供端到端的可靠報文傳遞和錯誤恢復(段Segment)

會話層:建立、管理和終止會話(會話協議資料單元SPDU)

表示層:對資料進行翻譯、加密和壓縮(表示協議資料單元PPDU)

應用層:允許訪問OSI環境的手段(應用協議資料單元APDU)


2、分層優點:

2、1將複雜的網路劃分為更容易管理的層。

2、2較低層為較高層提供服務。

2、3更容易討論學習每層具體的協議。

2、4層間有標準介面方便工程模組化。

2、5各層更好的互連。

2、6降低了複雜度,程式容易修改,開發產平更快。

3、三次握手/四次揮手:

更多詳見點選開啟連結


十二、個人發展潛力部分

1、閱讀原始碼:

1、1String 的 equals:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

1、先判斷是不是自己本身   2、再用instanceof判斷物件是不是String型別的  3、然後比兩個串的長度  4、值轉成陣列遍歷一次判斷每個字元是不是相同。


1、2 Thread/ Runnable的原始碼:

Runable:

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Thread:實現了Runnalbe



2、維護部落格

2、1  目前多是偏java語言基礎\設計模式\框架



3、在開發中遇到的問題