集合---Set

标签: java

Set集合

  • Set集合的特点
    1 元素存取无序
    2.没有索引、只能通过迭代器或增强for循环遍历
    3.不能存储重复元素

哈希值

  • 是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
  • public int hashCode():返回对象的哈希码值
"hello".hashCode()
  • 哈希值的特点
    同一个对象多次调用hashCode()方法返回的哈希值是相同的
    默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

HashSet集合

  • HashSet集合的特点
    1.底层数据结构是哈希表
    2.没有带索引的方法,所以不能使用普通for循环遍历
    3.无序
    4.没有重复元素
  • HashSet集合保证元素唯一性源码分析在这里插入图片描述
  • 常见数据结构之哈希表
    在这里插入图片描述

LinkedHashSet集合

  • LinkedHashSet集合特点
    1.哈希表和链表实现的Set接口,具有可预测的迭代次序
    2.(有序)由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
    3 (不重复)由哈希表保证元素唯一,也就是说没有重复的元素

TreeSet集合

  • 元素有序。可以按照一定的规则进行排序,具体排序方式取决于构造方法
    1.TreeSet():根据其元素的自然排序进行排序
    2.TreeSet(Comparator comparator) :根据指定的比较器进行排序
  • (无索引) 没有带索引的方法,所以不能使用普通for循环遍历
  • (不重复) 由于是Set集合,所以不包含重复元素的集合

基本包装类重写了排序方法,不需要我们重写,自己定义的类要想有序要自己重写排序方法。

自然排序Comparable

在要排序的类里实现Comparable接口,重写compareTo()方法,按要求排序。
在main方法里创建TreeSet对象,添加对象,遍历。

public class Student implements Comparable<Student> { 
  @Override    
  public int compareTo(Student s) { 
  //        return 0; 
  //        return 1; 
  //        return -1;       
   //按照年龄从小到大排序       
   int num = this.age - s.age; 
   //        int num = s.age - this.age;        
   //年龄相同时,按照姓名的字母顺序排序       
   int num2 = num==0?this.name.compareTo(s.name):num;       
    return num2;    
    } 
}

比较器排序Comparator

用匿名内部类的方法创建Comparator对象。

 public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student> () {            
@Override            
public int compare(Student s1, Student s2) {
   //this.age - s.age               
    //s1,s2                
    int num = s1.getAge() - s2.getAge();               
     int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;                
     return num2;            
     }        
     });
 }

案例:学生成绩排序,不重复的随机数。

版权声明:本文为thorn66原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/thorn66/article/details/104455705