----------------|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. 2016年11月13日 星期日 --出埃及记 Exodus 20:4

    2016年11月13日 星期日 --出埃及记 Exodus 20:4 "You shall not make for yourself an idol in the form of anyt ...

  2. centOS6.5安装SUN-jdk7

    一.下载SUN-JDK1.7.tar.gz文件他 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1 ...

  3. Runtime运行时的那点事儿

    注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...

  4. 我的android学习经历20

    WebView的使用 WebView既可以和Intent一样实现界面跳转一样,让系统浏览器打开页面,也可以在应用程序中打开页面 注意用WebView时,需要注册网络服务 代码如下: package c ...

  5. [翻译]投影变换 Projection Transform (Direct3D 9)

    你可以认为投影变换就是控制摄像机内部的一种方式.他可以类推为为摄像机选择一个漏字板.它是三种变换中最难懂的.本文只讨论以下的一些内容. 典型的投影变换就是缩放和透视投影.投影就变换把视椎转化为一个立方 ...

  6. SQL十进制和十六进制相互转换

    CREATE FUNCTION ufn_ConvertInt2Hex ( @Num BIGINT ) ) AS BEGIN /************************************* ...

  7. git学习笔记04-将本地仓库添加到GitHub远程仓库-git比svn先进的地方

    第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步. 如果没有,打开Shel ...

  8. org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决

      org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决 ...

  9. Python学习笔记8—语句

    条件语句 有的程序里写的是 /usr/bin Python,表示 Python 解释器在/usr/bin 里面.但是,如果写成 /usr/bin/env,则表示要通过系统搜索路径寻找 Python 解 ...

  10. windows 环境变量 %SystemDrive% 和 %SystemRoot%

    %SYSTEMROOT% == c:\windows (or the root windows directory) %SYSTEMDRIVE% == the drive windows is ins ...