HashMap和HashSet

Java使用Set接口来描述集合,而Set中每一个数据元素都是唯一的。

HashSet散列集合

Hash算法:把任意长度输入,通过散列算法,变换成固定长度的输出即散列值。对不同类型信息,散列值公式也是不完全相同的。

使用HashSet存储自定义类时,要重写equals和hashCode方法,以便在集合校验元素时(数据元素不允许重复),需要调用equals和hashCode验证(返回均为true)。

hashCode函数:

public int hashCode()返回该对象的哈希码值。在重写父类的equals方法时,也重写hashcode方法,使相等的两个对象获取的hashCode也相等,这样当此对象做Key时,两个equals为true的对象其获取的value都是同一个。

例如,对于元素类Student:

1 class Student{
2     public String code;
3     public String name;
4     public Students(String code,String name){
5         this.code = code;
6         this.name = name;
7     }
8 }

在此类中,假定使用code来判断元素是否重复,应添加重写后的equals和hashCode函数:

 1 public boolean equals(Object o){
 2     if(this == o)
 3         return true;
 4     if(o.getClass() == Student.class){
 5         Student s = (Student)o;
 6         return s.code.equals(this.code);
 7     }
 8     return false;
 9 }
10
11 public int hashCode(){
12     return this.code.hashCode();
13 }

故而下面的例子,只会输出一组数据:First

 1 public class HashSetText{
 2     public static void main(String args[]){
 3         HashSet<Student>hs = new HashSet<Student>();
 4         Student s1 = new Student("1","First");
 5         hs.add(s1);
 6         Student s2 = new Student("1","Second");
 7         hs.add(s2);//此处,因为判断出1重复,故不会加入Second
 8
 9         Iteractor<Student>1 = hs.iterator();
10         while(i.hashNext()){
11             Student student = (Student) i.next();
12             System.out.println(student);
13         }
14     }
15 }

关于Iterator可以看这里:Java学习之Iterator(迭代器)的一般用法

Java使用Map接口描述映射结构,描述键key-值value的对应关系,Map不允许键重复,且每个键只能对应一个值。

HashMap散列图

Hashmap通过hash算法排布存储Map中的键(key),数据元素成对出现一一对应(key-value)。

HashMap内存模式并不是连续的,key值的排布根据Hash算法获得,检索速度较快。HashMap将所有键key装入迭代器遍历,或使用Entry类,将所有元素转化成Entry的集合进行处理。

将Map转化为Entry类的程序如下:

 1 public class HashMapToEntry{
 2     public static void main(String[] args){
 3         Map<Integer String> hMap = new HashMap<Integer,String>();
 4         hMap.put(1,"a");
 5         hMap.put(2,"b");
 6         hMap.put(3,"c");
 7
 8         Set<Entry<Integer,String>> hSet = hMap.entrySet();
 9         Iterator<Entry<Integer,String>> it = hSet.itetator();
10         while(it.hasNext()){
11             Entry<Integer,String> type = (Entry<Integer,String>) it.next();
12             int k = type.getKey();
13             String v = type.getValue();
14             System.out.println(k + "-" + v);
15         }
16     }
17 }

TreeMap树形映射:

TreeMap为有序映射关系,每对键key-值value遵循自然序列有序排列。当向TreeMap中插入新的数据元素时,TreeMap可能会重新排序,固元素在整个映射组中是不固定的。

当key为自定义类时,需要在自定义类中重写compareTo方法,以提供比对形式。

时间: 2024-10-29 19:12:17

HashMap和HashSet的相关文章

HashMap、HashSet源代码分析其 Hash 存储机制

集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存.取集合元素:对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是根据 Hash 算法来计算 key-value 的存储位置,这样可

JDK之HashMap、HashSet分析

HashMap主要分析key.value的放入Map和取出Map操作以及他的遍历器.个人觉得在HashMap中有个很重要的内部类Entry,Map的put,get等重要方法都是依靠这个Entry的.先来分析下这个内部类Entry,Entry中有几个重要的变量key.value.next,不用说大家也会明白这几个变量的含义,当然也自然会有get和set方法了.当我们在遍历Map的时候,有一种方法就是获取这个内部类的对象entry,然后去这个entry中取值.现在就以这个为例,遍历一个Map.首先获

HashMap和HashSet解析

------------------------------------------------HashMap------------------------------------------------------ 一.---概念--- HashMap继承自AbstractMap,实现了Map接口.下面从定义入手来开始分析: public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,

Java容器 HashMap与HashSet的学习

Java学习中,看到HashMap,HashSet类,本着不止要停留在用的层面( 很多公司面试都要问底层 ),学习了JDK源码,记录下笔记. 源码来自jdk1.7下的src.zip HashMap是一种键值对类型,它提供一种Key-Value对应保存的数据结构,实现了Map接口,其中key的值唯一,即一个key某一时刻只能映射到唯一的值. 看其中几个成员(没列全) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 sta

HashMap和HashSet的源代码分析

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认的扩容倍数 static final Entry<?,?>[] EMPTY_TABLE = {}; //就比较用的 transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;/

[转]HashMap与HashTable的区别、HashMap与HashSet的关系

转自: http://blog.csdn.net/wl_ldy/article/details/5941770 HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable.可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别. 一:HashMap与HashTable的区别 1.HashTable的方法是同步 的,在方法的前面都有synchronized来同步,HashMap未经同步,所以

java该HashTable,HashMap和HashSet

同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的三个集合HashTable,HashSet和HashMap具体解释. 本文文件夹: 1. HashTable和HashMap的差别 2. HashSet和HashMap的差别 3. HashMap,HashSet工作原理 4. HashSet工作原理 5. 常见问题 1. HashTable和HashMap的

HashMap和HashSet的区别http://www.importnew.com/6931.html

HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整.HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合.collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口.它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它

java中的HashTable,HashMap和HashSet

目录(?)[+] 上篇博客中我们详细的分析了java集合<java中Map,List与Set的区别>. 同时我们也对HashSet和HashMap的核心方法hashcode进行了详解,见<探索equals()和hashCode()方法>. 万事俱备,那么下面我们就对基于hash算法的三个集合HashTable,HashSet和HashMap详解. 本文目录: 1. HashTable和HashMap的区别 2. HashSet和HashMap的区别 3. HashMap,HashS

java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制

通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的引用放入数组中,每一个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有非常多相似之处,对于 HashSet 而言.系统採用 Hash 算法决定集合元素的存储位置,这样能够保证能高速存.取集合元素:对于 HashMap 而言.系统 key-value 当成一个总体进行处理