1? java同步幾種方法?threadlocal怎么實現(xiàn)。
java的同步機制
1.synchronized;
2.Object方法中的wait,notify;
3.ThreadLocal機制? 來實現(xiàn)的。
其中synchronized有兩種用法:1.對類的方法進行修飾 2.synchronized(對象)的方法進行修飾
在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量
ThreadLocal不是用來解決對象共享訪問問題的,而主要是提供了保持對象的方法和避免參數(shù)傳遞的方便的對象訪問方式。
歸納為兩點:
1? 每個線程中都有一個自己的ThreadLocalMap類對象,可以將線程自己的對象保持到其中,各? ? 管各的,線程可以正確的訪問到自己的對象。
2 將一個共用的ThreadLocal靜態(tài)實例作為key,將不同對象的引用保存到不同線程的? ? ? ? ? ThreadLocalMap中,然后在線程執(zhí)行的各處通過這個靜態(tài)ThreadLocal實例的get()方法取得自己 線程保存的那個對象,避免了將這個對象作為參數(shù)傳遞的麻煩。
當然ThreadLocal并不能替代同步機制,兩者面向的問題領域不同。同步機制是為了同步多個線程對相同資源的并發(fā)訪問,是為了多個線程之間進行通信的有效方式;而ThreadLocal是隔離多個線程的數(shù)據(jù)共享,從根本上就不在多個線程之間共享資源(變量),這樣當然不需要對多個線程進行同步了。所以,如果你需要進行多個線程之間進行通信,則使用同步機制;如果需要隔離多個線程之間的共享沖突,可以使用ThreadLocal,這將極大地簡化你的程 序,使程序更加易讀、簡潔。
2 Java常用的幾種設計模式
1 單例模式
? 該模式主要目的是使內存中保持1個對象


2 工廠模式
該模式主要功能是統(tǒng)一提供實例對象的引用
3 建造模式
該模式其實就是說,一個對象的組成可能有很多其他的對象一起組成的,比如說,一個對象的實現(xiàn)非常復雜,有很多的屬性,而這些屬性又是其他對象的引用,可能這些對象的引用又包括很多的對象引用。封裝這些復雜性,就可以使用建造模式
4 門面模式
這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業(yè)務邏輯,再通過方法向上層提供服務。門面模式道理其實是一樣的。
5 策略模式
這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴展更容易。
3 關于Java中static和final關鍵字的用法總結
static通常翻譯為“靜態(tài)”,可用來修飾類、成員變量和方法,也可以聲明一個靜態(tài)塊。下面分別介紹這幾類用法。
1 修飾類
首先需要注意的是,普通類是不能用static來修飾的,static只能用來修飾內部類。使用static修飾內部類之后可以使用“類.內部類”實例化這個內部類的對象, 而對于其他非靜態(tài)內部類,則只能先實例化外部類,然后才能調用內部類。
2 static變量
按照是否靜態(tài)的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態(tài)變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。靜態(tài)變量與實例變量的區(qū)別主要是:靜態(tài)變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而實例變量是對象所擁有的,在創(chuàng)建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響
3 static方法
static方法也叫靜態(tài)方法,也可以直接使用“類.方法()”來直接調用。但是需要注意一下幾點:一是靜態(tài)方法中不能使用this和super關鍵字;二是靜態(tài)方法中不能使用非靜態(tài)成員變量,也不能調用非靜態(tài)方法;三是靜態(tài)方法與靜態(tài)變量一樣都是獨立于任何實例,所以靜態(tài)方法不能使用abstract修飾,即static方法不能為抽象方法。
4 static塊
靜態(tài)塊顧名思義就是使用static{}的一段代碼塊。靜態(tài)塊是在JVM加載類的時候執(zhí)行的,并且只會執(zhí)行一次。由于這個特性,所以在一些場景非常好用。我在項目中遇到的過的使用場景主要有在實例化一個日志對象時,使用static塊;然后就是實例化一些在類中常用但不需要多次實例化的變量等
final
final有不可改變之意,可用來修飾非抽象類、非抽象成員變量和方法。下面分別總結一下其用法
1? final類
final類不能被繼承,所以其中的成員變量和方法默認也是為final的。一般來說,只有在確信該類不需要再有子類,并且不會被擴展。所以一般只有在定義一個保存一些常量信息的時候才會將類聲明為final類。
2 final變量
final修飾的變量將無法再被改變,即為常量。final變量在定義時可以不賦值,此時意味著該變量為null;在使用這個變量之前則必須為其賦值,否則會出錯,賦值之后這個值將不會再被改變
3 final 方法
final修飾的方法不能被覆蓋,所以聲明為final的方法之后,該類的子類不能覆寫此方法,但是可以被繼承
static和final結合使用
可以同時使用static和final修飾成員變量和方法,此時的成員變量和方法可以直接用“類.名稱”調用,成員變量的值不能改變,方法不能被覆寫
4 java中靜態(tài)變量和成員變量的區(qū)別
所屬不同:
靜態(tài)變量屬于類,所以也稱為為類變量;成員變量屬于對象,所以也稱為實例變量(對象變量)
在內存中位置不同:
靜態(tài)變量存儲于方法區(qū)里的靜態(tài)區(qū);成員變量存儲于堆內存區(qū)
在內存中出現(xiàn)的時間不同:
靜態(tài)變量隨著類的加載而加載、隨著類的消失而消失;
成員變量隨著對象(也叫實例)的創(chuàng)建而存在,隨著對象的消失而消失。
調用方式不同:
靜態(tài)變量可以通過類名調用,也可以通過對象調用; 成員變量只能通過對象名調用。
在靜態(tài)方法中是沒有this關鍵字的,如何理解呢?
靜態(tài)變量是隨著類的加載而加載,this是隨著對象的創(chuàng)建而存在。靜態(tài)先于對象存在。
靜態(tài)方法只能訪問靜態(tài)的成員變量和靜態(tài)的成員方法。
非靜態(tài)方法,既可以調用靜態(tài)的成員變量也可以調用非靜態(tài)的成員變量;
非靜態(tài)方法既可以調用靜態(tài)的成員方法,也可以調用非靜態(tài)的成員方法。

5 基本數(shù)據(jù)類型

6? java中基本類型和字符串之間的轉換
使用包裝類的 toString() 方法。
使用String類的 valueOf() 方法。
一個空字符串加上基本類型,得到的就是基本類型數(shù)據(jù)對應的字符串
int——》String
int c=10;
String str2=Integer.toString(c);//方法一
String str3=String.valueOf(c);//方法2
String str4=c+"";//方法3
將字符串轉換成基本類型有兩種方法:
調用包裝類的 parseXxx 靜態(tài)方法。
調用包裝類的 valueOf() 方法轉換為基本類型的包裝類,會自動拆箱
String test1="happy";
int c1=Integer.parseInt(test1);//方法一
int c2=Integer.valueOf(test1);//方法二
Doubledob=1.1;
String? dob1=Double.toString(dob);
Double? dob2=Double.valueOf(test1);
7? 時間格式
使用format()方法將日期轉化為指定格式的文本
Date d = newDate();
SimpleDateFormat sdf = new? SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String today = sdf.format(d);
System.out.println(today)
代碼中的 “yyyy-MM-dd HH:mm:ss” 為預定義字符串, yyyy 表示四位年, MM 表示兩位月份, dd 表示兩位日期, HH 表示小時(使用24小時制), mm 表示分鐘, ss 表示秒,這樣就指定了轉換的目標格式,最后調用 format() 方法將時間轉換為指定的格式的字符串。
使用parse()方法將文本轉換為日期
String day = "2018年05月11日 19:43:00";
SimpleDateFormat df = new? SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = df.parse(day);
System.out.println("當前日期:"+ date);
調用 SimpleDateFormat 對象的 parse() 方法時可能會出現(xiàn)轉換異常,即 ParseException ,因此需要進行異常處理。 使用 Date 類時需要導入 java.util 包,使用 SimpleDateFormat 時需要導入 java.text包。
8? Calendar類的應用
Date 類最主要的作用就是獲得當前時間,同時這個類里面也具有設置時間以及一些其他的功能,但是由于本身設計的問題,這些方法卻遭到眾多批評,不建議使用,更推薦使用 Calendar 類進行時間和日期的處理。 java.util.Calendar 類是一個抽象類,可以通過調用 getInstance() 靜態(tài)方法獲取一個 Calendar 對象,此對象已由當前日期時間初始化,即默認代表當前時間,如 Calendar c = Calendar.getInstance(); Calendar 類提供了 getTime() 方法,用來獲取 Date 對象,完成 Calendar 和 Date 的轉換,還可通過 getTimeInMillis() 方法,獲取此 Calendar 的時間值,以毫秒為單位
Calendar calendar=Calendar.getInstance();
Date date=calendar.getTime();//獲取時間
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
System.out.println(calendar.getTimeInMillis());//毫秒為單位
9? 使用Math類操作數(shù)據(jù)
Math 類位于 java.lang 包中,包含用于執(zhí)行基本數(shù)學運算的方法, Math 類的所有方法都是靜態(tài)方法,所以使用該類中的方法時,可以直接使用類名.方法名,如: Math.round(); 常用方法:
Math.round(11.5)? //? ? 12? 11.5+0.5
Math.round(-11.5) //11? -11.5+0.5

10? HashMap和Hashtable的區(qū)別
1? 兩者最主要的區(qū)別在于Hashtable是線程安全,而HashMap則非線程安全。Hashtable的實現(xiàn)方法里面都添加了synchronized關鍵字來確保線程同步,因此相對而言HashMap性能會高一些,我們平時使用時若無特殊需求建議使用HashMap,在多線程環(huán)境下若使用HashMap需要使用Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現(xiàn)原理是Collections定義了一個SynchronizedMap的內部類,這個類實現(xiàn)了Map接口,在調用方法時使用synchronized來保證線程同步,當然了實際上操作的還是我們傳入的HashMap實例,簡單的說就是Collections.synchronizedMap()方法幫我們在操作HashMap時自動添加了synchronized來實現(xiàn)線程同步,類似的其它Collections.synchronizedXX方法也是類似原理。
2? HashMap可以使用null作為key,不過建議還是盡量避免這樣使用。HashMap以null作為key時,總是存儲在table數(shù)組的第一個節(jié)點上。而Hashtable則不允許null作為key。
3? HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現(xiàn)Map接口。
4? HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。
6? HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即:capacity*2+1。
7? HashMap和Hashtable的底層實現(xiàn)都是數(shù)組+鏈表結構實現(xiàn)。
8? 兩者計算hash的方法不同:
Hashtable計算hash是直接使用key的hashcode對table數(shù)組的長度直接進行取模:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然后對table數(shù)組長度取摸:
static int hash(int h) {
? ? h ^= (h >>> 20) ^ (h >>> 12);
? ? return h ^ (h >>> 7) ^ (h >>> 4);
}static int indexFor(int h, int length) {
? ? return h & (length-1);
}
7.判斷是否含有某個鍵
在HashMap 中,null 可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對
應的值為null。當get()方法返回null 值時,既可以表示HashMap 中沒有該鍵,也可
以表示該鍵所對應的值為null。因此,在HashMap 中不能用get()方法來判斷HashM
ap 中是否存在某個鍵,而應該用containsKey()方法來判斷。Hashtable 的鍵值都不能
為null,所以可以用get()方法來判斷是否含有某個鍵。
HashMap和Hashtable都是實現(xiàn)Map接口的,但是:
1.HashMap允許鍵和值都是null的,而Hashtable不允許鍵和值為null
2.Hashtable是同步的,而HashMap不是。所以HashMap適用于單線程,而Hashtable適用于多線程
3.HashMap提供了可供應用迭代的鍵的集合,因此HashMap是快速失敗的,而Hashtable是提供了對鍵的列舉
11 .JVM的永久代中會發(fā)生垃圾回收么?
垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到元數(shù)據(jù)區(qū)
(譯者注:Java8中已經(jīng)移除了永久代,新加了一個叫做元數(shù)據(jù)區(qū)的native內存區(qū))
12 RMI體系結構分以下幾層:
存根和骨架層(StubandSkeletonlayer):這一層對程序員是透明的,它主要負責攔截客戶端發(fā)出的方法調用請求,然后把請求重定向給遠程的RMI服務。
遠程引用層(RemoteReferenceLayer):RMI體系結構的第二層用來解析客戶端對服務端遠程對象的引用。這一層解析并管理客戶端對服務端遠程對象的引用。連接是點到點的。
傳輸層(Transportlayer):這一層負責連接參與服務的兩個JVM。這一層是建立在網(wǎng)絡上機器間的TCP/IP連接之上的。它提供了基本的連接服務,還有一些防火墻穿透策略。
Naming類的bind()和rebind()方法有什么區(qū)別?
bind()方法負責把指定名稱綁定給遠程對象,rebind()方法負責把指定名稱重新綁定到一個新的遠程對象。如果那個名稱已經(jīng)綁定過了,先前的綁定會被替換掉。
JAVA? IO和NIO的區(qū)別

java 常用集合list與Set、Map區(qū)別及適用場景總結
http://blog.csdn.net/qq_22118507/article/details/51576319
后續(xù)學習。。。。。
1 JDK中常用包及其類和功能
2 HashTable和HashMap的區(qū)別詳解
HashTable和HashMap的區(qū)別詳解 - CSDN博客
3 Object類
1,構造函數(shù)
2,hashCode和equale函數(shù)用來判斷對象是否相同,
3,wait(),wait(long),wait(long,int),notify(),notifyAll()
4,toString()和getClass,
5,clone()
6,finalize()用于在垃圾回收
4 JVM運行內存
https://blog.csdn.net/jing18033612052/article/details/79187709
5 JAVA的原子性&可見性&有序性
https://blog.csdn.net/qq_33689414/article/details/73527438
6 JAVA繼承詳解
Java之中只允許多層繼承,不允許多重繼承,Java存在單繼承局限
限制一:一個子類只能夠繼承一個父類,存在單繼承局限
限制二:在一個子類繼承的時候,實際上會繼承父類之中的所有操作(屬性、方法),但是需要注意的是,對于所有的非私有(no private)操作屬于顯式繼承(可以直接利用對象操作),而所有的私有操作屬于隱式繼承(間接完成)
限制三:在繼承關系之中,如果要實例化子類對象,會默認先調用父類構造,為父類之中的屬性初始化,之后再調用子類構造,為子類之中的屬性初始化,即:默認情況下,子類會找到父類之中的無參構造方法。
現(xiàn)在默認調用的是無參構造,而如果這個時候父類沒有無參構造,則子類必須通過super()調用指定參數(shù)的構造方法
在任何的情況下,子類都逃不出父類構造的調用,很明顯,super調用父類構造,這個語法和this()很相似:super調用父類構造時,一定要放在構造方法的首行上。
7 修飾符

2018 5 25
8 異常處理機制(throws和throw的區(qū)別)

try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執(zhí)行。
當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會被執(zhí)行:
1)在finally語句塊中發(fā)生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
圖示try、catch、finally語句塊的執(zhí)行:

Throws拋出異常的規(guī)則:
1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那么可以不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利通過,但在運行時會被系統(tǒng)拋出。
2)必須聲明方法可拋出的任何可查異常(checked exception)。即如果一個方法可能出現(xiàn)受可查異常,要么用try-catch語句捕獲,要么用throws子句聲明將它拋出,否則會導致編譯錯誤
? 3)僅當拋出了異常,該方法的調用者才必須處理或者重新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續(xù)拋出,而不是囫圇吞棗。
4)調用方法必須遵循任何可查異常的處理和聲明規(guī)則。若覆蓋一個方法,則不能聲明與覆蓋方法不同的異常。聲明的任何異常必須是被覆蓋方法所聲明異常的同類或子類。
throw異常
throw總是出現(xiàn)在函數(shù)體中,用來拋出一個Throwable類型的異常。程序會在throw語句后立即終止,它后面的語句執(zhí)行不到,然后在包含它的所有try塊中(可能在上層調用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。
我們知道,異常是異常類的實例對象,我們可以創(chuàng)建異常類的實例對象通過throw語句拋出。該語句的語法格式為:
throw new exceptionname;
? ? 例如拋出一個IOException類的異常對象:
? ? throw new IOException;
? ? 要注意的是,throw 拋出的只能夠是可拋出類Throwable 或者其子類的實例對象。下面的操作是錯誤的:
? ? throw new String("exception");
? ? 這是因為String 不是Throwable 類的子類。
如果拋出了檢查異常,則還應該在方法頭部聲明方法可能拋出的異常類型。該方法的調用者也必須檢查處理拋出的異常。
? ? ? 如果所有方法都層層上拋獲取的異常,最終JVM會進行處理,處理也很簡單,就是打印異常消息和堆棧信息。如果拋出的是Error或RuntimeException,則該方法的調用者可選擇處理該異常。
java中常見的異常
1. runtimeException子類:
1、 java.lang.ArrayIndexOutOfBoundsException
數(shù)組索引越界異常。當對數(shù)組的索引值為負數(shù)或大于等于數(shù)組大小時拋出。
2、java.lang.ArithmeticException
算術條件異常。譬如:整數(shù)除零等。
3、java.lang.NullPointerException
空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等
4、java.lang.ClassNotFoundException
? ? 找不到類異常。當應用試圖根據(jù)字符串形式的類名構造類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出該異常。
5、java.lang.NegativeArraySizeException? 數(shù)組長度為負異常
6、java.lang.ArrayStoreException數(shù)組中包含不兼容的值拋出的異常
? 7、java.lang.SecurityException安全性異常
? 8、java.lang.IllegalArgumentException非法參數(shù)異常
IOException:操作輸入流和輸出流時可能出現(xiàn)的異常。
EOFException? 文件已結束異常
FileNotFoundException? 文件未找到異常
ClassCastException? ? 類型轉換異常類
ArrayStoreException? 數(shù)組中包含不兼容的值拋出的異常
SQLException? 操作數(shù)據(jù)庫異常類
NoSuchFieldException? 字段未找到異常
NoSuchMethodException? 方法未找到拋出的異常
NumberFormatException? ? 字符串轉換為數(shù)字拋出的異常
StringIndexOutOfBoundsException 字符串索引超出范圍拋出的異常
IllegalAccessException? 不允許訪問某類異常
InstantiationException? 當應用程序試圖使用Class類中的newInstance()方法創(chuàng)建一個類的實例,而指定的類對象無法被實例化時,拋出該異常
9 JAVA中return的作用
return的常用作用有以下兩種
一種是返回參數(shù)所用的關鍵字,假如一個有返回值的方法執(zhí)行完了之后需要返回一個參數(shù),示例:public string functionTest(){
String a = "abc";
return a;
}
那么這個方法被調用之后就會返回一個值為abc的字符串,string result = functionTest();
第二種用法是,代碼執(zhí)行到此處終止。
比如當代碼執(zhí)行到某個地方會出現(xiàn)幾種結果,然后其中一種結果就不能執(zhí)行后續(xù)代碼,這時候在那里加上一個return就可以終止后面的代碼執(zhí)行。
10 Swing 繼承框架圖
Swing 是在AWT的基礎上構建的一套新的圖形界面系統(tǒng),它提供了AWT 所能夠提供的所有功能,并且用純粹的Java代碼對AWT 的功能進行了大幅度的擴充。swing是單線程的
AWT 是基于本地方法的C/C++程序,其運行速度比較快;Swing是基于AWT 的Java程序,其運行速度比較慢。

11? 解決hashmap的沖突方法

1. 開放定址法:線性探測再散列、二次探測再散列、再隨機探測再散列;
2. 再哈希法:換一種哈希函數(shù);
3. 鏈地址法 :在數(shù)組中沖突元素后面拉一條鏈路,存儲重復的元素;
4. 建立一個公共溢出區(qū):其實就是建立一個表,存放那些沖突的元素。
什么時候會產(chǎn)生沖突
HashMap中調用 hashCode() 方法來計算hashCode。
由于在Java中兩個不同的對象可能有一樣的hashCode,所以不同的鍵可能有一樣hashCode,從而導致沖突的產(chǎn)升。
HashMap底層是 數(shù)組和鏈表 的結合體。底層是一個線性數(shù)組結構,數(shù)組中的每一項又是一個鏈表。當新建一個HashMap的時候,就會初始化一個數(shù)組。數(shù)組是 Entry[] 數(shù)組,靜態(tài)內部類。 E ntry就是數(shù)組中的元素,每個 Map.Entry 其實就是一個key-value對,它持有一個指向下一個元素的引用 next ,這就構成了鏈表。所以 很明顯是鏈地址法。
具體過程:
當我們往HashMap中put元素的時候:當程序試圖將一個key-value對放入HashMap中時,
1 . 程序首先根據(jù)該 key 的 hashCode() 返回值決定該 Entry 的存儲位置;
2 . 若 Entry 的存儲位置上為 null ,直接存儲該對象;若不為空,兩個 Entry 的 key 的 hashCode() 返回值相同,那它們的存儲位置相同,
3 . 循環(huán)遍歷鏈表,如果這兩個 Entry 的 key 通過 equals 比較返回 true,新添加 Entry 的 value 將覆蓋集合中原有 Entry 的 value,但key不會覆蓋;如果這兩個 Entry 的 key 通過 equals 比較返回 false,新添加的 Entry 將與集合中原有 Entry 形成 Entry 鏈,而且新添加的 Entry 位于 Entry 鏈的頭部
3 未解決?
JAVA中的ThreadLock? ? https://www.cnblogs.com/chengxiao/p/6152824.html