疯狂Java讲义笔记汇总
目錄
- 一、基礎(chǔ)類型
- 二、流程控制與數(shù)組
- 三、面向?qū)ο?/li>
- 四、基礎(chǔ)類庫(kù)
- 五、集合
- 六、泛型
- 七、異常
- 八、數(shù)據(jù)庫(kù)
- 九、注釋
- 十、輸入輸出
- 十一、網(wǎng)絡(luò)
- 十二、類加載機(jī)制
- 十三、多線程
面向?qū)ο笕筇匦?#xff1a;封裝、繼承、多態(tài)
一、基礎(chǔ)類型
- char, int, short, long, byte, float, double, boolean
- 基本類型的類型轉(zhuǎn)換(自動(dòng)與強(qiáng)制、補(bǔ)碼,反碼與原碼)
- 邏輯運(yùn)算符(不短路與&,和&&; | 和|| 兩個(gè)的只執(zhí)行最少比較,單個(gè)的都比較)
- 運(yùn)算符的優(yōu)先級(jí)
二、流程控制與數(shù)組
- if, while, for
- break, continue, return
- 數(shù)組在內(nèi)存中,初始化
- java8增強(qiáng)工具類:Arrays
三、面向?qū)ο?/h1>
- 類和對(duì)象;方法(值傳遞,基礎(chǔ)·類型傳遞值到不同方法棧區(qū),對(duì)象類型傳遞引用值,引用自內(nèi)存堆的對(duì)象)
- 成員變量、局部變量的初始化和內(nèi)存中的運(yùn)行機(jī)制;
- 隱藏與封裝:private、default、protected、public
- 構(gòu)造器
- 繼承:單繼承
- 多態(tài):編譯時(shí)類型、運(yùn)行時(shí)類型
- instanceof前一個(gè)需要和后一個(gè)類有關(guān)系,否則編譯錯(cuò)誤。比如String instanceof Math,無(wú)法通過(guò)編譯;
- 繼承與組合:開(kāi)銷無(wú)差別,繼承is-a;組合has-a
- final、abstract、接口與抽象類
- 內(nèi)部類(非靜態(tài)內(nèi)部類、靜態(tài)內(nèi)部類)
- Lambda表達(dá)式
- 枚舉類
- 對(duì)象與垃圾回收可達(dá)、可恢復(fù)、不可達(dá)System.gc(); Runtime.getRuntime().gc();finalize方法軟、弱、虛引用
四、基礎(chǔ)類庫(kù)
- Object,Java8增強(qiáng)Objects(大多是空指針安全的)
- String、StringBuffer(線程安全,每個(gè)方法加了synchronized 關(guān)鍵字,和StringBuidler同繼承自AbstractStringBuilder方法)、StringBuilder
- Math庫(kù)
- Random、ThreadLocalRandom(Java7新增用于并發(fā)線程安全)
- BigDecimal(double類型容易發(fā)生精度丟失:4.015*100=401.499999999994)
- Date(不推薦)、Canlendar、Java8新增java.time包
- 正則表達(dá)式:\d \D \s \S \w \W;[]枚舉 -范圍 ^否 &&與 ;^開(kāi)頭 $結(jié)尾 \b邊界 \B \A輸入的開(kāi)頭 \G前一個(gè)匹配的結(jié)構(gòu) \Z輸入的結(jié)尾,僅用于最后的結(jié)束符 \z輸入的結(jié)尾;貪婪模式(匹配最多,默認(rèn))、勉強(qiáng)模式(匹配最少,?)、占有模式Pattern p = Pattern.compile("a*b");Mathcer m = p.matcher("aaaaab");boolean b = m.matches(); //返回true
- SimpleDateFormat、Java8新增DateTimeFormatter
五、集合
Set:無(wú)序,下面實(shí)現(xiàn)類都是非線程安全的
- HashSet:非同步、元素可以是null
- LinkedHashSet:以插入順序保存,遍歷效率高
- TreeSet:排序,紅黑樹(shù)排序
- EnumSet:有序,以位向量存儲(chǔ),緊湊高效,占用內(nèi)存小,對(duì)于批量操作非常快;不允許插入null
List:有序、可重復(fù)
- ArrayList:線程不安全的,可以通過(guò)Collections工具類變成線程安全的;數(shù)組存儲(chǔ)
- Vector:線程安全,不過(guò)很老了,不推薦使用
- LinkedList:也實(shí)現(xiàn)了Deque接口,可以作為雙端隊(duì)列或者棧;鏈表存儲(chǔ)
Queue隊(duì)列
- PriorityQueue:按照元素大小重新排序
- Deque(類似于雙端隊(duì)列,也可以作為棧的實(shí)現(xiàn)),ArrayDeque
Map
- HashMap:線程不安全;允許放入null作為key或value;
- Hashtable:古老,類似于Vector,不推薦使用,線程安全,不允許放入null;Properties是它的子類
- LinkedHashMap
- TreeMap,SortedMap
- WeakHashMap
Hash的知識(shí)點(diǎn):
- 容量(capacity,默認(rèn)是10)、初始化容量(可以通過(guò)構(gòu)造器傳入)
- 尺寸(當(dāng)前hash表中記錄的數(shù)量)
- 負(fù)載因子,一般是0.75;超過(guò)時(shí)會(huì)發(fā)生rehashing,比較消耗
Collections:提供的集合工具類,操縱List、Set、Map
- 排序、查找、替換
- 同步控制List list = Collections.synchronizedList(new ArrayList()),可以獲得線程安全的ArrayList
六、泛型
編譯時(shí)不檢查類型的異常,所以需要泛型
- 沒(méi)有泛型類:Collections instanceof java.util.ArrayLsit<String>()這個(gè)是錯(cuò)誤的
- 類型通配符
- 類型上限與下限,當(dāng)從List<string>變成List時(shí),發(fā)生了類型擦除,變成了上限Object
七、異常
- finally
- throw, throws,try catch
- 不要過(guò)度使用異常
- 不要使用過(guò)于龐大的try塊
- 避免使用Catch All語(yǔ)句
- 不要忽略捕獲到的異常
八、數(shù)據(jù)庫(kù)
Class.forName(“com.mysql.jdbc.Driver”);
try{
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select","root","xxxx");
Statement stat = conn.createStatement();
ResultSet rs = stat.execute("sql語(yǔ)句");
while(rs.hasnext){sysout(rs.getXX)}
stat.executeUpdate("updateSql語(yǔ)句");
conn.commit();
}
- 連接池(DBCP數(shù)據(jù)源、C3P0數(shù)據(jù)源)
九、注釋
- @override,@Deprecated, @SuppressWarnings
- @Retention,@Target, @Document
- 自定義注釋(public @interface Test {}) 用法:@Test
- 只加注解是沒(méi)有用的,結(jié)合反射使用 method.isAnnotationPresent方法來(lái)做處理
十、輸入輸出
- File:不能訪問(wèn)文件本身,需要使用輸入/輸出流
- 字節(jié)流(8位字節(jié),Inputstream、OutputStrem)、字符流(16位字符,Reader、Writer)
- 轉(zhuǎn)換流(只提供了從字節(jié)流轉(zhuǎn)換為字符流)
- 序列化(類實(shí)現(xiàn)了Serializable,所有的成員變量也都需要是可序列化的),通過(guò)transient指定序列化時(shí)可以無(wú)需理會(huì)(只能用于修飾實(shí)例變量)
- NIO,從java1.4開(kāi)始,放在java.nio包下;兩個(gè)核心對(duì)象Channel、Buffer
- NIO.2 Path、Paths、和Files核心API、FileVisitor
十一、網(wǎng)絡(luò)
- InetAddress代表ip地址
- URLDecoder,URLEncoder
- ......太多了
十二、類加載機(jī)制
- 加載過(guò)程加載:將類的class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)java.lang.Class對(duì)象連接:驗(yàn)證、準(zhǔn)備、解析初始化:虛擬機(jī)對(duì)類進(jìn)行初始化
- 類加載器根類加載器 bootstrap擴(kuò)展類加載器 extension系統(tǒng)類加載器 system
- 反射(由于對(duì)象存在編譯時(shí)類型和運(yùn)行時(shí)類型,程序需要在運(yùn)行時(shí)發(fā)現(xiàn)對(duì)象和類的真實(shí)信息)獲得Class對(duì)象:forName獲取構(gòu)造器 getConstructor方法getMthod, method.invoke();獲取成員變量getField獲取標(biāo)注getAnnotation...等
- 使用反射生成JDK動(dòng)態(tài)代理
十三、多線程
一、創(chuàng)建線程三種方式
繼承Thread、實(shí)現(xiàn)Runnable、Callable接口
二、線程的生命周期
新建和就緒、運(yùn)行和阻塞、死亡
三、控制線程
join、后臺(tái)進(jìn)程Daemon、睡眠Sleep、讓步y(tǒng)ield
- synchronized關(guān)鍵字可以修飾方法、代碼塊,但是不能修飾構(gòu)造器、成員變量等synchronized修飾的同步方法,因?yàn)樵擃惖哪J(rèn)實(shí)例是this,就是同步監(jiān)視器,所以可以直接調(diào)用Object的wati(), notify(),notifyAll()方法;synchronized修飾的是同步代碼塊,同步監(jiān)視器就是synchronized括號(hào)后的對(duì)象,所以必須使用該隊(duì)現(xiàn)改對(duì)象調(diào)用這三個(gè)方法。
- java8提供了新型的StampedLock類,大多數(shù)場(chǎng)景中它可以替代傳統(tǒng)的ReentrantReadWriteLock
- ReentrantReadWriteLock為讀寫(xiě)操作提供了三種鎖模式:Writing、ReadingOptimistic、Reading
- 常用的是ReentrantLock(可重入鎖)Private final ReentrantLock lock = new ReentrantLock();public void m(){ lock.lock(); try{ // 需要保障線程安全的代碼} finally{lock.unlock();}}如果是用Lock,則使用Condition將wait,notify,nitifyAll分成不同對(duì)象private final Lock lock = new ReentrantLock();privat final Condition cond = lock.newCondition();lock.lock();cond.await();\ cond.signalAll();
- 使用阻塞隊(duì)列(BlockingQueue)控制線程通信
線程組 ThreadGroup
線程池:從java5開(kāi)始,提供了Executor工廠類
線程相關(guān)類:ThreadLocal
產(chǎn)生死鎖的原因主要是:
(1) 因?yàn)橄到y(tǒng)資源不足。
(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適。
(3) 資源分配不當(dāng)?shù)取?/p>
產(chǎn)生死鎖的四個(gè)必要條件:
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的疯狂Java讲义笔记汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Exp3 免杀原理与实践
- 下一篇: make: 警告:检测到时钟错误。您的创