java 集合(Set1)
----------------|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)的更多相关文章
- java集合框架1
1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). 当我们把一个对象放入集合中后,系统会把所有集合元素都当成O ...
- Java集合框架之四大接口、常用实现类
Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...
- 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...
- 032.[转] Java集合框架
Java集合框架和各实现类性能测试 pphh发布于2017年11月17日 Java语言集合框架提供一系列集合接口类 (collection interface)和实现类,满足对集合中元素对象的各种集合 ...
- java集合的简单用法
typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
随机推荐
- log4j---------学习总结(一)
一.log4j框架 log4j可靠的,快速的,可扩展的(灵活的)日志框架 log4j具有高可配置性,可以通过外部配置文件来控制 log4j可以根据日志不同级别来过滤日志, log4j可以将日志记录直接 ...
- Jetty和Tomcat的选择:按场景而定
Jetty和Tomcat的选择:按场景而定 Jetty和Tomcat为目前全球范围内最著名的两款开源的webserver/servlet容器.由于它们的实现都遵循Java Servlet规范,一个Ja ...
- 单片机特殊功能寄存器(SFR)
单片机如8051有21个SFR,地址为80H~0FFH的128个字节中,可以直接用寻址方式来操作SFR.(类似于sbit) 为了能直接访问这些SFR,keil提供饿了一种自汉族形式的定义方法.这种方法 ...
- 将linux默认python升级到2.7.4版本
第一步:下载python2.7.4版本源码: wget http://python.org/ftp/python/2.7.4/Python-2.7.4.tgz 解压文件 [aa@localhost ~ ...
- 【leetcode❤python】350. Intersection of Two Arrays II
#-*- coding: UTF-8 -*- class Solution(object): def intersect(self, nums1, nums2): ...
- [HRBUST1472]Coin(dp,计数)
题目链接:http://acm-software.hrbust.edu.cn/problem.php?id=1472 题意:给n个硬币,面值随意.问恰好凑成m元的种类数(去掉重复). dp(i,j,k ...
- c# 基础之数组(包含三维数组)
public enum ChessType { White = , None=, Black=, } class Program { static void Main(string[] args) { ...
- Practical Java
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ctrl+z暂停任务
(1) CTRL+Z挂起进程并放入后台 (2) jobs 显示当前暂停的进程 (3) bg %N 使第N个任务在后台运行(%前有空格) (4) fg %N 使第N个任务在前台运行 默认bg,fg不带% ...
- poj 1064 (二分+控制精度) && hdu 1551
链接:http://poj.org/problem?id=1064 Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submi ...