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 單例模式
? 該模式主要目的是使內(nèi)存中保持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只能用來修飾內(nèi)部類潭辈。使用static修飾內(nèi)部類之后可以使用“類.內(nèi)部類”實例化這個內(nèi)部類的對象鸯屿, 而對于其他非靜態(tài)內(nèi)部類澈吨,則只能先實例化外部類,然后才能調(diào)用內(nèi)部類寄摆。
2 static變量
按照是否靜態(tài)的對類成員變量進行分類可分兩種:一種是被static修飾的變量谅辣,叫靜態(tài)變量或類變量;另一種是沒有被static修飾的變量冰肴,叫實例變量屈藐。靜態(tài)變量與實例變量的區(qū)別主要是:靜態(tài)變量被所有的對象所共享,在內(nèi)存中只有一個副本熙尉,它當且僅當在類初次加載時會被初始化联逻。而實例變量是對象所擁有的,在創(chuàng)建對象的時候被初始化检痰,存在多個副本包归,各個對象擁有的副本互不影響
3 static方法
static方法也叫靜態(tài)方法,也可以直接使用“類.方法()”來直接調(diào)用铅歼。但是需要注意一下幾點:一是靜態(tài)方法中不能使用this和super關鍵字公壤;二是靜態(tài)方法中不能使用非靜態(tài)成員變量,也不能調(diào)用非靜態(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修飾成員變量和方法,此時的成員變量和方法可以直接用“類.名稱”調(diào)用恕刘,成員變量的值不能改變缤谎,方法不能被覆寫
4 java中靜態(tài)變量和成員變量的區(qū)別
所屬不同:
靜態(tài)變量屬于類,所以也稱為為類變量褐着;成員變量屬于對象坷澡,所以也稱為實例變量(對象變量)
在內(nèi)存中位置不同:
靜態(tài)變量存儲于方法區(qū)里的靜態(tài)區(qū);成員變量存儲于堆內(nèi)存區(qū)
在內(nèi)存中出現(xiàn)的時間不同:
靜態(tài)變量隨著類的加載而加載含蓉、隨著類的消失而消失频敛;
成員變量隨著對象(也叫實例)的創(chuàng)建而存在,隨著對象的消失而消失馅扣。
調(diào)用方式不同:
靜態(tài)變量可以通過類名調(diào)用斟赚,也可以通過對象調(diào)用; 成員變量只能通過對象名調(diào)用差油。
在靜態(tài)方法中是沒有this關鍵字的,如何理解呢拗军?
靜態(tài)變量是隨著類的加載而加載,this是隨著對象的創(chuàng)建而存在厌殉。靜態(tài)先于對象存在食绿。
靜態(tài)方法只能訪問靜態(tài)的成員變量和靜態(tài)的成員方法。
非靜態(tài)方法公罕,既可以調(diào)用靜態(tài)的成員變量也可以調(diào)用非靜態(tài)的成員變量器紧;
非靜態(tài)方法既可以調(diào)用靜態(tài)的成員方法,也可以調(diào)用非靜態(tài)的成員方法楼眷。
5 基本數(shù)據(jù)類型
6? java中基本類型和字符串之間的轉(zhuǎn)換
使用包裝類的 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
將字符串轉(zhuǎn)換成基本類型有兩種方法:
調(diào)用包裝類的 parseXxx 靜態(tài)方法掌腰。
調(diào)用包裝類的 valueOf() 方法轉(zhuǎn)換為基本類型的包裝類,會自動拆箱
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()方法將日期轉(zhuǎn)化為指定格式的文本
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 表示秒,這樣就指定了轉(zhuǎn)換的目標格式省核,最后調(diào)用 format() 方法將時間轉(zhuǎn)換為指定的格式的字符串稿辙。
使用parse()方法將文本轉(zhuǎn)換為日期
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);
調(diào)用 SimpleDateFormat 對象的 parse() 方法時可能會出現(xiàn)轉(zhuǎn)換異常气忠,即 ParseException 邻储,因此需要進行異常處理。 使用 Date 類時需要導入 java.util 包旧噪,使用 SimpleDateFormat 時需要導入 java.text包吨娜。
8? Calendar類的應用
Date 類最主要的作用就是獲得當前時間,同時這個類里面也具有設置時間以及一些其他的功能淘钟,但是由于本身設計的問題萌壳,這些方法卻遭到眾多批評,不建議使用日月,更推薦使用 Calendar 類進行時間和日期的處理袱瓮。 java.util.Calendar 類是一個抽象類,可以通過調(diào)用 getInstance() 靜態(tài)方法獲取一個 Calendar 對象爱咬,此對象已由當前日期時間初始化尺借,即默認代表當前時間,如 Calendar c = Calendar.getInstance(); Calendar 類提供了 getTime() 方法,用來獲取 Date 對象,完成 Calendar 和 Date 的轉(zhuǎn)換缨恒,還可通過 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的內(nèi)部類兴革,這個類實現(xiàn)了Map接口绎晃,在調(diào)用方法時使用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內(nèi)存區(qū))
12 RMI體系結構分以下幾層:
存根和骨架層(StubandSkeletonlayer):這一層對程序員是透明的,它主要負責攔截客戶端發(fā)出的方法調(diào)用請求挺据,然后把請求重定向給遠程的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運行內(nèi)存
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)操作屬于顯式繼承(可以直接利用對象操作),而所有的私有操作屬于隱式繼承(間接完成)
限制三:在繼承關系之中奶躯,如果要實例化子類對象帚桩,會默認先調(diào)用父類構造,為父類之中的屬性初始化嘹黔,之后再調(diào)用子類構造账嚎,為子類之中的屬性初始化,即:默認情況下儡蔓,子類會找到父類之中的無參構造方法郭蕉。
現(xiàn)在默認調(diào)用的是無參構造,而如果這個時候父類沒有無參構造浙值,則子類必須通過super()調(diào)用指定參數(shù)的構造方法
在任何的情況下,子類都逃不出父類構造的調(diào)用檩小,很明顯开呐,super調(diào)用父類構造,這個語法和this()很相似:super調(diào)用父類構造時规求,一定要放在構造方法的首行上筐付。
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)僅當拋出了異常辩恼,該方法的調(diào)用者才必須處理或者重新拋出該異常。當方法的調(diào)用者無力處理該異常的時候谓形,應該繼續(xù)拋出灶伊,而不是囫圇吞棗。
4)調(diào)用方法必須遵循任何可查異常的處理和聲明規(guī)則寒跳。若覆蓋一個方法聘萨,則不能聲明與覆蓋方法不同的異常。聲明的任何異常必須是被覆蓋方法所聲明異常的同類或子類童太。
throw異常
throw總是出現(xiàn)在函數(shù)體中米辐,用來拋出一個Throwable類型的異常。程序會在throw語句后立即終止书释,它后面的語句執(zhí)行不到翘贮,然后在包含它的所有try塊中(可能在上層調(diào)用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。
我們知道爆惧,異常是異常類的實例對象狸页,我們可以創(chuàng)建異常類的實例對象通過throw語句拋出。該語句的語法格式為:
throw new exceptionname;
? ? 例如拋出一個IOException類的異常對象:
? ? throw new IOException;
? ? 要注意的是扯再,throw 拋出的只能夠是可拋出類Throwable 或者其子類的實例對象芍耘。下面的操作是錯誤的:
? ? throw new String("exception");
? ? 這是因為String 不是Throwable 類的子類。
如果拋出了檢查異常熄阻,則還應該在方法頭部聲明方法可能拋出的異常類型齿穗。該方法的調(diào)用者也必須檢查處理拋出的異常。
? ? ? 如果所有方法都層層上拋獲取的異常饺律,最終JVM會進行處理窃页,處理也很簡單,就是打印異常消息和堆棧信息复濒。如果拋出的是Error或RuntimeException脖卖,則該方法的調(diào)用者可選擇處理該異常。
java中常見的異常
1. runtimeException子類:
1巧颈、 java.lang.ArrayIndexOutOfBoundsException
數(shù)組索引越界異常畦木。當對數(shù)組的索引值為負數(shù)或大于等于數(shù)組大小時拋出。
2砸泛、java.lang.ArithmeticException
算術條件異常十籍。譬如:整數(shù)除零等蛆封。
3、java.lang.NullPointerException
空指針異常勾栗。當應用試圖在要求使用對象的地方使用了null時惨篱,拋出該異常。譬如:調(diào)用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? ? 類型轉(zhuǎn)換異常類
ArrayStoreException? 數(shù)組中包含不兼容的值拋出的異常
SQLException? 操作數(shù)據(jù)庫異常類
NoSuchFieldException? 字段未找到異常
NoSuchMethodException? 方法未找到拋出的異常
NumberFormatException? ? 字符串轉(zhuǎn)換為數(shù)字拋出的異常
StringIndexOutOfBoundsException 字符串索引超出范圍拋出的異常
IllegalAccessException? 不允許訪問某類異常
InstantiationException? 當應用程序試圖使用Class類中的newInstance()方法創(chuàng)建一個類的實例毯欣,而指定的類對象無法被實例化時馒过,拋出該異常
9 JAVA中return的作用
return的常用作用有以下兩種
一種是返回參數(shù)所用的關鍵字臭脓,假如一個有返回值的方法執(zhí)行完了之后需要返回一個參數(shù),示例:public string functionTest(){
String a = "abc";
return a;
}
那么這個方法被調(diào)用之后就會返回一個值為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中調(diào)用 hashCode() 方法來計算hashCode。
由于在Java中兩個不同的對象可能有一樣的hashCode,所以不同的鍵可能有一樣hashCode年柠,從而導致沖突的產(chǎn)升凿歼。
HashMap底層是 數(shù)組和鏈表 的結合體。底層是一個線性數(shù)組結構冗恨,數(shù)組中的每一項又是一個鏈表答憔。當新建一個HashMap的時候,就會初始化一個數(shù)組掀抹。數(shù)組是 Entry[] 數(shù)組虐拓,靜態(tài)內(nè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