Set集合是JDK1.2版本后才有的,它同List集合一样也继承了Collection类,其Set主要实现了HashSet、TreeSet类。
关系图如下:
1、Set集合特点
- 无序
- 无下标
- 不可重复
Set也有泛型,但是Set里面没有方法来get获取值,唯一一个带getClass()还是我们后面学反射时才能用到的;Set不可单独取值,因为它是无序的
2、Set的取值方式
Set只有两种取值方式(ForEach、迭代器),只要是Collection集合它底下的所有集合都有迭代器,官方推荐使用迭代器,原因: Collection都有迭代器,安全可靠性更高;
public static void main(String[] args) {
Set set = new HashSet<>();
// 往set集合里面存入值
set.add("a");
set.add(1);
set.add(true);
set.add('b');
set.add(3.18);
set.add(3.18);
System.out.println(set.size());// 打印set集合的长度
System.out.println(set.toString());// 打印set集合
// Set集合的取值方式有两种
// 方法一:ForEach,ForEach循环取值有多少取多少,从来不会保留。
for (Object o : set) {
System.out.println(o);
}
System.out.println("************************");
// 方法二:通过迭代器打印
Iterator i = set.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
3、TreeSet和HashSet的区别?
3.1:TreeSet可以排序,它是根据某种(规则)对里面的元素进行排序。
根据以下两个规则进行排序,这两接口都能实现排序功能,它们里面都有帮助我们去排序的方法。
规则一:java.lang.Comparable
- 通过查看Comparble的具体实现类里面我们可以发现,该接口只有一个方法。即:public int comparaTo(T o)这个T默认是Object类型,传什么类型这个T就会变为什么类型,该方法译为:当前这个类跟你传过来的对象作比较,比较大小。
- ASCII:万事万物都可装换为ASCII,现在所有的ASCII全部转为哈希码,哈希码就是早期的ASCII,若public int comparaTo(String o)实现了Comparable,那么它的排序就是拿当前类跟你传过来的类作比较排序。
规则二:java.util.Comparatorr
- Comparator的方法有很多,但需要实现的只有一个
- 所有类的老祖宗都是Object,Object可以点出hashCode(),因此Student也可以点出
- Student有个潜规则,默认Student就是Object的儿子,所以如果需要在狗类里面通过该方法去比较两个学生的大小应该如何做?即前提条件就是Student必须要实现hashCode()方法 ,如果不实现hashCode()方法我们便不知道Student有什么属性。所有传过来的对象都必须要实现hashCode()方法,即有对应的hashCode()。
hashCode()方法
只有实现了这个方法,那么Student这个类就已经将自身的所有属性全部转换为hashCode(),那么我们再去调它的HashCode()就已经拿到了所有属性的hashCode()之和了。
注:不管是一个参的方法还是两个参的方法的最终原理都是为了实现ASCII的对比。
3.2:HashSet不可排序
因为HashSet继承的就是Set的特点,Set的特点就是无序,但Set也并非无序,事实上我们输出的Set集合的值的就是他默认的一种排序方式,只不过我们初学者真正去学的时候老师会跟我们说是无序的,因为当老师跟学生讲有序的说不清楚的,那么我们如何证明他是有序的呢?其实它的排序原理就是先把值转换成为哈希表里面的哈希值,然后再进行排序从而来显示给我们看。
4、拓展
4.1:Collections
Collections是对于集合类的工具类,它可以调到很多方法,主要针对集合类(Collection),即Collection里面所有子类都可以被Collections帮助到
4.2:Arrays
Arrays:工具类,提供了一组静态方法操作数组,冒泡排序用到过
冒泡排序方法:
int[] a= {465,98,8,3,132,89,56,8};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
注 :只要看到方法带三个点的那么久意味着它的传参是不受个数限制的,可不传参,也可传多个参
4.3:泛型
泛型的作用就是为了我们类里面的数据类型更加灵活,当我调用它传什么的时候,那么它就是什么数据类型,需要什么数据就可以定义到泛型里面去
4.4:LinkedHashSet
- 元素是有顺序的
- 元素是不重复的
- 底层数据结构是按照链表的结构存贮的Linked