日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

javaAPI解讀

01、Object常用的方法


Object常用的方法有clone、equals、hashCode、notify、notifyAll、

toString、wait、finalize。

02、String與StringBuffer區別


String與StringBuffer在JAVA中都是用來進行字符串操作的。String是一個很特別的類,它被final修飾,意味著String類不能被繼承使用,一旦聲明是一個不可變的類。

StringBuffer是一個長度可變的,通過追加的方式擴充,并且是線程安全;尤其在迭代循環中對字符串的操作,性能一般優于String。但線程安全意味著開銷加大,性能下降,所以在線程安全的情況下一般用StringBuilder來代替StringBuffer使用,StringBuilder的速度要優于StringBuffer。

 

03、Vector、ArrayList、LinkedList的區別


1、Vector、ArrayList都是以類似數組的形式存儲在內存中,LinkedList則以鏈表的形式進行存儲。

2、Vector線程同步,ArrayList、LinkedList線程不同步;后兩者一般用在線程安全的地方,也可以通過Collections.synchronizedList(……);實現線程同步。

3、LinkedList適合指定位置插入、刪除操作,不適合查找;ArrayList、Vector適合查找,不適合指定位置的插入、刪除操作。

4、ArrayList在元素填滿容器時會自動擴充容器大小的50%,而Vector則是100%,因此ArrayList更節省空間。

5、LinkedList 還實現了 Queue 接口,該接口比List提供了更多的方法,包括 offer(),peek(),poll()等,多與一些線程池一起使用.

 補充:以上都實現了序列化接口,這點在對象遠程傳輸時很重要;而Vector,ArrayList實現了AccessRandom接口,這是一個標記接口,此接口的主要目的是允許一般的算法更改其行為,從而在將其應用到隨機或連續訪問列表時能提供良好的性能。

 注意: 默認情況下ArrayList的初始容量非常小,所以如果可以預估數據量的話,分配一個較大的初始值屬于最佳實踐,這樣可以減少調整大小的開銷。

04、HashTable、HashMap區別


1、HashTable線程同步,key,value值均不允許為空;HashMap非線程同步,key,value均可為空,HashTable因為線程安全的額外開銷會造成性能下降,而HashMap由于線程不安全,在多線程的情況下,一般要加鎖,或者使用Collections.synchronizedMap()來創建線程安全的對象。

2、HashTable繼承的父類是Dictionary,而HashMap繼承的父類是AbstractMap,而且又都實現了Map接口,所以Map接口中提供的方法,他們都可以使用;HashTable的遍歷是通過Enumeration,而HashMap通常使用Iterator實現。

3、HashTable有一個contains(Object value)的方法,其功能和HashMap的containsValue(Object value)一樣,而HashMap提供的更加細致還有一個取Key值的方法為containsKey(Object key)。

4、哈希值的使用不同,HashTable直接使用對象的hashCode,代碼是這樣的:

 

javaAPI解讀

 

 

 

05、Equals()和HashCode()作用


這兩個方法都是Object類的方法,equals通過用來判斷兩個對象是否相等。HashCode就是一個散列碼,用來在散列存儲結構中確定對象的存儲地址。HashMap,HashSet,他們在將對象存儲時,需要確定它們的地址,而HashCode就是做這個用的。在默認情況下,由Object類定義的hashCode方法會針對不同的對象返回不同的整數,這一般是通過將該對象的內部地址轉換成一個整數來實現的。

在java中equals和hashCode之間有一種契約關系:

1. 如果兩個對象相等的話,它們的hashcode必須相等。

2. 但如果兩個對象的hashcode相等的話,這兩個對象不一定相等。

由于java.lang.Object的規范,如果兩個對象根據equals()方法是相等的,那么這兩個對象中的每一個對象調用hashCode方法都必須生成相同的整數結果。(下面作為解釋內容可以不必回答,理解使用)

舉例說,在HashSet中,通過被存入對象的hashCode()來確定對象在HashSet中的存儲地址,通過equals()來確定存入的對象是否重復,hashCode()和equals()都需要重新定義,因為hashCode()默認是由對象在內存中的存儲地址計算返回一個整數得到,而equals()默認是比較對象的引用,如果不同時重寫他們的話,那么同一個類產生的兩個完全相同的對象就都可以存入Set,因為他們是通過equals()來確定的,這就是HashSet失去了意義。面試時簡單的說,HashSet的存儲是先比較HashCode,如果HashCode相同再比較equals,這樣做的目的是提交儲存效率。所以換句方式問,如果用對象來做為Key值的話,要滿足什么條件呢?答要重寫equals和HashCode方法。

06、Sleep()和Wait()區別


1、wait()是Object類的方法,在每個類中都可以被調用;而sleep()是線程類Thread中的一個靜態方法,無論New成多少對象,它都屬于調用的類的。

2、sleep方法在同步對象中調用時,會持有對象鎖,其它線程必須等待其執行結束,如果時間不到只能調用interrupt()強行打斷;在sleep時間結束后重新參與cpu時間搶奪,不一定會立刻被執行。

3、wait()方法在同步中調用時,會讓出對象鎖。通常與notify,notifyAll一起使用。

 

07、IO與NIO的區別


IO是早期的輸入輸出流,而NIO全名是New IO在IO的基礎上新增了許多新的特性。提供的新特性包括:非阻塞I/O,字符轉換,緩沖以及通道。

1、IO是面向流的,NIO是面向緩沖區的。 Java IO面向流意味著每次從流中讀一個或多個字節,直至讀取所有字節,它們沒有被緩存在任何地方。如果需要前后移動從流中讀取的數據,需要先將它緩存到一個緩沖區。 Java NIO的緩沖導向方法略有不同。數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動。

2、Java IO的各種流是阻塞的。這意味著,當一個線程調用read() 或 write()時,該線程被阻塞,直到有一些數據被讀取,或數據完全寫入。該線程在此期間不能再干任何事情了。 Java NIO的非阻塞模式,使一個線程從某通道發送請求讀取數據,但是它僅能得到目前可用的數據,如果目前沒有數據可用時,就什么都不會獲取。線程通常將非阻塞IO的空閑時間用于在其它通道上執行IO操作,所以一個單獨的線程現在可以管理多個輸入和輸出通道(channel)。雖然是非阻塞的,但也會遇到一個問題就是服務器對最大連接的支持,但在線用戶連接數大于系統支持數時,NIO的默認實現是并不管是否還有足夠的可用連接數,而是直接打開連接。在netty框架中經常會看到一個open too many files異常就是由此引起的,所以要靈活使用,合適配置。

3、Java NIO的選擇器允許一個單獨的線程來監視多個輸入通道,你可以注冊多個通道使用一個選擇器,然后使用一個單獨的線程來“選擇”通道:這些通道里已經有可以處理的輸入,或者選擇已準備寫入的通道。這種選擇機制,使得一個單獨的線程很容易來管理多個通道。

08、Final、Finally、Finalize的區別


Final是Java中一個特別的關鍵字(修飾符),final修飾的類不能被繼承,final修飾的變量不能被修改(是常量),final修飾的方法不能被重寫,所以使用final要考慮清楚使用場景。

Finally是Java異常處理try{}catch(..){}finally{}中的一部分,finally語句塊中的語句一定會被執行到(Down機除外),通常用于進行資源的關閉操作,如數據連接關閉等。

Finalize是Object類中的一個方法,finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的,設計的初終是可以進行一些資源的關閉,但這個方法很少被重寫,因為垃圾回收器執行時并不一定會調用,比如拋異常時,而且垃圾回收本身就是隨意的,不可控制的。

09、OverLoad與Override的區別


overload和override是多態的兩種表現形式;overload重載規則是同名不同參,方法名相同,參數類型、個數、順序至少有一個不相同(與返回值、參數名、拋出的異常都沒有關系);

overload可以發生在父類、同類、子類中。override重寫的規則是方法名、參數、返回值相同,發生在父子類之間,而且子類不能拋出比父類更多的異常,被重寫的方法一定不能定義成final。

10、Collection與Collections的區別


Collection是一個集合的超級接口,它定義了一些集合常用的操作方法,如add,size,remove,clear等,我們經常用到的List(可重復集合),Set(不可重復集合)接口就是它的子接口。

Collections此類完全由在 collection 上進行操作或返回 collection 的靜態方法組成。它包含在 collection 上操作的多態算法,即“包裝器”,包裝器返回由指定 collection 支持的新 collection,以及少數其他內容。如果為此類的方法所提供的 collection 或類對象為 null,則這些方法都將拋出NullPointerException。常用到的方法如copy,sort,reverse,replaceall等。

11、Synchronized和Lock區別和用法


首先他們都是用來實現線程的同步操作的,synchronized是jdk1.2以來一直存在,而且Lock是jdk1.5的新增;具體區別如下:

1、Lock是JDK1.5才出現的,而在jdk1.5及之前的synchronized存在很大的性能問題,尤其在資源競爭激烈的條件下,性能下降十多倍,而此時的Lock還基本能維持常態。(synchronized在jdk1.5后的版本,作了很大的性能優化)

2、使用synchronized時對象一定會被阻塞,其它線程必須等待鎖釋放后才能執行,在高并發的情況下,很容易降低性能,而且控制不當還容易造成死鎖,所以要合適的利用Synchronized,并且盡可能的精確到最小的業務邏輯塊。而Lock提供了更細致的操作,其常用的實現類有讀寫鎖,這里以ReentrantLock 為例,它擁有Synchronized相同的并發性和內存語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候等很多詳細的方法操作。 ReentrantLock獲取鎖定與三種方式:a) lock(), 如果獲取了鎖立即返回,如果別的線程持有鎖,當前線程則一直處于休眠狀態,直到獲取鎖b) tryLock(), 如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;c)tryLock(long timeout,TimeUnit unit),如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false;d) lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前線程處于休眠狀態,直到或者鎖定,或者當前線程被別的線程中斷。

3、synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在代碼執行時出現異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過代碼實現的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}中。

 

分享到:
標簽:java API
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定