Java
數(shù)組
int[] ints = {1, 3, 2, 4, 6, 5};
String[] stings = new String[10];
byte[] bytes = new byte[]{1, 3, 5};
內(nèi)部類
- 內(nèi)部類的創(chuàng)建:
- 內(nèi)部類可以對包內(nèi)其他類隱藏
- 想實(shí)現(xiàn)一個接口時, 不想新建類文件
- 內(nèi)部類可以訪問外部類的私有變量
- 外部實(shí)例化成員內(nèi)部類: 外部類勢力.new 內(nèi)部類()
Outer.Inner inner = new Outer().new Inner();
// 或者
Outer outer1 = new Outer();
Outer.Inner inner2 = outer1.new Inner();
- 匿名內(nèi)部類: 是一個繼承了類或?qū)崿F(xiàn)了某個接口的類的對象
public void hideShow() {
Comparable<Integer> comparable = new Comparable<Integer>() {
@Override
public int compareTo(Integer o) {
int limit = 10;
return limit - o;
}
};
System.out.println(comparable.compareTo(3));
System.out.println(comparable.compareTo(10));
System.out.println(comparable.compareTo(11));
}
枚舉
- 每個枚舉都是通過 Class 在內(nèi)部實(shí)現(xiàn)的, 因此 SMALL("S") 代表實(shí)例化 類 SMALL, 參數(shù) "S"
- 枚舉跟普通類一樣可以用自己的變量、方法和構(gòu)造函數(shù),構(gòu)造函數(shù)只能使用 private 訪問修飾符,所以外部無法調(diào)用
包裝類
- 自動拆包, 裝包
String,StringBuilder,StringBuffer
- StringBuilder和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問),但 StringBuilder 具有速度優(yōu)勢
Object
- equals
- hashCode
- toString
集合
- HashSet
- (equals 和 hashcode) 內(nèi)容唯一
- 內(nèi)容無序
- HashMap
- key 唯一, value不唯一
- 根據(jù)鍵的 HashCode 值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步
- 內(nèi)容無序
- ArrayList
io / file / 輸入輸出
- 不同系統(tǒng)的換行符號不一樣
- 字符流
- 字節(jié)流
-
InputStream, FileInputStream, BufferedInputStream
IO流類圖
-
序列化
- serialVersionUID 序列化ID 一個類可以有一個 ,但必須是 static, long, final
- 不想序列化的屬性使用關(guān)鍵字 transient 修飾
private transient int grade;
- 序列化時三種錯誤
- 無參數(shù)構(gòu)成方法
- 類中包含未知的數(shù)據(jù)類型
- 類的串行版本與從流中取出的描述符不一致[serialVersionUID]
- 父類未實(shí)現(xiàn)Serializable,子類實(shí)現(xiàn)了,序列化子類實(shí)例的時候,父類的屬性是直接被跳過不保存
線程
- 進(jìn)程 內(nèi)存[RAM]中的任務(wù)應(yīng)用
- 多線程問題: 由多個線程訪問共享內(nèi)存導(dǎo)致線程題目
- 屬于搶占式調(diào)度, 新線程,開辟新的??臻g 一個線程,start之后,不能多次start
- 調(diào)用的兩種方式
- 實(shí)現(xiàn) Runnable 接口的類 [無返回結(jié)果],調(diào)用Thread.start()
- 繼承 Thread 類, 重寫 run() 方法
- 通過 Callable 和 Future 創(chuàng)建線程
- 創(chuàng)建 Callable 接口的實(shí)現(xiàn)類,并實(shí)現(xiàn) call() 方法,該 call() 方法將作為線程執(zhí)行體,并且有返回值<T>。
- 創(chuàng)建 Callable 實(shí)現(xiàn)類的實(shí)例,使用 FutureTask 類來包裝 Callable 對象,該 FutureTask 對象封裝了該 Callable 對象的 call() 方法的返回值。
- 使用 FutureTask 對象作為 Thread 對象的 target 創(chuàng)建并啟動新線程。
- 調(diào)用 FutureTask 對象的 get() 方法來獲得子線程執(zhí)行結(jié)束后的返回值
// 實(shí)現(xiàn) Runnable
Runnable runnable = new Runnable() {
private int ticket = 20;
@Override
public void run() {
while (ticket > 0) {
System.out.println(Thread.currentThread().getName() + " 正在出售: " + ticket);
ticket--;
}
}
};
new Thread(runnable, "窗口1").start();
// 繼承
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("當(dāng)前i:" + i);
}
}
}
new MyThread().start();
- 線程同步
- 同步代碼塊 synchronized(鎖對象) {code} 每次都會判斷 鎖對象
- 同步方法
- 方法名前添加synchronize關(guān)鍵字使用this作為鎖對象
- 靜態(tài)方法名前添加synchronize關(guān)鍵字使用本類Class屬性->Class文件對象
- 鎖
- 創(chuàng)建Lock對象 ReentrantLock lock = new ReentrantLock()
- lock.lock();
- lock.unlock();
- Wait()和notify():如果條件不滿足,則等待。當(dāng)條件滿足時,等待該條件的線程將被喚醒。一般用在synchronized機(jī)制中, Wait()方法調(diào)用了long類型參數(shù),線程進(jìn)入計(jì)時等待狀態(tài)
- join()方法的主要作用是同步,它可以使得線程之間的并行執(zhí)行變?yōu)榇袌?zhí)行。在A線程中調(diào)用了B線程的join()方法時,表示只有當(dāng)B線程執(zhí)行完畢時,A線程才能繼續(xù)執(zhí)行, 這里的A線程,有可能是主線程
JDBC
- 所有下表從1開始
- 注冊驅(qū)動
- 獲取連接
- 獲取數(shù)據(jù)庫操作對象
- 執(zhí)行sql
- 獲取結(jié)果集
- 釋放資源
Class.forName("com.mysql.jdbc.Driver");// DriverManager.registerDirver(new com.mysql.jdbc.Driver());
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/coa_finance_test?useSSL=false", "root", "");
Statement statement = connection.createStatement();
ResultSet set = statement.executeQuery("sql");
statement.close();
connection.close();
- 執(zhí)行sql的三種方式
- Statement.executeQuery() 返回ResultSet結(jié)果集, 一般執(zhí)行Select 語句
- Statement.executeUpdate() 返回int類型,影響的行數(shù), 一般執(zhí)行update,delete 語句 如果執(zhí)行Drop table, 返回0
- Statement.execute() 返回bool類型 true:返回結(jié)果有結(jié)果集, 使用 Statement.getResultSet() 獲取ResultSet結(jié)果集
- 事務(wù)
- connection.setAutoCommit(false);取消自動提交
- connection.commit(); 提交
- connection.rollback(); 回滾
JDBC連接池
反射
// 示意類
public class Person() { private int age;public Person()}
public class Student extense Person () { private String name; public Student()}
- classloader
- SystemClassLoader\PlatformClassLoader\bootClassLoader
- bootClassLoader 通常為null
- Class類 描述類文件.class屬性的類
- 獲取方式
- Class<?> c = Object.getClass()
- Class<?> c =Student.class
- Class<?> c =Class.formName("類名稱")
- 反射字段
- Field[] fields = c.getDeclaredFields() // 獲取所有類字段,不包含父類,包含私有字段
- Field[] fields = c.getFields() // 獲取所有類字段,不包含父類,不包含私有字段
- Field field = c.getField("類名稱") // 獲取指定字段
- 如果獲取父類字段,需要調(diào)用 Class<?> cSuper = c.getSuperClass(), 使用父類的反射類
- 使用 Field.set(object, value)設(shè)置字段時, 父類需要 Field.setAccessible(true)
- 反射方法與反射字段類似只是Field改為Method
+ Method[] methods = c.getDeclaredMethods()
+ Method[] methods = c.getMethods()
+ Method method = c.getMethod("方法名稱", 參數(shù).class) 因?yàn)閖ava方法重載機(jī)制,所以 參數(shù)類型很重要
+ 使用 method.invoke(object, 參數(shù)...) 調(diào)用方法 - 構(gòu)造方法 類比 反射方法
- 獲取注解, 注意需要 注解被元注解@Returntion(RetentionPolicy.RUNTIME)修飾
- Field 或 Method等反射屬性 isAnnotationPresent(Annotation.class) 判斷是否包含注解
- getAnnotation(Annotation.class) 獲取注解對象, 調(diào)用方法獲取對應(yīng)的注解數(shù)據(jù)
注解
泛型
代理
awt
包package
數(shù)據(jù)庫
- 事務(wù)隔離 兩個事務(wù) T1, T2
- 臟讀: T1讀取了T2更新但未提交的值, T2回滾,T1 的值就是臨時且無效的.
- 不可重復(fù)讀取: T1讀取了某個字段,然后T2更新,T1再讀時,值是不一樣的.
- 幻讀: T1, T2讀取數(shù)據(jù)庫后, T2插入數(shù)據(jù),T1再度時,數(shù)據(jù)不一致.
- 事務(wù)隔離級別
- READ UNCOMMITTED 讀未提交數(shù)據(jù),
- READ COMMITTED 讀已提交數(shù)據(jù), 避免臟讀
- REPEATABLE READ 可重復(fù)讀 避免臟讀和不可重復(fù)讀
- SERIALIZABLE 串行化 所有問題都能避免,但是并發(fā)性能低下
生成注釋文件
- javadoc target.java
java命令行
- 生成自己的jar包
- 需要先將文件編譯為class文件,然后使用jar命令
javac *.java -d .
jar cvf base.jar base
- 編譯目標(biāo)文件
- .java文件含有包名時,使用java 運(yùn)行需要 java 包名.文件名
- 有外部引用jar包時, java、javac都需要使用命令參數(shù) -cp jar包絕對路徑 引入外部代碼
