如何實現字符串的反轉及替換?
ArrayList和 Vector 都是使用數組方式存儲數據
LinkedList使用雙向鏈表實現存儲
Set和 Map 容器都有基于哈希存儲和排序樹的兩種實現版本,基于哈希存儲的版本理
論存取時間復雜度為O(1),List以特定索引來存取元素
sleep()方法(休眠)是線程類(Thread)的靜態方法,wait()是 Object 類的
方法,只有調用對象的notify()方法(或 notifyAll()方法)時才能喚醒
設計模式
二分法
程序和進程的本質區別是:靜態和動態特征
Ipv6占用16個字節,128bits;IP數據包的最大長度是64K字節(65535)
RARP協議根據MAC地址求主機對應的IP地址
異常:
可查異常即必須進行處理的異常,要么try catch住,要么往外拋,誰調用,誰處理,比如 FileNotFoundException。如果不處理,編譯器,就不讓你通過
運行時異常RuntimeException指:?不是必須進行try catch的異常?常見運行時異常:?除數不能為0異常:ArithmeticException下標越界異常:ArrayIndexOutOfBoundsException空指針異常:NullPointerException在編寫代碼的時候,依然可以使用try catch throws進行處理,與可查異常不同之處在于,即便不進行try catch,也不會有編譯錯誤?。Java之所以會設計運行時異常的原因之一,是因為下標越界,空指針這些運行時異常太過于普遍,如果都需要進行捕捉,代碼的可讀性就會變得很糟糕。
每個Unicode碼,一個字符兩個字節,所以16bit。
String +“xxxx”會生成一個新的字符串對象。數組不具備索引訪問功能。
Collection主要方法
8種基本數據類型:byte short long char boolean int float double ??使用時是值傳遞,除此為應用傳遞。
String s1=“hello”;String s2= “hello”,(s1==s2)為true。若String s1 = new String(“hello”),為false;,new操作會在堆上分配兩個字符串,地址不同
Jvm會給新創建的對象一個指針this,this是對當前類對象的引用,實例化后才存在。
類方法是不依賴對象而存在的方法,只要有訪問權限,類方法可以調用任意的類方法。
對象被實例化后,類方法即可調用實例方法。
構造方法:
可省略,編譯器會提供一個默認的方法
構造方法必須與類同名,方法名也可以和類同名。
一個對象被new時一定會調用構造方法。
因為構造方法可以重載,所以一個類可以定義多個構造方法
Array Vector LinkedList都是 可動態改變 的數組
A和V是基于Object[] array,內存開辟連續空間。L采用雙向列表。v是線程安全的。
事務是數據庫中一個單獨的執行單元,四個屬性:原子性、一致性、隔離性、持久性
Java集合筆記:
四種體系:
Set:無序不重復
List:有序重復
Map:有映射關系
Queue:隊列集合實現
兩個接口:Collection(list set queue)和Map(根接口)
HashSet:不是同步;元素值可以是null。當向HashSet存入元素,調用該對象的hashCode()方法得到該對象的hashCode值,由值決定在在HashSet的存儲位置。
兩個元素相等的標準:equals()方法返回true,hashCode()相等
不要輕易修改HashSet的對象。
LinkedHashSet是Hashet的子類,使用鏈表維護元素次序
TreeSet是SortedSet接口的實現類,確保集合元素處于排序狀態。只能添加同一種類型的對象
當一個對象加入加入TreeSet集合時,調用該對象的compareTo(Object obj)方法與容器其他方法比較大小,然后根據紅黑樹結構找到存儲位置,若相等,無法添加。返回0表示相等。
EnumSet類
各Set實現類的性能分析
Hashset的性能優于TreeSet,除非需要一個保持排序的Set。遍歷LinkedHashSet更快。
EnumSet是所有Set中性能最好的,但只能保存同一個枚舉類的枚舉值作為集合元素
這三個類都是線程不安全的,可以通過synchronizedSortedSet方法包裝,在創建時進行。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
List集合
集合的每個元素都有對應的順序索引。允許重復元素,默認按添加順序設置索引。
Void add (int index,Object element)
Object get/remove(int index)
List類的兩個典型實現:ArrarList和Vector,都是基于數組實現,動態允許再分配。使用initialCapacity設置數組長度,超過時會自動增加。
顯著區別,ArrayList是線程不安全的
ArrayKust LinkedList是線性表的典型實現,基于數組和鏈。LinkedList提供了雙端隊列、棧的功能。總體上A的性能好。遍歷集合,A和V使用隨機訪問方法(get),L使用迭代器(iterator)
Queue集合
PriorityQueue按隊列大小重新排序
Map集合
List有數字索引,Map用key索引。從源碼上看,包裝所有value為null的Map即可實現Set。
HashSet和Hashtable(古老的類):
Table線程安全,不能有key或value為null。Map允許有key或value為null
判斷key需要hashnode和equals。判斷value只要equals
泛型
集合缺點,忘記對象數據類型,dog對象的集合可能放進cat對象
例子:創建一個只保存字符串的集合
List strList = new ArratList()后面的方括號可省略。
Java多線程
進程的三個特征:獨立性(獨立擁有自己的資源,用戶進程不可以直接訪問其他進程的地址空間)
動態性:進程和程序的區別。進程具有生命周期和各種不同狀態
并發性:多個進程可以在單個處理器上并發進行(并行性是指同時執行沒有切換)
線程,也被稱為輕量級進程
進程與線程的區別:
1)一個程序至少有一個進程,一個進程至少有一個線程.
2)多線程程序的并發性高,因為線程的劃分尺度小于進程。
3)進程在執行過程中擁有獨立的內存單元分配大量資源,而多個線程共享內存,效率高。
4)線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
5)進程和線程的重要區別:從邏輯角度來看,多線程的意義在于一個應用程序,有多個執行部分可以同時執行。但對于操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。
創建線程
1.繼承Thread類
一、重寫run方法,也稱為線程執行體。
二、創建子類的實例,即創建了線程的對象
三、調用start()方法啟動線程
2.實現Runnable接口
一、定義Runnable接口的實現類,重寫run方法
二、創建Runnable實現類的實例
Runnable好處:
1可繼承多個接口
2共享一個target對象
Thread好處:
使用this即可獲得當前線程
???fH?l