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

HashSet散列集合

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

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

hashCode函数:

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

例如,对于元素类Student:

 class Student{
public String code;
public String name;
public Student(String code,String name){
this.code = code;
this.name = name;
}
}

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

 public boolean equals(Object o){
if(this == o)
return true;
if(o.getClass() == Student.class){
Student s = (Student)o;
return s.code.equals(this.code);
}
return false;
} public int hashCode(){
return this.code.hashCode();
}

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

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

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

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

HashMap散列图

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

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

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

 public class HashMapToEntry{
public static void main(String[] args){
Map<Integer String> hMap = new HashMap<Integer,String>();
hMap.put(1,"a");
hMap.put(2,"b");
hMap.put(3,"c"); Set<Entry<Integer,String>> hSet = hMap.entrySet();
Iterator<Entry<Integer,String>> it = hSet.itetator();
while(it.hasNext()){
Entry<Integer,String> type = (Entry<Integer,String>) it.next();
int k = type.getKey();
String v = type.getValue();
System.out.println(k + "-" + v);
}
}
}

TreeMap树形映射:

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

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

HashMap和HashSet的更多相关文章

  1. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  2. 谁可以说出HashMap和HashSet的相同点和不同点。

    谁可以说出HashMap和HashSet的相同点和不同点. 2011-11-15 20:46ruoshui_t | 浏览 20310 次  Perl 2011-11-15 21:17 #知道行家专业创 ...

  3. [转] HashMap和HashSet的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  4. HashMap和HashSet的区别

    理解HashSet及使用 HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题 ...

  5. [置顶] HashMap HashTable HashSet区别剖析

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...

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

    集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量. 实际上,HashSet ...

  7. HashMap HashTable HashSet

    原文转载自 http://blog.csdn.net/wl_ldy/article/details/5941770 HashMap是新框架中用来代替HashTable的类 也就是说建议使用HashMa ...

  8. 【转】HashMap和HashSet的区别

    原文网址:http://www.importnew.com/6931.html HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的 ...

  9. HashMap HashTable HashSet区别剖析

    HashMap.HashSet.HashTable之间的区别是Java程序员的一个常见面试题目,在此仅以此博客记录,并深入源代码进行分析: 在分析之前,先将其区别列于下面 1:HashSet底层采用的 ...

  10. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

随机推荐

  1. Monkey测试2——Monkey测试策略

    Monkey的测试策略 一. 分类 Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一a ...

  2. 剖析信用卡 DCC 交易

    摘要: 所谓DCC交易(Dynamic Currency Conversion,直译:动态货币转换 ),或者叫CPC交易(Cardholder Preferred Currency,直译:持卡人选定货 ...

  3. 高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  4. 【转】Linux重定向操作符

    Linux重定向操作符 功能描述 > 将命令输出写入文件或设备,而不是命令提示符或句柄,清空原有文件然后写入 < 从文件而不是从键盘或句柄读入命令输入 >> 将命令输出添加到文 ...

  5. i++,++i,Math.max,hasOwnPrototype.ajax,indexOf(),firefox的一些东西,jquery的contains函数,window.open

    一.i++与++i的区别 1 var i=0;3 console.log(i++)5 0 1 var j=0; 2 3 console.log(++j) 4 1 a=++i;相当于i=i+1;a=i; ...

  6. Ouibounce – 在用户离开你网站时显示模态弹窗

    Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口.这个库可以帮助你增加着陆页的转换率. Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport ...

  7. 【经验之谈】前端面试知识点总结(HTML相关)——附答案

    目录 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5的优点与缺点? 3.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? 4.HTML5有哪些新 ...

  8. 百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程之更改图片和附件上传路径

    本文是接上一篇博客,如果有疑问请先阅读上一篇:百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程 默认UEditor上传图片的路径是,编辑器包目录里面的net目录下 下面就演示如 ...

  9. Ridge Regression(岭回归)

    Ridge Regression岭回归 数值计算方法的"稳定性"是指在计算过程中舍入误差是可以控制的. 对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这 ...

  10. -[UIViewController _loadViewFromNibNamed:bundle:]

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewC ...