----------------|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. Mysql-学习笔记(==》常用函数 八)

    -- 常用函数 字符编码uft8汉字为3个字节 gbk汉字两个字节 gbk占用空间小速度快 utf8兼容性好 -- length 返回字符的字节数SELECT LENGTH('asd王');-- ch ...

  2. context是什么意思

    context上下文吗,可以解释为程序运行的某一区间之内,提供对这一区间之内操作的一种对象,而且往往这一区间之内得核心操作都需要这个对象来进行 把Context翻译成“上下文”只是不直观罢了,不过也没 ...

  3. MSComm函数说明(来自网络)

    CommPort 设置并返回端口号 void CMSComm::SetCommPort(short nNewValue) short CMSComm::GetCommPort() RThreshold ...

  4. 【leetcode❤python】206. Reverse Linked List

    # Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         s ...

  5. 逐个后移,匹配符合要求的选项,ie7有bug

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. linux中mysql基本操作

    1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令: mys ...

  7. linux包的相关命令

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  8. C#:字段与属性

    MSDN中是这么介绍字段和属性的: A field is a variable of any type that is declared directly in a class or struct. ...

  9. 通知(NSNotificationCenter)

    // 监听加载更多的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadMoreDeals ...

  10. iOS - OC NSRect 位置和尺寸

    前言 结构体 这个结构体用来表示事物的坐标点和宽高度. typedef CGRect NSRect; struct CGRect { CGPoint origin; CGSize size; }; t ...