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;