成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JAVA編程經驗匯總(三)

開發 后端
本文系列的文章介紹的是JAVA編程經驗,本文是第三篇。適合初學者閱讀,希望對你有幫助,一起來看。

學習Java比C++更容易理解OOP的思想,畢竟C++還混合了不少面向過程的成分。本系列文章,介紹JAVA編程經驗。建議閱讀上一篇:JAVA編程經驗匯總(二)

1. 關于Object類理解

大家都知道Object是所有Java類的基類, 意味著所有的Java類都會繼承了Object的11個方法。建議大家去看看Object的 11個成員函數的源代碼,就會知道默認的實現方式。比如equals方法,默認實現就是用"=="來比較,即直接比較內存地址,返回true 或者 false。而toString()方法,返回的串組成方式是?

  1. "getClass().getName() + "@" + Integer.toHexString(hashCode())"  

其實不用我過多的解釋,大家都能看懂這個串的組成。接下來再看看hashCode():

  1. public native int hashCode(); 

由于是native方法,跟OS的處理方式相關,源代碼里僅僅有一個聲明罷了。我們有興趣的話完全可以去深究它的hashCode到底是由OS怎么樣產生的呢?但筆者建議最重要的還是先記住使用它的幾條原則吧!首先如果equals()方法相同的對象具有相通的hashCode,但equals ()對象不相通的時候并不保證hashCode()方法返回不同的整數。而且下一次運行同一個程序,同一個對象未必還是當初的那個hashCode() 哦。

其余的方法呢?nofigy()、notifyAll()、clone()、wait()都是native方法的,說明依賴于操作系統的實現。最后一個有趣的方法是finalize(),類似C++的析構函數,簽名是protected,證明只有繼承擴展了才能使用,方法體是空的,默示什么也不做。它的作用據筆者的了解僅僅是通知JVM此對象不再使用,隨時可以被銷毀,而實際的銷毀權還是在于虛擬機手上。

那么它真的什么也不做麼?未必,實際上如果是線程對象它會導致在一定范圍內該線程的優先級別提高,導致更快的被銷毀來節約內存提高性能。其實從常理來說,我們也可以大概這樣猜測出jvm做法的目的。

2.關于重載hashCode()與Collection框架的關系

筆者曾經聽一位搞Java培訓多年的前輩說在他看來hashCode方法沒有任何意義,僅僅是為了配合證明具有同樣的hashCode會導致equals 方法相等而存在的。連有的前輩都犯這樣的錯誤,其實說明它還是滿容易被忽略的。那么hashCode()方法到底做什么用?

學過數據結構的課程大家都會知道有一種結構叫hash table,目的是通過給每個對象分配一個唯一的索引來提高查詢的效率。那么Java也不會肆意扭曲改變這個概念,所以hashCode唯一的作用就是為支持數據結構中的哈希表結構而存在的。

換句話說,也就是只有用到集合框架的 Hashtable、HashMap、HashSet的時候,才需要重載hashCode()方法,這樣才能使得我們能人為的去控制在哈希結構中索引是否相等。筆者舉一個例子:

曾經為了寫一個求解類程序,需要隨機列出1,2,3,4組成的不同排列組合,所以筆者寫了一個數組類用int[]來存組合結果,然后把隨機產生的組合加入一個HashSet中,就是想利用HashSet不包括重復元素的特點。可是HashSet怎么判斷是不是重復的元素呢?當然是通過 hashCode()返回的結果是否相等來判斷啦,可做一下這個實驗:

  1. int[] A = {1,2,3,4};   
  2. int[] B = {1,2,3,4};   
  3. System.out.println(A.hashCode());   
  4. System.out.println(B.hashCode());  

這明明是同一種組合,卻是不同的hashCode,加入Set的時候會被當成不同的對象。這個時候我們就需要自己來重寫hashCode()方法了,如何寫呢?其實也是基于原始的hashCode(),畢竟那是操作系統的實現, 找到相通對象唯一的標識,實現方式很多,筆者的實現方式是: 

首先重寫了toString()方法:

  1. return A[0]“+” A[1]“+” A[2]“+” A[3]; //顯示上比較直觀  

然后利用toString()來計算hashCode():

  1. return this.toString().hashCode();  

這樣上述A和B返回的就都是”1234”,在測試toString().hashCode(),由于String在內存中的副本是一樣的,”1234”.hashCode()返回的一定是相同的結果。

說到這,相信大家能理解得比我更好,今后千萬不要再誤解hashCode()方法的作用。

3. 關于Class類的成員函數與Java反射機制

很早剛接觸Java就聽很多老師說過Java的動態運行時機制、反射機制等。確實它們都是Java的顯著特點,運行時加載筆者在第一篇介紹過了,現在想講講反射機制。在Java中,主要是通過java.lang包中的Class類和Method類來實現內存反射機制的。

熟悉C++的人一定知道下面這樣在C++中是做不到的: 運行時以字符串參數傳遞一個類名,就可以得到這個類的所有信息,包括它所有的方法,和方法的詳細信息。還可以實例化一個對象,并通過查到的方法名來調用該對象的任何方法。這是因為Java的類在內存中除了C++中也有的靜態動態數據區之外,還包括一份對類自身的描述,也正是通過這描述中的信息,才能幫助我們才運行時讀取里面的內容,得到需要加載目標類的所有信息,從而實現反射機制。

大家有沒有想過當我們需要得到一個JavaBean的實例的時候,怎么知道它有哪些屬性呢?再明顯簡單不過的例子就是自己寫一個JavaBean的解析器:

a. 通過Class.forName(“Bean的類名”)得到Class對象,例如叫ABeanClass 

b. 通過ABeanClass的getMethods()方法,得到Method[]對象

c. 按照規范所有get方法名后的單詞就代表著該Bean的一個屬性

d. 當已經知道一個方法名,可以調用newInstance()得到一個實例,然后通過invoke()方法將方法的名字和方法需要用的參數傳遞進去,就可以動態調用此方法。

當然還有更復雜的應用,這里就不贅述,大家可以參考Class類和Method類的方法。

4. 坦言Synchronize的本質

Synchronize大家都知道是同步、加鎖的意思,其實它的本質遠沒有大家想得那么復雜。聲明Synchronize的方法被調用的時候,鎖其實是加載對象上,當然如果是靜態類則是加在類上的鎖,調用結束鎖被解除。它的實現原理很簡單,僅僅是不讓第二把鎖再次被加在同一個對象或類上,僅此而已。一個簡單的例子足以說明問題:

  1. class A{   
  2. synchronized void f(){}   
  3. void g(){}   
  4. }  

當A的一個對象a被第一個線程調用其f()方法的時候,第二個線程不能調用a的synchronized方法例如f(),因為那是在試圖在對象上加第二把鎖。但調用g()卻是可以的,因為并沒有在同一對象上加兩把鎖的行為產生。

進一步閱讀,下一篇:JAVA編程經驗匯總(四)

【編輯推薦】

  1. Java數據庫程序中的存儲過程設計
  2. JAVA語言關于字符串替換的思考
  3. JAVA語言中關于EJB技術概論
  4. java/.net語言及IDE簡易對比
  5. 關于Java對象序列化您不知道的5件事
責任編輯:于鐵 來源: 互聯網
相關推薦

2011-06-22 14:45:52

JAVA

2011-06-22 15:04:28

JAVA

2011-06-22 14:38:14

JAVA

2012-02-06 10:37:07

Java

2014-03-10 10:24:01

MySQLMySQL優化

2011-03-31 13:56:24

Java

2011-07-07 15:48:22

PHP編程習慣

2010-09-09 16:48:01

2010-05-28 19:32:24

MySQL使用方法

2018-06-07 09:29:34

數據庫MySQL慢SQL

2011-07-13 16:36:11

C++

2009-09-04 16:33:28

CCNA學習方法

2010-06-12 13:39:33

MySQL操作blob

2010-07-01 10:38:46

SQL Server交

2010-05-27 13:12:10

MySQL 常用命令

2010-09-17 17:35:55

2009-11-02 15:16:07

VB.NET編程

2011-07-07 18:15:41

軟件開發

2009-12-22 18:18:11

WCF客戶端編程

2009-02-04 09:45:05

Java SocketSocket APIJava編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 成人免费观看网站 | 九九九久久国产免费 | 精品成人在线观看 | 欧美一区二区成人 | 国产内谢| 欧美日韩一区精品 | 国产日韩欧美一区 | av天天看 | 欧美天堂在线 | 一区不卡在线观看 | 午夜激情影院 | 一级黄在线观看 | 久久精品久久久久久 | 亚洲国产精品成人综合久久久 | 国产 日韩 欧美 中文 在线播放 | 成人免费大片黄在线播放 | 断背山在线观看 | 在线视频一区二区 | 成人在线精品 | 欧美 日韩 国产 成人 在线 91 | 欧美激情精品久久久久久变态 | 日韩精品一二三 | 久久一区 | 亚洲日日夜夜 | 日韩高清不卡 | 一区二区三区在线观看视频 | 精品不卡 | 亚洲精品免费视频 | 亚洲精品国产一区 | 精品国产一区二区三区四区在线 | 国产日韩一区二区三免费 | 一区二区三区免费在线观看 | 一色桃子av一区二区 | 国产福利91精品 | 国产美女永久免费无遮挡 | 久久成人免费视频 | 国产精品电影网 | 超碰欧美| 依人成人 | 婷婷激情在线 |