JavaSE之Java基礎(1)

1、為什么重寫equals還要重寫hashcode

首先equals與hashcode間的關系是這樣的:

1、如果兩個對象相同(即用equals比較返回true),那么它們的hashCode值一定要相同;

2、如果兩個對象的hashCode相同,它們并不一定相同(即用equals比較返回false) ??

為了提高程序的效率才實現了hashcode方法,先進行hashcode的比較,如果不同,那就沒必要再進行equals的比較了,這樣就大大減少了equals比較的次數,在需要進行大量比較的情況下可以顯著的提高效率,一個很好的例子就是在集合中的使用;我們都知道java中的List集合是有序的、可以重復的,而set集合是無序的、不能重復的。如果單靠equals方法比較的話,假設原來集合中已經有10000個元素了,那么放入第10001個元素時,要將前面所有的元素都進行equals比較,看看是否有重復,這個效率就會很慢,因此hashcode應運而生,java采用了hash表,利用哈希算法(也叫散列算法),就是將對象數據根據該對象的特征使用特定的算法將其定義到一個地址上,那么在后面定義進來的數據只要看對應的hashcode地址上是否有值,如果有,再用equals比較,如果沒有則直接插入,這樣就大大減少了equals的使用次數,執行效率就大大提高了。

簡單的說就是為了保證同一個對象,保證在equals相同的情況下hashcode值必定相同,如果重寫了equals而未重寫hashcode方法,可能就會出現兩個沒有關系的對象equals相同的(因為equal都是根據對象的特征進行重寫的),但hashcode確不相同,這樣就違背了Java API中對hashCode方法的描述。

2、說一下map的分類和常見的情況

java為數據結構中的映射定義了一個接口java.util.Map;它有四個實現類,分別是HashMap、Hashtable、LinkedHashMap和TreeMap。Map主要用于存儲健值對,不允許鍵重復(重復了會覆蓋掉),但允許值重復。

Hashmap是一個最常用的Map,它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的;HashMap最多只允許一條記錄的鍵為Null,允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致;如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

HashtableHashMap類似,不同的是,它不允許記錄的鍵或者值為空,支持線程同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了Hashtable在寫入時會比較慢。

LinkedHashMapHashMap的一個子類,保存了記錄的插入順序,在遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。在遍歷的時候會比HashMap慢;不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

TreeMap實現了SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序比較器,遍歷得到的記錄是排過序的。

一般情況下,我們用的最多的是HashMap,在Map中插入、刪除和定位元素,HashMap是最好的選擇;但如果想要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好;如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現。

3、Object若不重寫hashCode()的話,hashCode()如何計算出來的?

Object的hashcode方法是本地方法,也就是用c語言或c++實現的,該方法返回的是一個由內存地址經過散列得到的整數值。

4、==比較的是什么?

==比較的是兩個對象的內存地址是否相同。

5、若對一個類不重寫,它的equals()方法是如何比較的?

和==比較是一樣的,都是比較兩個對象的內存地址是否相同。

轉載于:https://www.cnblogs.com/liumilk/p/10599471.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249334.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bootstarp table

https://www.cnblogs.com/laowangc/p/8875526.html

高級組件——彈出式菜單JPopupMenu

彈出式菜單JPopupMenu,需要用到鼠標事件。MouseListener必須要實現所有接口,MouseAdapter是類,只寫你關心的方法,即MouseAdapter實現了MouseListener中的方法 import javax.swing.*; import java.awt.*; import java.awt.event.Mo…

CSS3筆記之基礎篇(二)顏色和漸變色彩

效果一、顏色之RGBA RGB是一種色彩標準,是由紅(R)、綠(G)、藍(B)的變化以及相互疊加來得到各式各樣的顏色。RGBA是在RGB的基礎上增加了控制alpha透明度的參數。 語法: color:rgba(R,G,B,A) 以上R、G、B三個參數,正整數值的取值…

19_03_26校內訓練[魔法卡片]

題意 有n張有序的卡片,每張卡片上恰有[1,m]中的每一個數,數字寫在正面或反面。每次詢問區間[l,r],你可以將卡片上下顛倒,問區間中數字在卡片上方的并的平方和最大是多少。q,n*m≤1,000,000。 思考 一個很重要的性質,若…

vue 靜態圖片引入

https://blog.csdn.net/weixin_33862188/article/details/93325502

c:if test=/c:if 使用

1、頁面引用<%taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> 2、整形判斷&#xff1a; <c:if test"${TEST 1}"> </c:if> 3、判斷非空&#xff1a; <c:if test"${empty TEST}"> TEST為空 <…

CSS3筆記之基礎篇(三)文字與字體

要點一、text-overflow與word-wrap text-overflow&#xff1a;設置是否使用一個省略標記&#xff08;...&#xff09;標示對象內文本的溢出。 word-wrap&#xff1a;設置文本行為&#xff0c;當前行超過指定容器的邊界時是否斷開轉行。 語法如下&#xff1a; 注意&#xff1…

XV6操作系統代碼閱讀心得(二):進程

1. 進程的基本概念 從抽象的意義來說&#xff0c;進程是指一個正在運行的程序的實例&#xff0c;而線程是一個CPU指令執行流的最小單位。進程是操作系統資源分配的最小單位&#xff0c;線程是操作系統中調度的最小單位。從實現的角度上講&#xff0c;XV6系統中只實現了進程&…

webservices

https://blog.csdn.net/VitaminZH/article/details/81123571

.Net Core 商城微服務項目系列(十二):使用k8s部署商城服務

一、簡介 本篇我們將會把商城的服務部署到k8s中&#xff0c;同時變化的還有以下兩個地方&#xff1a; 1.不再使用Consul做服務的注冊和發現&#xff0c;轉而使用k8s-dns來實現。 2.不再使用Ocelot作為業務網關&#xff0c;使用Traefik來實現。 正如上面所講&#xff0c;服務發現…

HTML、CSS知識點總結,淺顯易懂。

一&#xff0c;htmlcss基礎 1-1 Html和CSS的關系 學習web前端開發基礎技術需要掌握&#xff1a;HTML、CSS、JavaScript語言。下面我們就來了解下這三門技術都是用來實現什么的&#xff1a; 1. HTML是網頁內容的載體。內容就是網頁制作者放在頁面上想要讓用戶瀏覽的信息&#xf…

Thinking in Java 源代碼 source code 在IDEA上運行

參考我52的文章&#xff1a;https://www.52pojie.cn/thread-912471-1-1.html 轉載于:https://www.cnblogs.com/AI-Cobe/p/10605434.html

CSS知識體系圖譜

轉自&#xff1a;https://blog.csdn.net/A13330069275/article/details/78448415

python2 pip安裝包等出現各種編碼錯誤UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2......

1.問題描述&#xff1a; python2環境&#xff0c;pip安裝包時報錯UnicodeDecodeError: ascii(/或者utf-8) codec cant decode byte 0xd2... 類似如下情況 2.原因分析 一開始依據網上給出的教程修改python安裝路徑下的各種文件&#xff0c;添加各種編碼&#xff0c;始終無法解決…

mybatis自動生成代碼

https://blog.csdn.net/qq_31169429/article/details/89137896

leetcood學習筆記-111-二叉樹的最小深度

題目描述&#xff1a; 第一次提交&#xff1a; class Solution(object):def minDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0if root.left and root.right:return min(self.minDepth(root.left)1,self.minDept…

深入淺析HTML5中的article和section的區別

在HTML5中&#xff0c;為了使文檔的結構更加清晰明確&#xff0c;追加了幾個與頁眉、頁腳、內容區塊等文檔結構相關聯的結構元素。內容區塊是指將HTML頁面按邏輯分割后 的單位。例如對于書籍來說&#xff0c;章、節可以稱為內容區塊&#xff1b;對于博客網站來說&#xff0c;導…

IPV6 簡單總結

1. 轉帖別人的內容 來源&#xff1a;https://www.2cto.com/net/201112/114937.html 2. 本地用IPV6單播地址 (包括鏈路本地單播地址 和 站點本地單播地址) 2.1 鏈路本地單播地址 規定了鏈路本地和站點本地兩種類型的本地使用單播地址。鏈路本地地址用在單鏈路上&#xff0c; 而…

源碼分析

https://blog.csdn.net/taifei/article/details/73546836

面向對象第一單元總結

一、對面向對象的理解 有位同學給java的面向對象做了一個形象生動的類比&#xff0c;我覺得很有道理&#xff0c;大概按我的理解如下&#xff1a; 結構的形成看圖之前&#xff0c;我們要先明白&#xff0c;世界上是先有了實體&#xff0c;才有了一步步抽象至以上的體系結構&…