文章插圖

文章插圖
43.hashCode()介紹
hashCode() 的作用是獲取哈希碼 , 也稱為散列碼;它實際上是返回一個int整數 。這個哈希碼的作用是確定該對象在哈希表中的索引位置 。hashCode() 定義在JDK的Object.java中 , 這就意味著Java中的任何類都包含有hashCode()函數 。
散列表存儲的是鍵值對(key-value) , 它的特點是:能根據“鍵”快速的檢索出對應的“值” 。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶ο螅?br /> 44.為什么要有 hashCode
我們以“HashSet 如何檢查重復”為例子來說明為什么要有 hashCode:
當你把對象加入 HashSet 時 , HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置 , 同時也會與其他已經加入的對象的 hashcode 值作比較 , 如果沒有相符的hashcode , HashSet會假設對象沒有重復出現 。但是如果發現有相同 hashcode 值的對象 , 這時會調用equals()方法來檢查 hashcode 相等的對象是否真的相同 。如果兩者相同 , HashSet 就不會讓其加入操作成功 。如果不同的話 , 就會重新散列到其他位置 。(摘自我的Java啟蒙書《Head first java》第二版) 。這樣我們就大大減少了 equals 的次數 , 相應就大大提高了執行速度 。
【Head First Java 《Head First Java》】hashCode()與equals()的相關規定
如果兩個對象相等 , 則hashcode一定也是相同的
兩個對象相等 , 對兩個對象分別調用equals方法都返回true
兩個對象有相同的hashcode值 , 它們也不一定是相等的
因此 , equals 方法被覆蓋過 , 則 hashCode 方法也必須被覆蓋
hashCode() 的默認行為是對堆上的對象產生獨特值 。如果沒有重寫 hashCode() , 則該 class的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)
對象的相等與指向他們的引用相等 , 兩者有什么不同?
對象的相等 比的是內存中存放的內容是否相等而 引用相等 比較的是他們指向的內存地址是否相等 。
45.抽象類和接口(Java7)的區別
1. 抽象類可以提供成員方法的實現細節 , 而接口中只能存在public abstract 方法;
2. 抽象類中的成員變量可以是各種類型的 , 而接口中的成員變量只能是public static final類型的;
3. 接口中不能含有靜態代碼塊以及靜態方法 , 而抽象類可以有靜態代碼塊和靜態方法;
4. 一個類只能繼承一個抽象類 , 而一個類卻可以實現多個接口 。
46.Java 8的接口新增了哪些特性?
增加了default方法和static方法 , 這2種方法可以有方法體 。
47.重寫和重載的區別
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變 。即外殼不變 , 核心重寫!
重寫的好處在于子類可以根據需要 , 定義特定于自己的行為 。也就是說子類能夠根據需要實現父類的方法 。
重寫方法不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的異常 。
重載(overloading) 是在一個類里面 , 方法名字相同 , 而參數不同 。返回類型可以相同也可以不同 。
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表
48.ArrayList和LinkedList有什么區別?
1. ArrayList和LinkedList的差別主要來自于Array和LinkedList數據結構的不同 。
ArrayList是基于數組實現的 , LinkedList是基于雙鏈表實現的 。另外LinkedList類不僅是List接口的實現類 , 可以根據索引來隨機訪問集合中的元素 , 除此之外 , LinkedList還實現了Deque接口 , Deque接口是Queue接口的子接口 , 它代表一個雙向隊列 , 因此LinkedList可以作為雙向隊列 , 棧(可以參見Deque提供的接口方法)和List集合使用 , 功能強大 。
2. 因為Array是基于索引(index)的數據結構 , 它使用索引在數組中搜索和讀取數據是很快的 , 可以直接返回數組中index位置的元素 , 因此在隨機訪問集合元素上有較好的性能 。Array獲取數據的時間復雜度是O(1),但是要插入、刪除數據卻是開銷很大的 , 因為這需要移動數組中插入位置之后的的所有元素 。
3. 相對于ArrayList , LinkedList的隨機訪問集合元素時性能較差 , 因為需要在雙向列表中找到要index的位置 , 再返回;但在插入 , 刪除操作是更快的 。因為LinkedList不像ArrayList一樣 , 不需要改變數組的大小 , 也不需要在數組裝滿的時候要將所有的數據重新裝入一個新的數組 , 這是ArrayList最壞的一種情況 , 時間復雜度是O(n) , 而LinkedList中插入或刪除的時間復雜度僅為O(1) 。ArrayList在插入數據時還需要更新索引(除了插入數組的尾部) 。
4. LinkedList需要更多的內存 , 因為ArrayList的每個索引的位置是實際的數據 , 而LinkedList中的每個節點中存儲的是實際的數據和前后節點的位置 。
49.靜態代理和動態代理的區別
靜態代理中代理類在編譯期就已經確定 , 而動態代理則是JVM運行時動態生成 , 靜態代理的效率相對動態代理來說相對高一些 , 但是靜態代理代碼冗余大 , 一單需要修改接口 , 代理類和委托類都需要修改
50.JDK動態代理和CGLIB動態代理的區別
JDK動態代理只能對實現了接口的類生成代理 , 而不能針對類 。
CGLIB是針對類實現代理 , 主要是對指定的類生成一個子類 , 覆蓋其中的方法 。因為是繼承 , 所以該類或方法最好不要聲明成final 。
- java怎么添加數據庫 java向mysql數據庫中添加
- JS彈窗代碼 javascript 彈窗
- java編程入門官方教程 java編程入門基礎教程
- java貪吃蛇代碼eclipse java貪吃蛇代碼怎么運行
- java界面開發工具 rpf java桌面開發工具
- js替換div內容 javascript替換網頁內容
- javaweb開發詳解 javaweb簡介
- java輸出語句格式錯誤 java輸出語句格式快捷鍵
- java方法定義在類中方法外面 java方法定義和調用
- java jar包運行命令 命令行 jar
