TreeSet TreeMap ProityQueue LinkedList个人理解

TreeSet
TreeMap
ProityQueue
LinkedList

这是四种在处理数据时常用到集合或者队列,它们的特点就是会对放进去的数据按照默认或者自定义的
规则进行排序,不过它们在处理速度,接受数据类型或者格式各有优劣;

**TreeSet与PriorityQueue:**这两个一起说是因为它们使用方式类似,使用的场合也类似,底层算法也类似,都是二叉树,都可以通过默认或者自定义比较器对存入的元素进行排序,并且可以使用poll方法移除并返回头部元素,使用add或者offer存入元素,TreeSet的取得元素方法会更多一些,比如pollLast(),last(),可以从尾部开始取得或者移除元素,ceiling(),floor(),通过比较器取得小于或者大于某个值的最大或者最小的元素,并且如果是使用默认比较器处理同样的数据,treeSet速度要明显快于PriorityQueue
不同点在于ProrityQueue底层heap排序的数据结构其实是一个数组,存储的是指向从树的顶点开始,从上到下从左到右所有的节点的指针,如果使用迭代器来处理PriorityQueue的数据,输出的其实是数据在二叉树上的顺序,而poll()方法本质是,将树的顶点弹出,用最末的节点代替顶点的位置,然后重新形成二叉树;

//		TreeSet<String> treeS = new TreeSet<>((a,b)->{
//			int res = a.length() - b.length();
//			if (res > 0) return 1;
//			else if (res == 0) {
//				if (a.equals(b)) {
//					return 0;
//				}
//			}
//			return -1;
//		});
//		treeS.add("TTTTTTTTT");
//		treeS.add("QQQQQQQQQQQQQQ");
//		treeS.add("SSSSSS");
//		treeS.add("WWWWWWWWWWWWW");
//		treeS.add("RRRRRRRRRRR");
//		treeS.add("AAAAAAA");
//		treeS.add("DDDD");
//		treeS.add("FFFF");
//		Iterator<String> it = treeS.iterator();
//		while (it.hasNext()) {
//			System.out.println(it.next());
//		}

在这里插入图片描述

而TreeSet底层是链表形成的红黑二叉树,大部分的方法继承于TreeMap,不能有重复的元素(具体判断是否重复可以用的内置
自定义比较器定义),并且TreeSet始终是一个集合,而Queue是
队列,方法不能通用;

LinkedList:LinkedList实现了Queue接口,可以使用队列的poll,offer方法,它也实现了list接口,可以使用get方法获取
特定元素,底层属于链表结构,因此在新增和删除方面具有优势,在需要使用队列但数据种类又很简单的时候,使用LinkedList能够更加方便(在遍历时,队列只能一个一个poll,取完需要的值还得把剩下的塞回去,LinkedList直接get);
缺点就是它无法自定义内置比较器,只能使用Collections工具类,排序的话符合队列先进先出的规则

TreeMap:使用了红黑二叉树存储(K,V)值,具体性能与TreeSet类似,本质上TreeSet=一个只使用了K的TreeMap;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值