八種基本數據類型
- byte
- short
- int
- long
- boolean
- char
- float
- double
JAVA數組
-
定義數組java
- 元素類型[] 數組名 = new 元素類型[元素個數和數組長度];
- 元素類型[] 數組名 = new 元素類型[]{元素1, 元素2, 元素3, 元素4};
JAVA內存的劃分
- 寄存器
- 本地方法區
- 方法區
-
棧內存設計模式
- 存儲局部變量, 變量所屬做用域一旦結束, 變量自動釋放
- 方法進棧: 局部變量屬於方法, 因此方法要先進棧
-
堆內存數組
- 存儲對象, 凡是new創建的都在堆中
- 堆內存中的對象都有一個默認值, int:0, double:0.0, float:0.0f, boolean:false, char:'u0000', 引用類型: null
- 每個實體都有首地址值
局部代碼塊
面向對象
成員變量和局部變量區別
- 成員變量定義在類中, 整個類中均可以訪問.
- 局部變量定義在函數, 語句, 局部代碼塊中, 只在所屬區域中有效
- 成員變量存在堆內存的對象中
- 局部變量存在棧內存的方法中
- 成員變量隨着對象的建立而存在, 隨着對象的消失而消失
- 局部變量隨着所屬區域的執行而存在, 隨着所屬區域的結束而釋放
- 成員變量有默認初始化值
8. 局部變量沒有默認初始化值瀏覽器
成員變量和靜態變量區別
- 靜態變量隨着類的建立而建立, 隨着對象的回收而釋放
2. 成員變量隨着對象的建立而建立, 隨着類的消失而消失安全
- 靜態變量能夠直接被類調用
- 成員變量不能夠直接被調用
- 靜態變量存儲在方法區(共享數據區)的靜態區, 也叫對象的共有數據
6. 成員變量存儲在對象的堆內存中, 也叫對象的特有數據服務器
匿名對象
- 當對象對方法僅進行一次調用時, 就能夠簡化爲匿名對象
構造函數
- 構建創造對象時調用的函數, 給對象初始化
this關鍵字
- this表明着所在函數所屬對象的引用
- this也能夠用於在構造函數中調用其餘構造函數, 但應該放在第一行, 初始化動做應該最早執行
static關鍵字
1. static修飾的成員被全部的對象共享session
- static優先於對象建立, static和類一塊兒被建立
- static修飾的成員能夠直接用類名調用
靜態變量
- 當一個數據在對象中都是相同的時候且對象不作修改只作使用就可使用靜態
靜態函數
- 當函數不須要訪問對象中的特有數據也就是非靜態成員變量時, 能夠用靜態修飾
靜態
static{
}
- 隨着類的加載而加載, 並且只執行一次, 用於給類初始化
構造代碼塊
{
}
- 隨着對象的加載而加載, 建立幾個對象調用幾回, 給全部對象初始化
一個類不想被繼承且實現
- 定義爲abstract, 構造函數設爲私有
單例設計模式
-
解決的問題: 保證一個類在內存中的對象惟一性數據結構
- 不容許其餘程序new對象
- 在該類中建立一個本類實例
- 對外提供方法去獲取該對象
-
步驟多線程
- 私有化該類構造函數
- 經過new在本類中建立一個本類對象
- 定義一個公有靜態方法, 返回對象
構造函數
- 在子類構造對象的時候, 父類構造函數也會執行, 子類構造函數默認會有一個隱式的super()去調用父類的空參的構造函數;
- 全部子類的構造函數默認都會訪問父類的空參構造函數
子類實例化過程
- 子類先進行默認初始化再調用構造函數
- 經過super初始化父類內容時, 子類成員變量並未顯示初始化
- 父類初始化完成
- 子類成員變量進行顯示初始化
- 調用子類構造代碼塊
- 執行子類構造函數
多態
- Base b = new Super() 父類引用指向子類對象
-
成員變量:app
-
成員函數:
-
靜態函數(不須要對象, 直接使用類調用, 因此其實不涉及多態):
異常
-
通常不能夠處理的 Error
- 由JVM拋出的嚴重性的問題, 通常不予解決而是直接修改源碼
-
能夠處理的 Exception
- 編譯時檢查異常, Exception和其子類, 除RuntimeException
- 運行時異常, RuntimeException和其子類
- 自定義異常要麼繼承Exception, 要麼RuntimeException
- throw用來引起異常, throws用來聲明異常
多線程
-
建立線程方式
-
繼承Thread類
- 定義一個類繼承Thread類
- 重寫Thread類的run方法
- 實例化Thread子類
- 使用start方法開啓線程並調用run方法
-
實現Runnable接口
- 定義一個類實現Runnable接口
- 實現Runnable接口中的run方法
- 實例化Thread類並傳入該類實例做爲構造函數的參數
- 使用start方法開啓新線程
-
多線程由於處理機的隨機分配, 可能會出現安全問題
-
多線程間通信
使用等待喚醒機制
涉及的方法:
- wait(): 線程處於凍結狀態, 存儲到線程池中
- notify():喚醒任意一個線程池中線程
- notifyAll(): 喚醒線程池中全部線程
-
wait和sleep區別
- wait能夠傳入一個時間, 釋放執行權, 釋放鎖.
- sleep必須指定一個時間, 釋放執行權, 不釋放鎖.
- setDaemon設置爲守護線程, 噹噹前運行的全部線程爲守護線程時, 虛擬機退出
- join方法, 線程執行join方法後會得到處理機, 並當前線程執行結束後才釋放處理機
- yield方法, 線程會從新進入就緒狀態
- setPriority方法設置線程的優先級 可傳入MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY三個線程靜態字段
String
String
- 在字符串創建時, 內存中有一個字符串常量池(緩衝區), 建立字符串時, 在字符串常量池建立, 之後每次先尋找常量池中是否有字符串, 若是有直接指向便可, 不用從新建立字符串
- 使用new建立字符串時, 在堆中建立一個String對象.
StringBuffer
StringBuilder
- 和StringBuffer相似, 不過StringBuffer同步, StringBuilder不保證同步
集合框架
List
- 有序, 元素都有索引, 能夠重複
ArrayList
- 內部數據結構爲數組, 非同步, 新增和刪除效率低, 查找效率高
LinkedList
1. 內部數據結構爲鏈表, 新增和刪除效率高, 查找效率低, 非同步
Vector
- 同步, 查找, 新增和刪除效率都低
Set
- 無序, 元素不容許重複
HashSet
- 內部數據結構爲Hash表, 非同步
- 使用元素hashcode方法肯定位置, 若是hashcode方法結果相同, 再經過equals方法肯定是否相同
LinkedHashSet
- 在HashSet基礎上實現了存取有序
TreeSet
- 內部數據結構爲二叉樹, 使用元素的天然順序對元素進行排序, 非同步
- 對於自定義對象, 讓元素自身具有比較功能, 應該實現Comparable接口, 覆蓋compareTo方法進行排序.
- TreeSet排序第二種方法, 讓集合自身具有比較功能, 建立一個類實現Comparator接口, 覆蓋compare方法 並將其傳入TreeSet的構造函數, 在比較器和天然排序時, 比較器優先級較高
泛型
- 規定了傳入的參數類型, 避免轉換類型的麻煩, 在編譯時期檢查
- 在運行時會將泛型進行擦除, 即class文件中沒有泛型
- 當方法定義爲靜態時, 不能使用類上定義的泛型, 只能將泛型定義在方法上
泛型限定
- 泛型的上限, <? extend Obj>泛型可以傳入Obj自己及其子類
- 泛型的下限, <?super Obj>泛型可以傳入Obj自己及其父類
Map集合
- KeySet方法獲取全部的鍵
- entrySet方法獲取全部鍵值對
HashMap
- 內部數據結構爲Hash表
- 非同步
- 容許鍵值對爲null
HashTable
- 內部數據結構爲Hash表
- 同步
- 不容許鍵值對爲null
Propertites
- 用來存儲鍵值對類型的配置文件, HashTable的子類
-
-
TreeMap
- 內部數據結構爲二叉樹
- 非同步
- TreeSet實際上就是使用的TreeMap
I/O流
輸入和輸出
- 外設-->內存: 輸入流
- 內存-->外設: 輸出流
字節流和字符流
- 字符流: 字節流先讀取文本數據, 不直接操做, 而是先查詢指定編碼表
- 字節流: 直接讀取文本數據
I/O流經常使用基類
字符流緩衝區
- BufferedWriter
- BufferReader
Serizalizable接口
- 用於給被序列化的類加入ID號, 可手動指定ID號
- 被static修飾的變量不會被序列化, 返回的值是當前JVM的值, 而不是被序列化以後的值
- transient被其修飾的變量也不會被Serizalizable序列化
反射
定義
- 在運行狀態中, 對於任意一個類都能獲取到該類的屬性和方法
- 對於任意一個對象實例, 都能調用任意一個方法或屬性
經過反射獲取Class對象
- 經過實例對象的getClass()獲取Class對象
Person person = new Person("小米", 20);
Class clazz = person.getClass();
- 經過類靜態成員.class獲取對應的Class對象
Class clazz = Person.class;
- Class對象的forName()經過類名獲取Class對象
Class clazz = Class.forName("Person");
經過反射獲取類字段
// 建立Class對象
Class clazz = Class.forName("Person");
// 建立空參新實例
Object object = clazz.newInstance();
// 獲取字段
Field field = clazz.getDeclaredField("age");
field.set(object, 20);
Object object1 = field.get(object);
System.out.println(object1);
經過以上代碼沒法獲取或設置類中私有變量, 也不建議直接獲取類中私有變量, 若是想要強行獲取的話看下面代碼
Class clazz = Class.forName("Person");
// 建立空參新實例
Object object = clazz.newInstance();
// 獲取字段
Field field = clazz.getDeclaredField("age");
// 對私有字段的訪問取消檢查, 不建議使用
field.setAccessible(true);
field.set(object, 20);
Object object1 = field.get(object);
System.out.println(object1);
經過反射獲取類中方法
// 經過反射獲取class對象
Class clazz = Class.forName("Person");
// 經過getMethod方法獲取指定名稱的方法, 第二個參數傳遞參數類型, 參數爲int則傳遞int.class, 其餘相似, 空參則傳遞null
Method method = clazz.getMethod("paramMethod", String.class, int.class);
// 獲取類實例
Object object = clazz.newInstance();
// 經過invoke方法調用方法
method.invoke(object, "九" + 9);
四大做用域
- pageContext: 生存週期最短, 當前頁面加載結束即死亡
- request:
- session: 當前瀏覽器關閉死亡, 當到達一個最大時間時, 服務器才刪除session, 並不必定在瀏覽器關閉時session馬上死亡 request.getsession()而不是response.getsession()理由: 客戶端發送請求時, request會帶上session頭, 服務器再根據session頭尋找對應session.
- application: 生存週期最長, 服務器關閉時才死亡