動機
就faq
OO
- 物件導向的特徵
- 封裝
- 多型
- 繼承
- Overload和Override差在
- Overload是同class同名的method但有不同的signatrue
- Override child class把同名同signatrue的method蓋掉
- equals()與==
- equals是比值
- 因為他是method可以被蓋所以可以比值
- 所以要一起改hashcode
- 因為他是method可以被蓋所以可以比值
- ==是比記憶體位置
- 這是operator不能override只能照設定的來
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
- Private, Public, Protected
- private: class scope
- protected: inherence scope
- public: whatever
- default (無修飾元): file(package) scope
java
- type
- primitive
- byte
- int
- short
short a; a+=1;
a = (short) (a+1)
- char
- long
- float
- 1.1F
- double
- 1.1
- boolean
- Object (有人叫他引用type)
- int與Integer差在
- 一個是primitive一個是Object
- 大小,使用方式都不一樣
- String與StringBuffer差在
- String不可改動,每次+都是生新的String
- StringBuffer可以改,像c的char[]
- Exception與Runtime Exception與Error差在
- Exception會被宣告在method signatrue(throws)
- 一定要被catch,compiler會檢查
- Runtime Exception就是一般的例外
- 丟了會stack trace back
- 沒人接就壞掉
- Error是硬體出事了,當他出現時世界就毀滅了
- ArrayList,Vector, LinkedList差在
- LinkedList就是linkedlist,但是是雙向
- ArrayList就是C++的vector
- Vector就是有synchronized的ArrayList
- 但現在都用Concurrent開頭的
- Vector就是有synchronized的ArrayList
- HashMap和Hashtable差在
- HashMap不是thread safe,能放null
- Hashtable有synchronized
- final, finally, finalize差在
- final 這欄位不可變、不可繼承、不可override
- final的instant variable沒有default value
- finally不論有沒有例外,總是執行
- 就算try裡面有放return也會跑!!
- finalize被GC會被call的method
- 現在用cleaner!!
- compareTo() vs equals() in String
- compareTo就是一般比較的函數,ruby的
<=>
- equals只有boolean
- interface default & static method
- default用在不用實做某些method的時候 (變得像abstrac class)
- 可以延伸到abstract class與interface的差異
- abstract class不一定要實作所有abstract,interface要
- abstract class的method可以access attribute,interface只有常數
- 可以延伸到abstract class與interface的差異
- static method就是跟著interface的method,
Iface.method()
- Anonymous Inner Class
- 很像clousre,可以直接new interface接要override的method
- 所以也沒辦法直接extend,implements
public class AnonymousInnerClass {
public static void main(String[] args) {
// Ex. Anonymous Inner Class
new Thread() {
@Override
public void run() {
// code...
System.out.println("Anonymous Inner Class");
}
}.start();
}
}
- Collection與Collections差在
- Collection是interface,要實作add與remove與toarray
- Collections是對Collection操作的方法,像C++的algorithm
- List、Set、Map 是否繼承自 Collection 介面
- List與Set是
- Map不是,是AbstractMap
- sleep & wait
- sleep是thread睡覺,要時間到才會自己跑,不會放棄鎖
- wait是針對monitor的工作,可以讓自己睡,或是收別人的signal,會放棄鎖
- 啟動一個線程是用 run() 還是 start()
- start之後會invoke run跑需要的code
- 當一個線程進入一個物件的一個 Synchronized 方法後,其它線程是否可以進入此物件的其他方法?
- 要看是不是吃同一個obj
- 如果是一般method,就沒辦法進去
- static method會吃class做為鎖,就可以進去
- java的記憶體
- for runtime
- stack
- heap
- method area
- const pool
- code
- static
- 1/0 & 1/1.0
- 1/0: ArithmeticException
- 1/1.0: Infinite (沒有例外)
- constructor是否可被override?
- 不行,可以overload
- jvm怎麼載入class
- ClassLoader會根據繼承關係把class,讀進來會驗證、allocate mem、link、init static資料、生成物件讓jvm跑
- 從來沒有人說過Java的Class名字必須和其檔名相同。但public class的名字必須和檔名相同
// OtherThing.java
class Something {
private static void main(String[] something_to_do) {
System.out.println("Do something ...");
}
}
- Math.round(-1.5)
- -1
- Thread state
- start
- ready
- running
- blocked
- destroied
- 如何deepcopy
- Cloneable
- Serializable
- Inversion of Control
- 原本是Logic去控制資料
- 有些資料其實是一起的,所以可以根據我們這邊的需求去生
- 但也可以讓外面給 (Dependency Injection)
- 透過setter
- 透過interface (我們只call method)
- 透過constructor
- 再跑logic之前讓資料就定位
- 之後就是有一堆framework,想描述(變成像prolog那樣)給參數這行為就有了這個詞
- 這到最後可以不管程式實作了!! 它本身就是程式阿
- 但也可以讓外面給 (Dependency Injection)
Servlet
- cgi與servlet差在
- cgi是每次req都fork一個process去處理,之後回到parent
- servlet是會初始化只後一直處理req,等server不要時再回收
- AOP
- 有些與logic無關的code但要與logic放在一起的code(log),Aspect
- 如果想分開就是要留callback的點,Joinpoint
- B+ tree
- 每一個node代表一個range,下面的ptr指到符合範圍的node
design pattern
把object當成lambda就可以處理很多問題
之後就是用
- interface
- 繼承
- 包成object 去傳需要的邏輯
剩下就visitor是pattern match
正規化
讓table好join
- 把array轉90度
- 讓整個主鍵可以filter出所有欄目 (course ID, student ID去濾可以找出grade與student name,name要被割出去)
- 割出去的項目只能用主鍵去濾資料
GC
每個obj都是一個node,所以每個都有
- indegree
- 當indegree為0就被回收
- 如果有loop就不會被回收
- edge
- 從root做traversal,有走到就是ok
- 會產生記憶體斷片、物件多會跑很久(stop the world)
- 物件多會跑很久: 區分世代使用不同algo
- 產生記憶體斷片: 一次只用整條記憶體的一半,要換時就把剩下都copy去另一邊