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

高手支招 Java經驗分享(三)

開發 后端
本篇文章是作者Ant_Yan在CSDN論壇上發布的自己對Java學習的一些經驗分享。這是他經驗分享的第三部分。

  前兩次分別講述了Java關于jvm、jdk、jre、collection、classLoader和一些Design Pattern的自我理解。這次仍然不準備開始過渡到j2ee中,因為覺得還有一些瑣碎的j2se的問題沒有總結完畢。

  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()卻是可以的,因為并沒有在同一對象上加兩把鎖的行為產生。

  這樣大家能理解了麼?明白它的原理能更好的幫助大家設計同步機制,不要濫用加鎖。

【編輯推薦】

  1. 新手入門:學習Java的一點經驗心得
  2. 61條Java面向對象設計的經驗原則
  3. 經驗分享:我的JavaEE學習道路
  4. Java對象類型轉換的四個經驗
責任編輯:韓亞珊 來源: CSDN
相關推薦

2011-03-31 13:32:13

Java

2011-03-31 14:07:27

Java

2011-03-31 14:49:35

2011-03-31 15:36:02

Java

2011-03-31 16:44:43

Java

2011-03-31 16:49:40

Java

2011-03-31 13:52:22

Java

2011-03-31 16:26:28

Java

2011-04-07 13:18:00

管理軟件項目項目

2009-10-29 16:57:05

Oracle傳輸表空間

2018-06-19 08:12:55

2010-07-21 14:05:31

2014-05-28 10:55:11

Windows XP安全補丁

2011-07-13 17:42:32

CC++

2010-08-18 14:19:01

無線路由器

2009-09-28 10:52:00

CCNA考試經驗CCNA

2011-06-22 14:51:46

JAVA

2009-02-06 10:39:22

NAS設備升級NAS

2009-12-07 11:11:46

PHP顯示圖片

2009-12-16 16:37:59

Ruby on Rai
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区不卡 | 夜夜草天天草 | 国产一区二区三区在线 | 黄色免费网址大全 | www.亚洲 | 日韩无| 日韩在线观看视频一区 | 国产一级片 | 欧美一区二区三区在线播放 | 久久99国产精一区二区三区 | 免费成人在线网站 | 久久久久久综合 | 国产精品久久久久久久久免费相片 | 色香蕉在线 | 久久一二 | 伊人焦久影院 | 亚洲在线一区 | 国产在线播放一区二区三区 | 超碰在线97国产 | 97国产爽爽爽久久久 | 99re在线视频 | 天天操综合网 | 天天综合久久网 | 99精品免费 | 天天操天天干天天透 | 欧美一区二区三区的 | 九九精品久久久 | 成人精品一区 | 国产区一区二区三区 | 日本福利在线观看 | 北条麻妃99精品青青久久主播 | 中文字幕在线剧情 | 精品国产一二三区 | 国产成人99久久亚洲综合精品 | 成人三级视频在线观看 | av网址在线 | 国产一区视频在线 | 男人天堂手机在线视频 | www.com久久久| 国产精品美女一区二区 | 中文字幕精品一区久久久久 |