黑马程序员--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]. 哈希表数组【个人理解】

【以下能解释为什么ArrayListHashSet存储的分别是有序和无序的】

{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学习型技术博客、期待与您交流! ------------

原创粉丝点击