Java錯題本01

如何實現字符串的反轉及替換?


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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容