1. 程式人生 > >4 java基礎知識

4 java基礎知識

否則 等待 精確 java 找到 break 減少 強制退出 sdi

4.1 基本概念 4.1.1 java 語言有點 4.1.2 Java 解釋型語言 c/c++ 編譯型語言 4.1.3 main方法 可以重名但類型等不能重復 4.1.5 static 初始化順序 : 父類靜態變量、父類靜態代碼塊、子類靜態變量、子類靜態代碼塊、父類非靜態變量、父類非靜態代碼塊、父類構造函數、子類非靜態變量、子類非靜態代碼塊、子類構造函數 代碼不需要加載 4.1.6 Java中的作用域 public:可以被其他所有類訪問 protected:可以被自身,子類,以及同一包下的類訪問。 default:可以被自身和同一包中的類訪問。 private:只可以被自身訪問。 4.1.8 構造函數不能被覆蓋 4.1.9 空的接口常作為 標識接口 4.1.10 clone() o = (Obj)super.clone() 4.1.11 反射機制 Class c = Class.forName("className"); className name = (className)c.newInstance(); a.method(); 4.1.12 package 4.1.13 利用接口實現類似指針功能 4.2 面向對象技術 4.2.1 面向對象與面向過程有什麽區別 1.出發點不同 2.層次邏輯關系不同 3.數據處理方式與控制程序方式不同。 4.分析設計與編碼轉換方式不同 4.2.2面向對象的特征 封裝、繼承、多態、抽象 4.2.3面向對象的開發方式有什麽優點 1.較高的開發效率 2.保證軟件的魯棒性 3.保證軟件的高可維護性 4.2.6 多態的實現機制 方法重載、方法覆蓋 4.2.8 抽象類與接口 ·包含抽象方法就是抽象類 變量默認static final類型 ·接口就是指一個方法的集合沒有方法體 4.2.9 內部類靜態內部類(可以直接使用不必先實現外部類)、成員內部類、局部內部類 4.2.10獲取父類名字 this.getClass().getSuperclass().getName() 4.2.11 this與super 4.3 關鍵字 4.3.2 brea、continue、return 中斷多層循環 out: 代碼 for() for() break out; 4.3.3 final、finally、finalize 一旦垃圾回收器準備好釋放對象占用的空間,首先調用其finalize()方法。 4.3.4 assert有什麽作用 assert 判定條件 : 錯誤提示 4.3.5 static關鍵詞 4.3.7 volatile 每次用到它修飾的塵緣變量後每次都從內存中取,而不是緩存 4.3.8 instanceof 是不是類(接口、抽象類、父類)的實例 4.3.9 strictfp 修飾類或者接口或者方法 精確浮點 4.4 基本類型與運算 4.4.1 基本數據類型 int、short、long、byte、float、double、char、boolean 4.4.2 不可變類 4.4.3 值傳遞與引用傳遞 4.4.4 不同數據類型的轉換有哪些規則 自動轉換規則
操作數1的類型 操作數2的類型 轉換後的類型
long byte short char int long
int byte short char int
float byte short int char long float
double byte short int long char float double
強制轉換規則
原操作數的類型 轉換後操作數的類型
byte char
char byte char
short byte char
int byte short char
long byte short char int
float byte short char int long
double byte short char int long double
4.4.7 Math類中的 round 加0.5向下取整 floor 向下取整 ceil 向上取整 4.4.8 ++i與I++ 4.4.9 >> 與 >>> 4.4.10 char與string編碼問題 Java Unicode編碼 char 一個字符占用兩個字符 string 英文占一個字節,漢字占用兩個字節 4.5 字符串與數組 4.5.1 new String(“abc”) 創建一個或者兩個 常量區及堆區 要看原先常量區是否有原先有“abc”字符串 4.5.2
  • == 判斷兩個變量值是否相等 不適合判斷對象 適合判斷基本類型或引用
  • equals object對象提供的方法判斷內容是否相等
  • hashCode 將地址轉換成int
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; } 4.5.3
  • Character 用於單個字符串
  • String
    • 值不可變
    • 可以直接賦值初始化也可以構造函數初始化
    • 修改值時會調用StringBuffer方法
    • 由於值不可變(常量)所以線程安全
  • StringBuffer (字符串緩存區)
    • 值可變
    • 只能構造函數初始化
    • 線程安全 (使用synchronized同步)
  • StringBuilder
    • 與StringBuffer相似
    • 但線程不安全
4.5.4 數組是對象 有屬性(length)及方法(clone)可調用 4.5.5數組聲明及初始化
  • 聲明 type[] arrayName 或 type arrayName[] (不推薦)
  • 數組創建後會有初始值
  • 聲明之後不會分配內存
  • arrayName = new type[arraySize] 分配內存的方法
  • 初始化方法 int[] a = new int[5] 或者 int[] a = {1,2,3,4,5}
  • 也可以分開寫
    • int[] a; a = new int[5];
    • int[] a ; a = new int[]{1,2,3,4,5};
  • 二維數組
    • 可以 int[][] a = new int[2][]; 數組內可變長度
    • a[0] = new int[]{1,2,3};
    • a[1] = new int[]{1};
4.5.6
  • StringName.length() 獲取字符串的長度
  • arrayName.length 獲取數組長度
  • size 計算對象大小
4.6 異常處理 4.6.1 finally 什麽時候被調用
  • finally 在執行return方法之前執行
  • finally的return會覆蓋try或catch裏面的return
  • return的值會存儲到一個位置 所以finally對返回值操作可以有影響 (可以當作存的是指針)
    • 當返回類型為基本數據類型時,沒有影響
    • 引用類型時 (改變引用類型的值 不是改變引用)會有變化
  • finally不一定被執行
    • 進入try之前就發生了異常
    • 在try會catch中強制退出 (System.exit(0))
4.6.2 異常處理原理
  • 異常時程序在運行時發生的錯誤,JVM會拋出
  • java語言將異常當作對象來處理
  • 違反語義規則包括兩種情況
    • 一種是java類庫內值的語義檢查
    • 另一種是開發人員擴展這種語義檢查
  • 異常繼承圖
技術分享圖片

4.6.3運行時異常和普通異常的區別
  • Error
    • 屬於在運行期間發生了特別嚴重的錯誤
    • 會導致程序終止
    • 是由於邏輯錯誤導致的
    • 不推薦捕獲
    • 應當解決錯誤
  • Exception
    • 表示可恢復的錯誤
    • 編譯器可以捕獲到
    • 兩類
      • 檢查異常 編譯器強制捕獲
      • 運行時異常 編譯器沒有強制對其捕獲
  • 異常處理註意事項
    • 捕獲異常應先捕獲子類,然後再捕獲父類
    • 盡早拋出異常
    • 可根據實際需求自定義異常
    • 異常能處理就處理,不能處理就拋出
4.7 輸入輸出流 4.7.1 Java IO 流的實現機制
  • 流的兩大類
    • 字節流 (8 bit 為單位) 不會用到緩存
      • InputStream(輸入流)
      • OutputStream (輸出流)
    • 字符流 (16 bit) 一次可讀性多個字節 緩存機制
      • Reader (輸入流)
      • Writer (輸出流)
  • 讀取文件 FileInputStream(“test.txt”);
4.7.2 管理文件和目錄的類
方法 作用
File(String pathname) 根據制定的路徑創建File對象
createNewFile() 若目錄存在,則返回false,否則穿件文件或者文件夾
delete() 刪除文件或者文件夾
isFlie() 判斷這個對象表示的是否是文件
isDirectory() 判斷這個對象表示的是否是文件夾
listFiles() 若是文件夾,列出所有文件
mkdir() 根據當前對象指定的路徑創建目錄
exists() 判斷對象對象應的文件是否存在
4.7.3 Java Socket
  • 網絡七層結構
技術分享圖片
  • Socket可分為兩種
    • TCP 面向連接的Socket通信協議
    • UDP 面向無連接的Socket通信協議
4.7.4 Java NIO 非阻塞IO 4.7.5 什麽是java序列化 實現持久化的方式
  • 序列化
    • 使用方式 實現Serializable接口
    • 序列化的兩個特點
      • 如果一個類被序列化了其子類也能被序列化
      • static、transient(臨時數據),不能被序列化
    • 什麽時候需要序列化
      • 需要通過網絡來發送對象,或對象的狀態需要被持久化到數據庫或文件中。
      • 序列化能實現深復制,即復制引用對象。
  • 外部序列化
4.7.6 System.out.println() 註意事項
  • 輸出的是字符串
  • 想輸出對象需要定義 toString()方法
4.8 Java 平臺與內存管理 4.8.1 java平臺獨立性語言
  • 環境次序 Java程序、JRE/JVM、操作系統、硬件
4.8.3 JVM 家在 class 文件的原理機制
  • 三類 加載器(系統類加載器、擴展類加載器、自定義類加載器)
    • Bootstrap Loader -負責家在系統類(jre/lib/rt.jar的類)
    • ExtClassLoader -負責加載擴展類(jar/lib/ext/*.jar 的類)
    • AppClassLoader -負責加載應用類(classpath 指定的目錄或 jar 中的類)
  • 加載器優先由上級加載器加載,如果沒有找到向下降級
  • 加載器加載步驟
    • 裝載。根據查找路徑找到相對的class文件,然後導入。
    • 鏈接。鏈接分為三個小步驟。
      • 檢查。檢查待加載的class文件的正確性。
      • 準備。給類中的靜態變量分配內存空間。
      • 解析。給符號引用轉換成直接引用。(可選)
    • 初始化。對靜態變量和靜態代碼塊執行初始化工作。
4.8.4 什麽是GC
  • 垃圾回收算法
    • 引用計數算法:沒有引用時回收,由於無法解決相互引用的問題,JVM沒有采用。
    • 追蹤回收算法:使用對象引用圖沒有被引用的回收。
    • 壓縮回收算法:把堆中活動的對象移動到堆的另一端。
    • 復制回收算法:將堆分成連個相同的區,一個滿了後將活動的對象復制到另一個區。
    • 按代回收算法:青年代、老年代、持久代。
  • System.gc() 通知垃圾回收運行,但未必馬上運行垃圾回收。
4.8.5 java是否存在內存泄漏
  • 內存泄漏的兩種情況
    • 堆申請的內存沒有釋放(java已經解決)
    • 對象不在被使用但內存中仍然保留。
  • 引發內存泄漏的原因
    • 靜態集合類,例如HsahMap和Vector。這些為靜態容器,生命周期和程序一樣長。
    • 各種鏈接沒有關閉。
    • 監聽器,刪除對象時沒有相應的刪除監聽器。
    • 變量不合理的作用域。
    • 單例模式可能會導致內存泄漏。
3.8.6 java中堆和棧有什麽區別
    • 局部的基本類型以及對象的引用
    • 引用的變量內存
    • 對象 包括對象內的變量引用(基本類型也存在堆區)
4.9 容器 技術分享圖片 4.9.1 Java Collections框架是什麽
  • Set 集合
    • HashSet
    • TreeSet
  • List 列表
    • LinkedList
    • ArrayList
    • Vector
  • Map
    • HashMap
    • TreeMap
    • LinkedHashMap 采用列表維護內部順序
    • WeakHashMap
    • IdentityHashMap
4.9.2 什麽是叠代器
  • 不暴露內部細節
  • 使用註意事項
    • 通過iterator()方法返回iterator,next()獲取下一個。
    • hasNext() 判斷是否還有新的元素
    • remove()刪除返回的元素
  • 單線程解決ConcurrentModificationException異常,把想要刪除的元素保存到一個集合中,然後使用removeAll()方法全部移除
  • 多線程解決ConcurrentModificationException異常,使用synchronized同步或者ConcurrentHashMap等安全容器。
  • Iterator和ListIterator的區別,Iterator只能正向遍歷,適用於修改;ListIterator可以雙向同時支持修改
4.9.3 ArrayList、Vector和LinkedList 有什麽區別
  • 均為可伸縮數組
  • ArrayList、Vector基於Object[] array
    • Vector默認擴展到原先的2倍(可以設置擴展方法)大多數方法使用synchronization同步,線程安全
    • ArrayList默認擴展到原先的1.5倍(沒有設置擴展方法)線程不安全
  • LinkedList采用雙向列表實現,非線程安全
4.9.4 HashMap、HashTable、TreeMap和WeakHashMap 有哪些區別
  • HashMap 非線程安全、允許null為鍵值、使用Iterator遍歷、默認大小是11 增加方式是old*2+1
  • HashTable 線程安全、不允許null為鍵值、使用Enumeration遍歷、默認大小是16而且一定是2的指數
  • WeakHashMap與HashMap相似,WeakHashMap采用弱引用方式,當key不再被外部引用就可以被垃圾??回收。
  • HashMap實現線程安全, Map m = Collections.synchronizedMap(new HashMap());
4.9.5 Map註意事項
  • key不能重復
4.9.6 Collection和Collections有什麽區別
  • Collection是集合接口。
  • Collections是針對集合的包裝類。它提供了一系列靜態方法以實現對各種集合的操作。
4.10 多線程 4.10.1 什麽是多線程
  • 程序執行是的最小單元 (進程是資源分配的基本單位)
  • 棧是獨立的,其他是共享的
  • 一個進程可擁有多個線程
  • 線程的四種狀態:運行、就緒、掛起和結束。
  • 新建狀態(New)、就緒狀態(Runnable)、運行狀態(Running)、阻塞狀態(Blocked)、死亡狀態(Dead)
  • 多線程優點:
    • 減少程序響應時間
    • 線程創建和切換開銷更小
    • 多CPU有多線程執行能力
    • 簡化程序結構
4.10.2 同步和異步有什麽區別 4.10.3 如何實現多線程
  • 繼承Thread類,重寫run()方法。
Thread myThread = new Thread(){ public void run() { //do something } }; myThread.start();
  • 實現Runnable接口,並實現該接口的run()方法。(推薦)
public class testMain { public static void main(String[] args) { MyThread thread = new MyThread(); Thread t = new Thread(thread); t.start(); } } class MyThread implements Runnable{ public void run() { //do something } }
  • 實現Callable接口,重寫call()方法。
    • Callable 比 Runnable更強大
    • Callable可以在任務結束後返回一個值
    • Callable中的call()方法可以拋出異常
    • 運行時Callable可以拿到一個Future對象。
public class testMain { public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor(); //啟動線程 Future<String> future = threadPool.submit(new MyThread()); try { System.out.println("wating!"); System.out.println(future.get());//等待線程結束返回結果集 } catch (Exception e) { e.printStackTrace(); } } } class MyThread implements Callable<String> { public String call() throws Exception { System.out.println("go"); return "Hello World"; } }
  • 推薦使用實現Runnable接口方式。
    • 使用繼承Thread也需要重寫run()方法。
    • 濫用繼承是個壞習慣
  • 可以既繼承Thread類又實現Runnable接口,不必須寫run()方法,因為從Thread類繼承了run()方法;
4.10.4 run()方法和start()方法有什麽區別
  • start()開始一個線程,異步的調用run()方法
  • 直接調用run()則認為是普通函數調用
4.10.5 多線程同步的實現方法
  • synchronized關鍵字
    • synchronized方法
      • public synchronized void mutiThreadAccess()
    • synchronized塊
      • synchronized(syncObject){
//訪問syncObject對象的代碼 }
  • wait()和notify()
    • wait()自己停止爭搶線程,釋放資源
    • notify()喚醒等待隊列中的第一個線程
    • notifyAll()喚醒所有的等待線程
  • Lock
    • lock() 以阻塞的方式獲取鎖,如果沒獲取到等待,獲取到立刻返回。
    • tryLock() 嘗試一下,獲取到了返回true,沒有返回false
    • tryLock(long timeout,TimeUnit unit)在一段時間內嘗試
    • lockInterruptibly() 與lock()相似但可以被其他線程中斷,會收到InterruptedException異常。
      • 演示
      • 技術分享圖片
4.10.6 sleep()方法與wait()方法有什麽區別
  • sleep() 不推薦使用
    • 是Thread的靜態方法,
    • 暫停執行把執行機會讓給其他線程,時間到自動蘇醒,
    • 不涉及線程間的通信
    • 不釋放鎖
    • 可以放在任何地方
    • 必須捕獲異常
  • wait()
    • 是Object的方法,
    • 可使用notify()喚醒或設定時間,
    • 用於線程通信
    • 釋放鎖
    • wait()只能放在同步方法或同步塊中
  • yield() 暫停當前正在執行的線程對象,並執行其他線程。 讓優先級更高的線程運行
  • yield()和sleep()的區別
    • sleep()不考慮優先級 yield()考慮
    • sleep()在時間內不會被執行, yield()沒有時間限制可能立即被執行
    • sleep()會拋出InterruptedException異常。
    • sleep()有更好的可移植性。
4.10.7 終止線程的方法有哪些
  • 不建議
    • stop() 會釋放資源
    • suspend() 不會釋放鎖資源
  • 使用 flag標誌
技術分享圖片
  • 使用休眠模擬阻塞
  • 技術分享圖片
4.10.8 Lock和synchronixed有什麽區別
  • 用法不同synchronized可以下載方法前或者寫成代碼塊,Lock需要寫在起始和終止位置。
  • 性能不同,不激烈的情況下synchronized優秀,激烈的情況下Lock更好用。
  • 鎖機制不同Lock需要人為的開啟釋放,synchronixed不需要。
  • 使用事例
技術分享圖片 4.10.9 守護進程
  • 用戶進程都結束了,守護進程也會結束。
  • 通過setDaemon(true) 設置該線程為守護線程。
4.10.10 join()方法的作用是什麽
  • join的作用是線程合並,用於實現同步,等待線程結束。
  • 也可以添加參數join(2000)表示最多等待2s。
4.11 Java數據庫操作 4.11.1 如何通過JDBC訪問數據庫
  • 步驟
    • 加載JDBC驅動器,既導包
    • 加載JDBC驅動,一般使用反射Class.forName(String driveName)
    • 建立數據庫連接,取得Connection對象,一般通過DriverManager.getConnection(url, username,passwd)
    • 建立Statement對象或者PreparedStatement對象。
    • 執行SQL語句。
    • 訪問結果集ResultSet對象。
    • 關閉
    • 事例
技術分享圖片
技術分享圖片 技術分享圖片 4.11.2 JDBC處理事務的方法
  • 通過commit()和rollback()結束事務。
  • 可通過setAutoCommit(false) 設置不自動提交
  • 事務隔離級別
    • TRANSACTION_NONE 說明不支持事務。
    • TRANSACTION_READ_UNCOMMITTED 說明在提交前一個事務可以看到另一個事務的變化。這樣臟讀、不可重復的讀和虛讀都是允許的。
    • TRANSACTION_READ_COMMITTED 說明讀取未提交的數據是不允許的。這個級別仍然允許不可重復的讀和虛讀產生。
    • TRANSACTION_REPEATABLE_READ 說明事務保證能夠再次讀取相同的數據而不會失敗,但虛讀仍然會出現。
    • TRANSACTION_SERIALIZABLE 是最高的事務級別,它防止臟讀、不可重復的讀和虛讀。
4.11.3 Class.forName()的作用是什麽
  • 把類加載到JVM虛擬機
4.11.4 Statement、PreparedStatement和CallableStatement區別
  • Statement 用於執行不帶參數的SQL語句。
  • PreparedStatement執行帶參數語句,預編譯,預防sql註入。
  • CallableStatement提供了調用存儲過程的接口。
4.11.5 getString()與getObject()的區別
  • getString()等會在數據集合非常大的時候發生異常,因為會一次性讀取到內存。
  • getObject()不是一次性讀取到內存。
4.11.6 JDBC註意事項
  • 先連接
  • 記得關閉連接
  • 創建Statement的語句放在循環外面
4.11.7 什麽是JDO
  • Java數據數據對象
  • 是一種用於存儲某種數據倉儲的對象的標準化API。
4.11.8 JDBC和Hibernate的區別
  • Hibernate是對JDBC的封裝

4 java基礎知識