set集合——无序的不重复元素序列

set集合——无序的不重复元素序列,第1张

在刷剑指offer时,看到有的实现用了这个set相关的方法,但是我却想不起来了数升,所以在这边做一个整理。

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

当set中添加重谈毕宴复元素时,不会报错,但是重复元素不会添加进去,只保留一个。

parame = {value01,value02,...}

或者set(value)

Num = set()

Num.add(x) #添加单个含银

Num.add(y,z) #添加多个,用逗号隔开

Num.remove(x) or Num.discard(X)

Num.pop() #随机删除

Set 有个 add 方法是将元素添加到 Set 中,以 HashSet 为例。

public boolean add(E e) {

    return map.put(e, PRESENT)==null

}

可以看到,HashSet 底层的数据结构是一个HashMap<E,Object>,将 e 作为 HashMap 的 key 保存的。而 HashMap 的底层数据结构是 HashTable ,根据 HashMap 的 key 的HashCode 去 HashTable (具体实现是数组+链表) 里找到元素的位置。如果同一个对象(使用equals 来比较两个对象是否相携此同,具体是比较对象的 hashCode() 是否相同) 往Set 里放,最终放到 HashTable 的位置是相同的。具体判断Set 是否包含某个对象,调用的是Set的contains(Object o) 方法,它内部也是通过计算 o 的hashCode 去查找该元素是否兄改存在的。

如果题主是新学习Java的同学,建议重辩尘迅点学习一下常用集合的数据结构,对于掌握Java这门语言非常有帮助。

你好,首先要明白一点:加入Set里面的元素必须定义equals()方法以确保对象的唯一性。

第一个问题:

TreeSet的底层实现是采用红-黑树的数据结构,采用这种结构可以从Set中获取有序的序列,但是前提条件是:元素必须实现Comparable接口,该接口中只用一个方法,就是compareTo()方法。当往Set中插入一个新的元素的时候,首先会遍历梁渣乎Set中已经存在的元素(当然不是采用顺序遍历,具体采用什么方法,建议自己去看看源码),并调用compareTo()方法,根据返梁族回的结果,决定插入位置。进而也就保证了元素的顺序。

第二个问题:

上面已经说过,加入Set里面的元素必须定义自己的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashCode()方法,当然,对于TreeSet而言不用覆盖hashCode()方法也可。请记住:覆盖hashCode()方法的目的,只有一个原因就是提高效率。

在往Set中插入新的对象时,橡悉首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。

注:如果没有覆盖hashCode()方法,那就是只比较equals().对两个对象equals运算,是判断两个对象是否相等的关键。

第三个问题:

2)HashSet与TreeSet区别:

1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11976172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存