马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 moc 于 2018-12-26 22:33 编辑
1、Set简介
Set是一个不包含重复元素的 collection。
① 继承于Collection接口,具有增删查改的方法!
② Set有两个实现类,HashSet 和 TreeSet 。
2、HashSet
① HashSet实现Set接口,底层数据结构哈希表,那么它也是一个不包含重复元素的一个无序的集合,允许使用null,有且仅有一个元素为null!
② HashSet也是一个非同步的方法,如果要在多个线程中使用,要注意进行同步封装!
Set s = Collections.synchronizedSet(new HashSet(...));
③ HashSet中含有一个”HashMap类型的成员变量”map,HashSet的操作函数,实际上都是通过map实现的。// 创建集合对象
HashSet<String> hs = new HashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历集合
for (String s : hs) {
System.out.println(s);
}
为什么存储字符串的时候,字符串内容相同的只存储了一个呢?判断标准是什么?
e.hash == hash && ((k = e.key) == key || key.equals(k))
标准: 添加元素的哈希值 ---> 元素的地址值 或 equals()方法
如果HashSet存储其他类,如果类没有重写这两个方法,默认使用的Object()。一般来说不会相同,会都加入集合。
==> 存储HashSet的类对象需要重写hashCode()和equals()方法。
3、LinkedHashSet
LinkedHashSet继承了HashSet,底层数据结构由哈希表和链表组成。
① 哈希表保证元素的唯一性。
② 链表保证元素有素。(存储和取出是一致)// 创建集合对象
LinkedHashSet<String> hs = new LinkedHashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历
for (String s : hs) {
System.out.println(s);
}
4、TreeSet
基于 TreeMap 的 NavigableSet 实现,底层数据结构为二叉树。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator进行排序,具体取决于使用的构造方法。
排序有两种方式(取决于构造方法) ==> A:自然排序 && B:比较器排序
1. 构造方法
TreeSet() -------------------------------------------------> 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c) ----------------> 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator) ----> 构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s) ------------------------------> 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
自然排序:
如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口。
public int compareTo(T o) ----------> 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
Integer等包装类默认重写了上面的方法。---> 从小到大排序。public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() { super(); }
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public int compareTo(Student s) {
// 主要条件 姓名的长度
int num = this.name.length() - s.name.length();
// 姓名的长度相同,不代表姓名的内容相同
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄
int num3 = num2 == 0 ? this.age - s.age : num2;
return num3;
}
}
TreeSet集合保证元素唯一性的原理:
唯一性 ----> 根据比较的返回是否是0来决定。
注意:
① TreeSet中不允许使用null元素!在添加的时候如果添加null,则会抛出NullPointerException异常。
② TreeSet不支持快速随机遍历,只能通过迭代器进行遍历! |