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;
}
});
使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种
单列集合总结:
- 如果想要集合中的元素可重复
·用ArrayList集合,基于数组的 - 如果想要集合中的元素可重复,而且当前的增删操作明显多于查询操作
·用LinkedList集合,基于链表的 - 如果相对集合中的元素去重
·用HashSet集合,基于哈希表的 - 如果相对集合中的元素去重,而且保证存取顺序
·用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet - 如果想对集合中的元素进行排序
·用TreeSet集合,基于红黑树,后续也可以用List集合实现排序