今天要为大家分享的是《疯狂JAVA笔记》中的集合知识中关于LinkedHashSet和TreeSet
LinkedHashSet类:
LinkedHashSet跟HashSet集合也是一样根据HashCode值来计算元素的存储位置,但他使用链表来维护元素的次序,简单点说就是表面上的LinkedHashSet是无序的但实质上会按照元素的插入顺序来显示在控制台输出上。
由于LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代全部元素的时候会有很好的性能,因为他用链表来维护内部的顺序
public class LinkedHashSetTest {
public static void main(String[] args) {
LinkedHashSet books = new LinkedHashSet();
books.add("旋涡JAVA笔记A");
books.add("旋涡JAVA笔记B");
System.out.println(books);
//删除笔记A
books.remove("旋涡JAVA笔记A");
//重新添加
books.add("旋涡JAVA笔记A");
System.out.println(books);
//输出LinkedHashSet集合元素时,元素的顺序总是与添加的顺序相同
}
}
**运行结果:
[旋涡JAVA笔记A, 旋涡JAVA笔记B]
[旋涡JAVA笔记B, 旋涡JAVA笔记A]
**
注:总之一句话,元素的顺序与元素的添加顺序相同。
TreeSet类:
TreeSet是SortedSet的接口实现类,TreeSet可以确保元素处于排序状态,相比于HashSet类,TreeSet多出了如下几个方法:
- Comparator comparator():TreeSet若使用自然排序,返回null,TreeSet若使用定制排序,方法则返回定制排序所使用的Comparator。
- Object first():返回集合中的第一个元素
- Object last():返回集合中的最后元素
- Object lower(Object e):返回集合中位于指定元素之前的元素
- Object higher(Object e) : 返回集合中位于指定元素之后的元素
- SortedSet subSet(Object from,Object to): 返回范围从from到to的set集合
- SortedSet headSet(Object to): 返回set的子集,小于to的元素组成
- SortedSet tailSet(Object from):返回set的子集,大于等于from的元素组成
public class TreeSetTest {
public static void main(String[] args) {
TreeSet nums = new TreeSet();
nums.add(5);
nums.add(2);
nums.add(10);
nums.add(-9);
//输出集合,集合处于排序状态
System.out.println(nums);
//输出集合里的第一个元素
System.out.println(nums.first());
//输出集合里的最后一个元素
System.out.println(nums.last());
//返回小于4的子集 不包含4
System.out.println(nums.headSet(4));
//返回大于5的子集不包含5
System.out.println(nums.tailSet(5));
//返回大于等于-3小于4的子集
System.out.println(nums.subSet(-3,4));
}
}
**运行结果:
[-9, 2, 5, 10]
-9
10
[-9, 2]
[5, 10]
[2]
**
TreeSet的两种排序:
注:TreeSet要注意添加的要是同一个类的对象
- 自然排序:调用集合中的compareTo(Object obj)方法来比较元素之间的大小关系例如obj1.compareTo(obj2)->相等返回0,大于返回正整数,小于返回负整数,然后将集合中的元素按升序排列。
- 定制排序:如多用户需要定制一个自己想要的排序例如按照降序排列这时就可以使用定制排序,通过Comparetor接口帮助,说白了就是通过写compare(T O1,T O2)方法的方法体例如:
class M {
int age;
public M(int age) {
this.age = age;
}
@Override
public String toString() {
return "M[age= " + age + "]";
}
}
public class TreeSetTest2 {
public static void main(String[] args) {
TreeSet ts = new TreeSet((o1, o2) -> {
M m1 = (M) o1;
M m2 = (M) o2;
return m1.age > m2.age ? 1 : m1.age < m2.age ? -1 : 0;
});
ts.add(new M(5));
ts.add(new M(-3));
ts.add(new M(2));
System.out.println(ts);
}
}
**运行结果:
[M[age= 5], M[age= 2], M[age= -3]]
**
这样就同过Lambda表达式来实现元素的降序。