1. java語言的特點
Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的靜态語言。
2. hashmap和treemap、hashset和treeset、hashmap和hashset
2.1 hashmap和treemap
HashMap通過hashcode對其内容進行快速查找,而 TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
HashMap:基于哈希表實作。使用HashMap要求添加的鍵類明确定義了hashCode()和equals()[可以重寫hashCode()和equals()].
TreeMap:基于紅黑樹實作。TreeMap沒有調優選項,因為該樹總處于平衡狀态。
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然順序或自定義順序周遊鍵(key)。
2.2 hashset和treeset
1 HashSet底層采用的是HashMap進行實作的,但是沒有key-value,隻有HashMap的key set的視圖,HashSet不容許重複的對象
2 HashMap可以将空值作為一個表的條目的key或者value,HashMap中由于鍵不能重複,是以隻有一條記錄的Key可以是空值,而value可以有多個為空,但HashTable不允許null值(鍵與值均不行)
3 Hashtable是基于Dictionary類的,而HashMap是基于Map接口的一個實作
4 Hashtable裡預設的方法是同步的,而HashMap則是非同步的,是以Hashtable是多線程安全的
3. int和Integer的差別
4. 單例模式
java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下特點:
1、單例類隻能有一個執行個體。
2、單例類必須自己建立自己的唯一執行個體。
3、單例類必須給所有其他對象提供這一執行個體。
單例模式確定某個類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體。在計算機系統中,線程池、緩存、日志對象、對話框、列印機、顯示卡的驅動程式對象常被設計成單例。這些應用都或多或少具有資料總管的功能。每台計算機可以有若幹個列印機,但隻能有一個Printer Spooler,以避免兩個列印作業同時輸出到列印機中。每台計算機可以有若幹通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一緻狀态,避免政出多頭。
5. Collection和Collections
1、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實作。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
2、java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜态多态方法。此類不能執行個體化,就像一個工具類,服務于Java的Collection架構。
6. 支援排序的集合
7. java泛型
8. final、finally、finalized
9. native
Java不是完美的,Java的不足除了展現在運作速度上要比傳統的C++慢許多之外,Java無法直接通路到作業系統底層(如系統硬體等),為此Java使用native方法來擴充Java程式的功能。
可以将native方法比作Java程式同C程式的接口,其實作步驟:
1、在Java中聲明native()方法,然後編譯。
2、用javah産生一個.h檔案。
3、寫一個.cpp檔案實作native導出方法,其中需要包含第二步産生的.h檔案(注意其中又包含了JDK帶的jni.h檔案)。
4、将第三步的.cpp檔案編譯成動态連結庫檔案。
5、在Java中用System.loadLibrary()方法加載第四步産生的動态連結庫檔案,這個native()方法就可以在Java中被通路了。
JAVA的native方法适用的情況:
1、為了使用底層的主機平台的某個特性,而這個特性不能通過JAVA API通路。
2、為了通路一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的。
3、為了加快程式的性能,而将一段時間敏感的代碼作為本地方法實作。
10. 多線程
JAVA多線程實作方式主要有三種:繼承Thread類、實作Runnable接口、使用ExecutorService、Callable、Future實作有傳回結果的多線程。其中前兩種方式線程執行完後都沒有傳回值,隻有最後一種是帶傳回值的。
繼承Thread類
實作Runnable接口
應用程式可以使用Executor架構來建立線程池
實作Runnable接口這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了别的對象的情況下,這需要多繼承(而Java不支援多繼承),隻能實作接口。同時,線程池也是非常高效的,很容易實作和使用。
11. java中實作同步(線程安全的方法)
在Java語言中,每一個對象有一把鎖。線程可以使用synchronized關鍵字來擷取對象上的鎖。synchronized關鍵字可應用在方法級别(粗粒度鎖)或者是代碼塊級别(細粒度鎖)。
(1)同步方法
即有synchronized關鍵字修飾的方法。
由于java的每個對象都有一個内置鎖,當用此關鍵字修飾方法時,
内置鎖會保護整個方法。在調用該方法前,需要獲得内置鎖,否則就處于阻塞狀态。
代碼如:
public synchronized void save(){}
注: synchronized關鍵字也可以修飾靜态方法,此時如果調用該靜态方法,将會鎖住整個類
(2)同步代碼塊
即有synchronized關鍵字修飾的語句塊。
被該關鍵字修飾的語句塊會自動被加上内置鎖,進而實作同步
synchronized(object){
}
注:同步是一種高開銷的操作,是以應該盡量減少同步的内容。
通常沒有必要同步整個方法,使用synchronized代碼塊同步關鍵代碼即可。
(3)使用特殊域變量(volatile)實作線程同步
a.volatile關鍵字為域變量的通路提供了一種免鎖機制,
c.是以每次使用該域就要重新計算,而不是使用寄存器中的值
d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量
(4)使用局部變量實作線程同步
如果使用ThreadLocal管理變量,則每一個使用該變量的線程都獲得該變量的副本,
副本之間互相獨立,這樣每一個線程都可以随意修改自己的變量副本,而不會對其他線程産生影響。
ThreadLocal 類的常用方法
ThreadLocal() : 建立一個線程本地變量
get() : 傳回此線程局部變量的目前線程副本中的值
initialValue() : 傳回此線程局部變量的目前線程的"初始值"
set(T value) : 将此線程局部變量的目前線程副本中的值設定為value
12.java中實作PV操作