黑马程序员--07.集合框架--05.【集合Set】【哈希表】
来源:互联网 发布:银河铁道之夜 知乎 编辑:程序博客网 时间:2024/05/17 07:40
集合框架--5 Set
Set 哈希表
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. Set接口概述
1). Set接口常见实现子类的概述
(1). Set接口常见实现子类的继承体系图
[1]. Set集合的特点是:无序并且不能重复
【序的含义】顺序指的是存入和取出的顺序是否一致。
有序和无序:如果一致,称为有序,否则,成为无序
[2]. 继承体系图
{1}. HashSet底层的数据结构是哈希表
{2}. TreeSet底层的数据结构是二叉树
[3].Set中的方法和子类Collection中的方法一致,没有变化。
2). 哈希表的原理
(1). 哈希表的基本概念
[1]. 哈希表:就是存放哈希值的表
示例:
class Demo{}public class Test { public static void main(String[] args) { Demod1 =new Demo(); Demod2 =new Demo(); Demod3 =new Demo(); Demod4 =new Demo(); System.out.println(d1.toString()+".."+d1.hashCode()); System.out.println(d2.toString()+".."+d2.hashCode()); System.out.println(d3.toString()+".."+d3.hashCode()); System.out.println(d4.toString()+".."+d4.hashCode()); }}
打印出来的@ 后的就是这个对象对应的哈希值。
打印结果:
Demo@c3c749..12830537
Demo@150bd4d..22068557
Demo@1bc4459..29115481
Demo@12b6651..19621457
[2].【哈希表如何存放哈希值?】
哈希表中存放的哈希值很可能是按照哈希值本身大小来存放的。
这样,如果将以上的哈希值存入哈希表,那么这个顺序很可能是如下形式的:
[3]. 哈希表存储的无序性
根据[2]中的例子,哈希表中哈希值的存储顺序并不是存入哈希值的顺序
这就是无序性。
【注意】哈希表存储是有顺序的,但是很可能这个顺序和你存储数据的顺序不一致,表现出来无序性。内部实质是有顺序的。
[4]. 哈希表和数组【个人理解】
【以下能解释为什么ArrayList和HashSet存储的分别是有序和无序的】
{1}. 哈希表:按照哈希值 (大小) 来进行存贮数据
存储的顺序和数据对应的哈希值的大小顺序未必一致。
所以,HashSet存储数据之后的顺序和存放数据时的顺序不一致。
{2}. 数组:按照角标来进行存贮数据。
存储的顺序就是一点点累加的角标的顺序【新来一个数据,角标++】
所以,ArrayList存储数据之后的顺序和存放数据时的顺序一致。
示例代码:
ArrayList al1 =new ArrayList();al1.add("java01");al1.add("java02");al1.add("java03");al1.add("java04");System.out.println("al1的元素:"+ al1); HashSet hs =new HashSet();hs.add("java01");hs.add("java02");hs.add("java03");hs.add("java04");System.out.println("hs的元素:"+ hs);
内存代码示意图:
【ArrayList】角标从小到大----->保证了有序性
【HashSet】哈希值从小到大----->保证了无序性
[5]. 哈希值可一样么?
Java中的哈希值是通过本地方法hashCode()计算出来的。但是这个方法可以重写,所以重写hashCode之后可以让哈希值相同。
[6]. 哈希表如何处理哈希值相同的对象?
在哈希表中,如果两个对象的哈希值相同,还有进一步校验形式:这个时候,判断两个对象的内容是否一样,如果不一样,会将这个哈希值相同的对象向下顺延。
举例:
public class Demox { public int hashCode(){ return 60; } public static void main(String[] args) { Demoxd1= new Demox(); Demoxd2= new Demox(); Demoxd3= new Demox(); Demoxd4= new Demox(); System.out.println(d1); System.out.println(d2); System.out.println(d3); System.out.println(d4); }}
打印结果:
现在假设这四个对象不是同一个对象,这几个对象在哈希表中存储会顺延:
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
- 黑马程序员--07.集合框架--05.【集合Set】【哈希表】
- 黑马程序员:集合框架Set
- 黑马程序员-----------------集合框架-Set
- 黑马程序员:集合框架Set
- 黑马程序员:集合框架Set
- 黑马程序员-集合框架的Set集合
- 黑马程序员__Java集合框架SET集合
- 黑马程序员_day18_集合框架 List 、Set
- 黑马程序员_集合框架(List,Set)
- 黑马程序员__集合框架(List,Set)
- 黑马程序员--集合框架(List,Set)
- 黑马程序员--集合框架(二)Set
- 黑马程序员-Java集合框架Set
- 黑马程序员--java基础--集合框架Set,集合框架map
- 黑马程序员-------Set集合
- 黑马程序员-------Set集合
- 黑马程序员--Set集合
- 奋斗黑马程序员----Java集合框架之Set集合
- arm+linux 裸机环境搭建之安装工具篇(gcc与gdb)
- C++ 函数总结(调用+函数+变量)
- C++指针总结
- 日记:如何在MFC中使用Winsock2
- 100分求助,如何正确包含 winsock2.h
- 黑马程序员--07.集合框架--05.【集合Set】【哈希表】
- Pattern类
- jsp servlet 中数据源的配置(建议用框框架写项目,不过此篇博文以备那些小白们只会servlet写项目用)
- 网络编程socket基本API详解
- 解决在头文件加入#include"winsock2.h"后出现重复定义的办法
- POJ 1873 The Fortified Forest
- 面试题目20130724 成都闻通通信
- responseText的返回值
- 使用CImage显示透明的PNG图片