HashSet中實現不插入重復的元素

/*
看一下部分的HashSet源碼....
public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();public HashSet() {map = new HashMap<>();}public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}public Iterator<E> iterator() {return map.keySet().iterator();}public boolean add(E e) {return map.put(e, PRESENT)==null;//在下面的代碼中我們可以看見map.put()的代碼}
}public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
{.....final int hash(Object k) {int h = 0;if (useAltHashing) {if (k instanceof String) {return sun.misc.Hashing.stringHash32((String) k);}h = hashSeed;}h ^= k.hashCode();//調用了改對象中的hashCode()方法,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);}public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key);//調用了上面的函數int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}
}也就是說HashSet內部實現使用HashMap這個類來完成的
TreeSet的內部實現元素之間是否相等?
從上面的比較方法中可以看出,只有兩個對象的hash值相等并且對象的內容也想等,那么兩個對象才相等
并且判斷的方法用的是 equals 方法
注意:當equals()此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。
*/import java.util.*;
public class CompTest{public static void main(String args[]){Set<myClass> st = new HashSet<myClass>();st.add(new myClass(1, "fd"));st.add(new myClass(2, "fff"));st.add(new myClass(2, "tttt"));st.add(new myClass(1, "fd"));for(Iterator<myClass> it = st.iterator(); it.hasNext();)System.out.println(it.next());}
}class myClass{public int x;public String name;public myClass(int x, String name){this.x=x;this.name=name;}public int hashCode(){return x;}public boolean equals(Object tmp){//這里是方法的重寫,參數的類型和個數一定要一樣....return x==((myClass)tmp).x && name.equals( ((myClass)tmp).name);}public String toString(){return x+" "+name;}
}

  

轉載于:https://www.cnblogs.com/hujunzheng/p/3815257.html

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

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

相關文章

tuxedo錯誤碼6_TUXEDE返回的所有錯誤代碼

TUXEDE返回的所有錯誤代碼tuxedo/include/atmi.h定于了TUXEDE返回的所有錯誤代碼。/** tperrno values - error codes* The man pages explain the context in which the following error codes* can return.*/#define TPMINVAL 0 /* minimum error message */#define TPEABORT…

java中finally和return的執行順序

注意&#xff1a;return的位置。。。從這幾個例子中可以看到&#xff0c;如果try之前沒有有條件的return&#xff0c;則try..catch..finally語句塊中的語句都是順序執行&#xff08;如果try中或者catch中 有return語句&#xff0c;那么先執行該return&#xff0c;然后執行final…

oracle如何設置權限,ORACLE的權限設置

創建用戶create user abc identified by 123;----------------------------------------------------授權grant create session,create table to abcgrant create sysdba to database----------------------------------------------------然后conn abc密碼&#xff1a;123----…

有關try..catch..finally處理異常的總結

//看一下下面的程序&#xff0c;你能正確的寫出不同的testEx2()方法時&#xff0c;程序的最終打印出來的數據嗎....先不要看下面的答案 public class ExceptionTest { public ExceptionTest() { } boolean testEx() throws Exception { boolean ret true; try { ret te…

oracle key的含義,v$session SERIAL#字段的含義

liyx&#xff1a;#!/bin/bash||#Write by liyx||||#數據庫服務器地址||DBHOSTlocalhost||#數據庫登錄名||USERNAMEroot||#數據庫密碼||PASSWORDroot||#需要備份的數據庫 或 輸入類似 db1 db2 的列表清單 例 DBNAMES"all"||DBNAMES"ess_simple"||#備份MYSQL…

java.util.Scanner簡單應用

import java.util.Scanner; import java.io.*; public class FileScannerTest{public static void main(String args[]){ //**************Scanner 的一般用//1.public Scanner(InputStream source),利用InputStream 對象進行構造Scanner myScanner1 new Scanner(System.in);w…

oracle能查dml記錄么,如何查詢DML操作的詳細記錄

可以通過flashback_transaction_qurey視圖查詢eg:SQL> desc flashback_transaction_queryName Null? Type----------------------------------------- -------- ----------------------------XID …

krpano 場景切換 通知_一個基于Vulkan的異步場景加載設計

異步場景加載基本流程驗證完成。此方法理論上只需要使用3個Vulkan的指令隊列。對于移動平臺上的Vulkan&#xff0c;指令隊列數量極少&#xff0c;比如Adreno640只有3個指令隊列可用。所以理論上這一設計也適合目前的移動平臺使用。(1) graphic_queue&#xff1a;用于完成當前場…

oracle 數據庫回閃,各種數據庫閃回的總結

本帖最后由 guoyJoe 于 2013-3-26 21:15 編輯一、Fashback Query閃回查詢:Books-->APP-->Application Developers Guide - Fundamentals-->Flashback&#xff11;、應用Flashback Query查詢過去的數據select * from t1 as of scn 44545454;select * from t1 as of tim…

poj 2528 Mayor's posters(線段樹+離散化)

1 /*2 poj 2528 Mayors posters 3 線段樹 離散化4 5 離散化的理解&#xff1a;6 給你一系列的正整數&#xff0c; 例如 1&#xff0c; 4 &#xff0c; 100&#xff0c; 1000000000&#xff0c; 如果利用線段樹求解的話&#xff0c;很明顯7 會導致內存的耗盡。所以我們做一…

漢儀尚巍手書有版權嗎_為什么“漢儀尚巍手書”會大行天下?

昨夜&#xff0c;我寫了篇文章《莫選最丑尚巍體&#xff0c;要選美麗中國字&#xff01;》發到朋友圈、微信群里&#xff0c;得到了一些朋友的反饋&#xff0c;有位朋友居然還認識尚巍&#xff0c;把他的微信推給了我。我加了尚巍的微信&#xff0c;待他通過后&#xff0c;便連…

如何查詢linux服務器的網卡,Linux服務器如何查看有沒有無線網卡

還是實驗室那臺服務器&#xff0c;連不上網。有沒有界面&#xff0c;所以想著如何用一些命令來鏈接上熱點。當然&#xff0c;在Linux下鏈接wifi沒有win下那么一點就好了&#xff01;首先我們需要的基本條件就是&#xff1a; 服務器上有無線網卡。[roottomato2 ~]# iwconfiglo n…

java中如何生成可執行的jar文件

java中如何生成可執行的jar文件最簡單的方法就是&#xff1a;jar -cfe Card.jar CardLayoutDemo CardLayoutDemo$1.class CardLayoutDemo$myAct ionListener.class CardLayoutDemo.class myClosingListener.class myPanel.class jar命令為java自帶的專用打包工具&#xff1b; c…

ecs硬盤數據遷移_阿里云ECS新增數據盤以及遷移數據方法

第一、檢查數據占用以及數據盤我們從探針可以看到&#xff0c;本身有30GB的硬盤只用到不到10GB&#xff0c;而且系統和WDCP面板/網站都系統盤中。通過fdisk -l 我們可以看到還有21GB的沒有格式化和掛載&#xff0c;系統只用到10.7GB。第二、對數據盤分區fdisk /dev/xvdb第三、查…

linux文件瀏覽 ls,linux瀏覽文件命令

在linux下我們要瀏覽文件的內容&#xff0c;可以通過相關的命令來執行操作&#xff0c;下面由學習啦小編為大家整理了linux下瀏覽文件命令的相關知識&#xff0c;希望對大家有所幫助!linux瀏覽文件命令1.cat[功能說明]查看文件的內容#cat本身是一個串接命令&#xff0c;把指定一…

python的多行語句可以使用反斜杠_python 為什么不用分號作終止符?

作者&#xff1a;豌豆花下貓 來源&#xff1a;Python貓一般而言&#xff0c;編程語言中使用分號“;”來實現兩種目的&#xff1a;作為語句分隔符&#xff1a;使用分號來分隔語句&#xff08;statement&#xff09;&#xff0c;這樣就能在一行代碼中書寫多條語句&#xff08;一行…

linux dlopen 內存,Linux下加載庫的有關問題(dlopenm, dlsym)

Linux下加載庫的問題(dlopenm, dlsym)如題&#xff0c; 程序中發現load庫成功&#xff0c;但是加載函數的時候報錯: undefined symbol functionname是很簡單的一個東西&#xff0c;因為不熟悉&#xff0c;所以老是弄不好&#xff0c;請各位指導&#xff01;代碼如下&#xff1a…

grafana zabbix 模板_Grafana + Zabbix 監控系統搭建

rafana&#xff1a;一個靜態項目&#xff0c;需要聯合nginx、apache等使用&#xff0c;友好的如下顯示首先安裝 grafana官網http://grafana.org/download/ 有好多版本可選&#xff0c;好幾種包形式&#xff0c;三種安裝方式(官方說明)&#xff1a;1、yum直接安裝 rpm包&#xf…

java二維數組的常見初始化

public class Test{public static void main(String[] args){//第一種&#xff1a;//int[][] arr1 new int[][]{{1,2}, {2, 3}, {4, 5}};int[][] arr1 {{1,2}, {2, 3}, {4, 5}};System.out.println("arr1的數值&#xff1a;");for(int i0; i<3; i)for(int j0; j…

linux svn 備份腳本,SVN熱備份腳本

SVN熱備份腳本2011-08-03 徐磊#!/bin/sh########################################################## Script to do incremental rsync backups# modidfy: wanjie.info# date: 2010/06/04# 這個腳本不是xulei寫的&#xff0c;我只是拿來主義&#xff0c;當然如果大家看不明白…