1. 程式人生 > >java新知識學習:

java新知識學習:

內聯 技術 正在執行 has-a 判斷 也有 裏的 編譯器 意思

技術分享圖片

內聯函數: 所謂內聯函數就是指函數在被調用的地方直接展開,編譯器在調用時不用像一般函數那樣,參數壓棧,返回時參數出棧以及資源釋放等,這樣提高了程序執行速度。 對應Java語言中也有一個關鍵字final來指明那個函數是內聯的。 內聯不一定好,當被指定為內聯的方法體很大時,展開的開銷可能就已經超過了普通函數調用調用的時間,引入了內聯反而降低了性能,因為在選擇這個關鍵字應該慎重些,不過,在以後高版本的JVM中,在處理內聯時做出了優化,它會根據方法的規模來確定是否展開調用。” String類StringBuffer,以及StringBudder類的註意點: String類可以直接賦值,但是StringBuffer,以及StringBudder類並不可以;只能通過創建新的對象或者痛毆哦個append方法;
字符串相加的底層實現,實際是通過StringBuffer類來進行append然後再調用toStirng方法; Map接口和Collection接口的註意點: Map接口和Collection接口是同一等級的 Collection -----List //有序可重復 -----LinkedList 非同步 ----ArrayList 非同步,實現了可變大小的元素數組 ----Vector 同步 ------Stack
-----Set //無序列不可重復 Map -----HashTable 同步,實現一個key--value映射的哈希表 -----HashMap 非同步, -----WeakHashMap 改進的HashMap,實現了“弱引用”,如果一個key不被引用,則被GC回收 https://zhidao.baidu.com/question/563120272.html?qbl=relate_question_0 服務器端:ServerSocket提供的實例 ServerSocket server = new ServerSocket(端口號)
客戶端:Socket提供的實例 Socket client = new Socket(IP地址,端口號) //創建Socket 客戶端對象 Socket s = new Socket("127.0.0.1",6666); //創建ServerSocket 服務器端對象。。 ServerSocket ss = new ServerSocket(6666); //監聽服務器連接 s = ss.accept(); 識別合法的構造方法: 1:構造方法可以被重載,一個構造方法可以通過this關鍵字調用另一個構造方法,this語句必須位於構造方法的第一行; 重載:方法的重載(overload):重載構成的條件:方法的名稱相同,但參數類型或參數個數不同,才能構成方法的重載。 2 當一個類中沒有定義任何構造方法,Java將自動提供一個缺省構造方法; 3 子類通過super關鍵字調用父類的一個構造方法; 4 當子類的某個構造方法沒有通過super關鍵字調用父類的構造方法,通過這個構造方法創建子類對象時,會自動先調用父類的缺省構造方法 5 構造方法不能被static、final、synchronized、abstract、native修飾,但可以被public、private、protected修飾; 6 構造方法不是類的成員方法; 7 構造方法不能被繼承。 8 java構造方法中的this關鍵字: 構造器的this指向同一個類中,用於調用同一個類中不同參數列表的另外一個構造器,必須放在第一行,否則會引起編譯錯誤! 9 java構造方法中的super關鍵字:構造方法的super關鍵字用於調用其父類的構造方法,子類默認調用父類的構造方法,也就是說super()是默認調用的,顯示調用必須放在構造方法第一行! 關於return語句: 結論一: return語句並不是函數的最終出口,如果有finally語句,這在return之後還會執行finally(return的值會暫存在棧裏面,等待finally執行後再返回) 結論二: finally裏面不建議放return語句,根據需要,return語句可以放在try和catch裏面和函數的最後。可行的做法有四: (1)return語句只在函數最後出現一次。 (2)return語句僅在try和catch裏面都出現。 (3)return語句僅在try和函數的最後都出現。 (4)return語句僅在catch和函數的最後都出現。 註意,除此之外的其他做法都是不可行的,編譯器會報錯 對象的初始化方式: 1.new時初始化 ; 2.靜態工廠 newInstance; 3.反射Class.forName(); 4.clone方式; 5.反序列化; 順序: 析構函數(destructor) :析構函數與 構造函數 相反,當對象結束其 生命周期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作(例如在建立對象時用new開辟了一片內存空間,應在退出前在析構函數中用delete釋放),java中的finalize()方法其實就是析構函數的代替者。Java中雖然有析構器,但是我們一般不需要程序員主動去調用,因為JVM的垃圾回收機制會自動完成垃圾回收,對象銷毀工作, Java多線程之內存可見性和原子性:Synchronized和Volatile的比較 內存模型:線程-工作內存,主內存; 2.什麽是原子性 一個操作是不可中斷的,要麽全部執行成功要麽全部執行失敗,比如銀行轉賬 3.什麽是可見性 當多個線程訪問同一變量時,一個線程修改了這個變量的值,其他線程就能夠立即看到修改的值 4.什麽是有序性 涉及指令重排序; volatile只保證多線程操作的可見性,和禁止了指令重排序,不保證原子性。 synchronized才保證了原子性和可見性。 1.volatile修飾的變量是讀可見性的,什麽意思呢,就是所有線程讀取該變量的值都是正確的,變量寫入這一動作,會被編譯成機器指令,並且,是先寫入到當前線程的工作內存而不是主內存(不懂的看看java 內存模型去),但是volatile修飾的變量的修改寫入動作會被直接寫入主內存,寫入的同時會通過總線發出信號宣告其他線程的內存區該變量的值無效(即過時的),當其他線程去讀該變量的值的時候,會發現工作內存的值過時了,就會到主內存去讀該變量的值,所以是讀可見性的。 2. 為什麽不是線程安全的呢?這是因為原子性問題,什麽是原子性?大家知道cpu工作是以時間片的方式分配cpu資源,當一個線程正在執行的時候,如果此時失去時間片,那麽它所有的工作都要暫停,原子性就是:一個完整不再能分割的操作。即使是時間片結束,也要完成當前的原子操作,否則不允許切換。 Synchronized:保證可見性和原子性, 在Java內存模型中,synchronized規定,線程在加鎖時 ,先清空工作內存→在主內存中拷貝最新變量的副本到工作內存→執行完代碼→將更改後的共享變量的值刷新到主內存中→釋放互斥鎖 。 public class StringDemo{ private static final String MESSAGE="taobao"; public static void main(String [] args) { String a ="tao"+"bao"; String b="tao"; String c="bao"; System.out.println(a==MESSAGE); //true System.out.println((b+c)==MESSAGE); //false } } intern() 方法會先檢查 String 池 ( 或者說成棧內存 ) 中是否存在相同的字符串常量,如果有就返回。 //1,字符串在java中存儲在字符串常量區中 2,==判斷的是對象引用是否是同一個引用,判斷字符串相等要用equals方法 首先判斷a==MESSAGE 同一份字符串常量在內存中只有一份,因此是同一地址,返回true 再次比較(b+c)==MESSAGE 這相當於 new String(b+c)==MESSAGE 這裏new了一個String對象,所以返回false 什麽是ResultSet? 結果集(ResultSet)是數據中查詢結果返回的一種對象,可以說結果集是一個存儲查詢結果的對象,但是結果集並不僅僅具有存儲的功能,他同時還具有操縱數據的功能,可能完成對數據的更新 ResultSet結果集讀取數據的方法主要是getXXX() ,他的參數可以使整型表示第幾列(是從1開始的),還可以是列名。 關於jsp生命周期: init()和destroy()方法分別在創建和銷毀時執行一次(僅此一次) service()方法是接收請求,返回響應的方法。每次請求都執行一次,該方法被HttpServlet封裝為doGet和doPost方法 關於抽象類的註意點:抽象類不能夠被實例化,可以用來初始化; 抽象類有構造函數的; 抽象類的構造函數用來初始化抽象類的一些字段,而這一切都在抽象類的派生類實例化之前發生。不僅如此,抽線類的構造函數還有一種巧妙應用:就是在其內部實現子類必須執行的代碼。 https://www.cnblogs.com/darrenji/p/3909144.html java類之間的關系有哪些: use-a 是依賴關系 has-a 一般是組合關系 is-a 一般是繼承關系 引用傳遞和值傳遞; 引用數據類型是引用傳遞(call by reference),基本數據類型是值傳遞(call by value) 值傳遞不可以改變原變量的內容和地址---》原因是java方法的形參傳遞都是傳遞原變量的副本,在方法中改變的是副本的值,而不適合原變量的 引用傳遞不可以改變原變量的地址,但可以改變原變量的內容---》原因是當副本的引用改變時,原變量 的引用並沒有發生變化,當副本改變內容時,由於副本引用指向的是原變量的地址空間,所以,原變量的內容發生變化。 結論:1.值傳遞不可以改變原變量的內容和地址; 2.引用傳遞不可以改變原變量的地址,但可以改變原變量的內容; 什麽是內存泄漏,內存泄漏的原因: 內存泄露(Memory Leak)是指一個不再被使用的對象或者變量還在內存中占有存儲空間。在C/C++語言中,內存泄露出現在開發人員忘記釋放已分配的內存就會造成內存泄露。在java語言中引入垃圾回收機制,有GC負責進行回收不再使用的對象,釋放內存。但是還是會存在內存泄露的問題。 內存泄露主要有兩種情況:1.在堆中申請的空間沒有釋放。2.對象已不再被使用(註意:這裏的不在被使用是指對程序來說沒有用處,如數據庫連接使用後沒有關。但是還是存在著引用),但是仍然在內存中保留著。GC機制的引入只能解決第一種情況,對於第2種情況無法保證不再使用的對象會被釋放。java語言中的內存泄露主要指第2種情況。 內存泄露的原因:1.靜態集合類。如HashMap和Vector。這些容器是靜態的,生命周期和程序的生命周期一致,那麽在容器中對象的生命周期也和其一樣,對象在程序結束之前將不能被釋放,從而會造成內存泄露。2.各種連接,如數據庫連接,網絡連接,IO連接,不再使用時如果連接不釋放容易造成內存泄露。3.監聽器,釋放對象時往往沒有相應的刪除監聽器,可能會導致內存泄露。 內存溢出(OOM)是指程序在申請內存時沒有足夠的內存供使用,進而導致程序崩潰這是結果描述。內存泄露(Memory Leak)最終會導致內存溢出。 技術分享圖片

java新知識學習: