Set接口-HashSet-LinkedHashSet-TreeSet

HashSet:

hashSet不能添加重复的元素,不保证元素的顺序。HastSet是基于HashMap实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT。相关hashSet的操作,基本上都是调用HashMap的相关方法来完成的。

LinkedHashSet:

LinkedHashSet不允许有重复的集合,并且是有序的,可以在遍历LinkedHashSet时,保持元素的顺序与添加时的顺序一致。
LinkedHashSet在HashSet的基础之上使用链表来实现有序的HashSet,包装元素的遍历顺序和插入顺序一致。

LinkedHashSet在构造方法中用super调用了父类HashSet的构造器,在HashSet中 new了一个LinkedHashMap来存储数据。
LinkedHashMap在HashSet的哈希表数据结构基础之上,增加了一个双向链表用来记录元素的添加顺序。相对于HashSet,LinkedHashSet可以保证元素的遍历顺序和插入顺序一致。

TreeSet:

  • TreeSet是一个有序集合,它按照元素的自然顺序或者根据自定义的比较器进行排序。不允许存储重复元素.

TreeSet集合默认的规则:

  • 如果是数值类型:Integet,Double,默认按照从小到大的顺序进行排序
  • 对于字符,字符串类型,按照字符在ASCll码表中的数字升序进行排序 如果字符较多 按照字符串第一个字符对应的数字进行比较 如果两个字符串第一个字符相同 则比较第二个以此类推,只要有一个字母能确定大小关系那后面的字母就不用再看了

TreeSet的两种比较方式:

方式一:默认排序/自然排序:

javabean类实现Comparable接口指定比较规则,重写抽象方法compareTo指定比较规则

  • Integer Double默认情况下都是按照升序排列的
  • String按照字母在ASCII码表中对应的数字升序进行排列
    compareTo返回值:
  • 负数:认为要添加的元素是小的,存左边
  • 正数:认为要添加的元素是大的,存右边
  • 0:认为要添加的元素已经存在,舍弃
//  this:表示当前要添加的元素
//  o:表示已经在红黑树中存在的元素
 @Override
	public int compareTo(Student o) {
		int sum1 = this.getChineseResult() + this.getMathsResult() + this.getEnglishResult();
     	int sum2 = o.getChineseResult() + o.getMathsResult() + o.getEnglishResult();
       	int i = sum1 - sum2;
	    //i=0说明成绩相同 比较语文成绩
		i = i == 0 ? this.getChineseResult() - o.getChineseResult() : i;
		//比较数学成绩
		i = i == 0 ? this.getMathsResult() - o.getMathsResult() : i;
		//比较英语成绩
		i = i == 0 ? this.getEnglishResult() - o.getEnglishResult() : i;
		//比较年龄
		i = i == 0 ? this.getAge() - o.getAge() : i;
		//比较名字的字母顺序
		i = i == 0 ? this.getName().compareTo(o.getName()) : i;
		return i;
	}

方式二:

比较器排序:创建TreeSet对象的时候,传递比较器Comparator指定规则

 TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
		@Override
		public int compare(String o1,String o2){
		//按照长度排序
		int i = o1.length() - o2.length();
		//如果一样长则按照首字母排序
		i = i == 0 ? o1.compareTo(o2) : i;
		return i;
	}
});

使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种

单列集合总结:

  1. 如果想要集合中的元素可重复
    ·用ArrayList集合,基于数组的
  2. 如果想要集合中的元素可重复,而且当前的增删操作明显多于查询操作
    ·用LinkedList集合,基于链表的
  3. 如果相对集合中的元素去重
    ·用HashSet集合,基于哈希表的
  4. 如果相对集合中的元素去重,而且保证存取顺序
    ·用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet
  5. 如果想对集合中的元素进行排序
    ·用TreeSet集合,基于红黑树,后续也可以用List集合实现排序
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sortSethashSettreeSet都是Java中的集合框架,用于存储一组元素。它们各自具有不同的特点和适用场景。 - HashSet:是基于哈希表实现的,可以快速查找元素。HashSet中的元素是无序的,不允许重复元素。因此,当需要快速查找元素且不关心元素顺序时,可以选择HashSet。 - TreeSet:是基于红黑树实现的,可以自动排序。TreeSet中的元素是有序的,不允许重复元素。因此,当需要自动排序且不允许重复元素时,可以选择TreeSet。 - SortedSet:是一个接口,继承自Set接口,它可以自动排序。SortedSet中的元素是有序的,不允许重复元素。SortedSet中有两个重要的实现类,分别是TreeSet和ConcurrentSkipListSet。当需要自动排序且不关心线程安全时,可以选择TreeSet;当需要自动排序且需要线程安全时,可以选择ConcurrentSkipListSet。 - LinkedHashSet:是基于哈希表和双向链表实现的,可以保持元素插入的顺序。LinkedHashSet中的元素是有序的,不允许重复元素。因此,当需要保持元素插入顺序且不允许重复元素时,可以选择LinkedHashSet。 总的来说,选择哪种集合框架,需要根据具体的需求来决定。如果需要快速查找元素且不关心元素顺序,可以选择HashSet;如果需要自动排序且不允许重复元素,可以选择TreeSet;如果需要保持元素插入顺序且不允许重复元素,可以选择LinkedHashSet。SortedSet可以根据需要选择具体实现类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值