栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

集合基础-Set

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

集合基础-Set

Set接口

 Set接口继承自Collection。Set接口中没有新增的方法。

Set更注重独一无二的性质,该体系集合用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。对象的相等性本质是对象hashCode值(根据对象的内存地址计算出的此序号)判断。如果想让两个不同的对象相等,就必须覆盖Object的hashCode方法和equals方法。

Set有几个常用的实现类,HashSet 、TreeSet 、linkedHashSet

HashSet: HashSet(Hash表)里边存放的是哈希值,HashSet存储元素的顺序并不是按照存入时的顺序,而是按照哈希值来存储,那么取出的顺序也是按照Hash值。元素的Hash值与HashMap一致,利用hashCode方法来获取。

查看源码:HashSet的实现底层,实际上是利用了一个HashMap。利用Key的不可重复性,使得Set存储的数据的必须有唯一性。及设置Key,Val可以设置为0.

static final long serialVersionUID = -5024744406713321676L;
private transient HashMap map;
private static final Object PRESENT = new Object();

public HashSet() {
    map = new HashMap<>();
}

 那么我们实现一个基础的HashSet就比较容易:

package 集合.Set.手写Set;

import java.util.HashMap;


public class HashSet_ {

    private HashMap map ;
    private static final Object p = new Object();
    public HashSet_(E e ) {
        init(e);
    }
    private void init(E e){
        map = new HashMap();
    }
    public void add(E e){
        map.put(e,p);
    }
    public int size(){
        return map.size();
    }
    public void remove(E e){
        map.remove(e);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Object key : map.keySet()){
            sb.append(key.toString()+" ")  ;
        }
        return sb.toString();
    }
}
package 集合.Set.手写Set;

import java.util.HashSet;


public class testDemo {
    public static void main(String[] args) {
        HashSet set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(1);
        System.out.println(set);
        set.remove(2);
        System.out.println(set);
    }
}

[1, 2, 3, 4]
[1, 3, 4]

Process finished with exit code 0

TreeSet

        TreeSet是使用二叉树对新加入的对象按照指定的顺序进行排序。每加入一个对象都会进行排序,将对象插入二叉树指定的位置。TreeSet的实现同样在底层是通过TreeMap。.

        注意: Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自 己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。

linkedHashSet(HashSet + linkedHashMap)

对于 linkedHashSet 而言,它继承与 HashSet、又基于 linkedHashMap 来实现的。 linkedHashSet 底层使用 linkedHashMap 来保存所有元素。所以使用linkedHashSet时,我们只需要按照HashSet的使用方法即可。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/325601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号