----------------|Collection(为什么要画这个图?学多了之后该忘了)

--------------------------|List

----------------------------------------|ArrayList

----------------------------------------|LinkedList

----------------------------------------|Vector

---------------------------|Set

----------------------------------------|HashSet

----------------------------------------|TreeSet

Set:

特有的方法在前面有接触。所以没有太特别的方法(查看API)

哈希表:有行有列的才能称为表,可以把哈希表想成那种普通的表格,

    而哈希码可以简单的理解为地址,每当new 出一个对象调用

    其hashCode方法时,会算出该对象所对应的哈希值,然后

    对照着哈希值填入哈希表(就是在内存中找到自己的位置),

    也就是通过元素的哈希值通过等位移运算,算出该元素在哈希表中

    的储存位置。

    哈希表的一个特点是“桶式结构”(一个坑里可以填多个萝卜),

    这里所说的坑就好比与哈希表的一个个小格,萝卜就好比于你创建的对象。

    就是在集合里的元素啦。问题来了,如果这时没有重写hashCode方法,两个一样的对象

    就会被填入一个格中,这就与Set集合的特点(有序,不重)相违背,

    相当于有重复的元素,所以要重写hashCode方法。


hashSet的实现原理:

向HashSet 添加元素时,HashSet先调用hashCode方法,算出哈希值

找到该元素在哈希表的储存位置。

情况1:算出元素的存储位置同时没有任何元素存储在这,则该元素可以存储在该位置上。

情况2:如果位置上有了元素,这是会调用equals方法,与该位置的元素再比较一次,

如果返回true,该元素就是重复的,不能添加。返回false可以。

import java.util.*;
import java.util.ListIterator;
public class ex12 {
public static void main(String[] args) { HashSet set = new HashSet();
set.add(new Person(100, "Tom"));
set.add(new Person(101, "Jack"));
set.add(new Person(102, "LiLi"));
System.out.println(set);//此时运行输出的不是你想的,要重写toString()
System.out.println();//打印空行,为了好看
set.add(new Person(101, "Tom"));
System.out.println(set);//明明是一样的为什么还可以填进去呢? 去重写hashCode()
//还是没用 去重写equals()
}
} class Person {
int id;
String name; public Person(int id, String name){
this.name = name;
this.id = id;
} @Override
public String toString() {
return "{ id = " + this.id + " name = " + this.name + " }";
} @Override
public int hashCode() {
System.out.println("----------hashCode-----------");//方便看出分别调用了词hashCode 和 equals()
return this.id;
} @Override
public boolean equals(Object obj) {
System.out.println("----------equals-----------");
Person p = (Person)obj;
return this.id == p.id;
}
}
----------hashCode-----------
----------hashCode-----------
----------hashCode-----------
[{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }] ----------hashCode-----------
----------equals-----------
[{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }] Process finished with exit code 0

    

    

java 集合(Set1)的更多相关文章

  1. java集合框架1

    1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). 当我们把一个对象放入集合中后,系统会把所有集合元素都当成O ...

  2. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  3. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  4. 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计

    问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...

  5. 032.[转] Java集合框架

    Java集合框架和各实现类性能测试 pphh发布于2017年11月17日 Java语言集合框架提供一系列集合接口类 (collection interface)和实现类,满足对集合中元素对象的各种集合 ...

  6. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

  7. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  8. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  9. java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...

  10. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

随机推荐

  1. SQL 中ROLLUP 用法

    SQL 中ROLLUP 用法 ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集. 下面是 CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有 ...

  2. 简单的ajax封装

    // ajax发送post请求返回 json 数据function requestJSON(params) {    params.dataType = 'json';    sendPost(par ...

  3. xtrabackup 安装、备份、还原及错误处理 教程

    xtrabackup 是MYSQL的一个备份软件 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个 ...

  4. 达人眼中的WINCE网络驱动

    实际上在WinCE上开发网络驱动,比如设计一个NIC驱动, 大多数情况,是从XP移植NDIS Miniport驱动(小端口驱动)到WinCE.什么是ndis?Ndis做什么用的? 什么是minipor ...

  5. BZOJ 2132 圈地计划(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2132 题意:n*m的格子染色黑白,对于格子(i,j)染黑色则价值为A[i][j],白色为 ...

  6. C++实现链式栈,运用模板,界面友好,操作方便,运行流畅

    //.h文件 #ifndef STACK_H #define STACK_H #include<iostream> #include<iomanip> using namesp ...

  7. centos7 安装教程

    1. 在安装的时候,不要用默认的最小安装.选择GNOME Desktop 2.自动分区的时候,选择自己进行分区 2个分区,1个大小为1024M的swap分区,剩下的分配一个ext3的分区.设备类型都选 ...

  8. Installing Chocolatey

    https://chocolatey.org/install To install chocolatey now, open an administrative command prompt and ...

  9. Codeforces Round #249 (Div. 2) A题

    链接:http://codeforces.com/contest/435/problem/A   A. Queue on Bus Stop time limit per test 1 second m ...

  10. XAF应用开发教程(一) 创建项目

    XAF是DevExpress公司的快速开发框架,全称eXpress Application Framework,是企业信息系统的开发利器,快速开发效果显著,在.net框架中,笔者至今没有找到一款可以与 ...