#千峰#days15Set集合

一、ArrayList嵌套
1、定义:
。集合中存放集合,和二维数组类似
2、演示

public static void main(String[] args){
    //集合中的元素还是集合
    ArrayList> school = new ArrayList<>();
    
    ArrayList clas1 = new ArrayList<>();
    clas1.add(new Studen("小红",18));
    clas1.add(new Studen"小刚",20);
    
    school.add(clas1);
    
    ArrayList clas2 = new ArrayList<>();
    clas2.add(new Student("小张",18));'
     clas2.add(new Student("小张",18));
     school.add(clas2);
     
     ArrayList clas3 = new ArrayList<>();
    clas2.add(new Student("sim",18));'
     clas2.add(new Student("saas",18));
     school.add(clas3);
     
     System.out.println(school)
}

二、Set集合
1、定义
。Set集合存储的元素是无序的,而且不予许重复的元素,每当
有新的元素存入的时候,Set集合回显区过滤,如果发现和集
合现有元素出现重复,就不予许添加
2、应用场景
。当我们不想让集合出现重复的元素时,使用Set集合
。当我们需要排除重复数据时,使用Set集合
3、演示

public static void main(String[] args) {
    //集合中的元素还是集合
    HashSet s = new HashSet<>();
    
    Student student = new Student("小红", 18);
    Student student2 = new Student("小红", 18);

    s.add(student);
    s.add(student2);
    
    Iterator it = s.iterator();
    while (it.hasNext()) {
        Student student3 = it.next();
        System.out.println(student3);
    }
}

三、HashSet
1、定义:
。HashSet集合中的元素时通过hash值来比较是否相同
。集合通过元素的hashCode和equals方法来比较两个元素是否
相同,不同存入,相同不存入
。元素存入的位置未知,和存入的顺序无关
2、存储原理
。HashSet最后还是存入数组中,只是根据元素的Hash值来确
定存入的角标位置
。元素的hash值^(元素的hash值>>>16)&(数组的长
度-1)。
。HashSet中不是直接存入我们给定的元素,而是用集合中的一
个内部类封装我们存入的元素,所以当我们存入null的时候,
不会因为和数组中角标位置上默认值null起冲突
。如果两个不同的匀速根据不同的hash值计算出同一个角标值,
那么都能存进去
3、构造方法
。HashSet()构造出一个新的集合,底层数组默认初始容量是
16(扩充一倍),加载银子是0.75
。加载因子:集合中的数组可用的
。角标值的可选范围越小,计算出重复标标志的概率就越

。HashSet(Collection c)构造出一个包含指定
collectio中元素的新set
4、常用方法
。boolean add(E e)如果此set集合中尚未包含指定元素,则添
加指定元素
。boolean remove(Object o) 移除某个元素
。int size()获取集合的长度
5、演示:去除arrayList集合中的重复元素

public static void main(String[] args) {

    ArrayList al = new ArrayList<>();
    al.add("a");
    al.add("s");
    al.add("x");
    al.add("a");
    al.add("s");
    
    HashSet hs = new HashSet<>(al);
    System.out.println(hs);
}

四、HashSet集合中元素保证唯一性
1、原理解析:
。hashSet是通过调用元素的hashCode方法来比较两个元素
是否相同的。如果要保证引用数据类型逻辑上的唯一性,就
必须重写hashCode和equals方法
2、引用数据类型除重
。重写hashCode和equals方法,自定义比较内容
3、测试题:
需求: 编写程序, 获取10个1到20的随机数, 要求随机数不能重复, 打印结

public static void main(String[] args){
    
    Random random = new Random();
    
    HashSet hashSet = new HashSet<>();
    
    while(hashSet.size()<10){//集合中个数小于10
        int num = random.nextInt(20)+1;
        hashSet.add(num);
    }
    System.out.println(hashSet);
}

4、测试题
需求: 从键盘录入一行数据, 去掉其中重复的字符,打印结果

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    System.out.println("请输入一行字符串:");
    String line = sc.nextLine();                    //将键盘录入的字符串存储在line中
    char[] arr = line.toCharArray();                //将字符串转换成字符数组
    HashSet hs = new HashSet<>();        //创建HashSet集合对象

    for (int i = 0; i < arr.length; i++) {
        hs.add(arr[i]);
    }

    Iterator it = hs.iterator();
    while (it.hasNext()) {
        System.out.print(it.next());
    }
    
    sc.close();
}

五、LinkedHashSet
Linked英 /lɪŋkt/连接的
1、定义:兼顾了linked的有序性和hashSet的唯一性
2、演示:

public static void main(String[] args) {

    HashSet hashSet = new HashSet<>();
    
    hashSet.add("b");
    hashSet.add("c");
    hashSet.add("a");
    hashSet.add("d");
    
    System.out.println(hashSet); //结果 : [a, b, c, d]
    
    LinkedHashSet lhs = new LinkedHashSet<>();
    lhs.add("b");
    lhs.add("c");
    lhs.add("a");
    lhs.add("d");
    System.out.println(lhs); //结果: [b, c, a, d]
}

六、TreeSet集合

1、定义:
。TreeSet是一种顺序的集合,这里的顺序是集合中的元素有顺
序。它是通过比较元素的大小来存放的,大的在右,小的在

。存入的元素必须实现Comparable接口,并且重写comparTo
方法
。最后存入的元素会形成一个树状结构
2、构造方法
。TreeSet() 构造一个新的空set,该set根据其元素的而自然顺
序进行排序
。TreeSet(Comparator comparator)构建一个空
的TreeSet,它根据指定比较器进行排序
3、常用方法、
。add(E e)将指定元素添加到此set
。first() 返回次set中当前第一个元素
。last() 返回此set中当前最后一个元素
。floor()返回此set中小于等于给定元素的最大元素,不存在
则返回null。floor英 /flɔː(r)/基底
。higher()返回此set中大于给定元素的最小元素,不存在则
返回null。higher英 /ˈhaɪə(r)/ 更高的
4、添加原理:
。TreeSet存放的元素最后会是一个树形。它是将第一个添加的
元素作为中心,之后添加的会和中心进行比较,大于放在右
边并紧接着和右边的元素在比较一次类推,小于的相反。直
到没有可比较的元素,才将这个添加的元素放入
5、Comparable接口
。Comparable英 /ˈkɒmpərəbl/类似的,可比较的
comparator英 /kəm'pærətə/比较器
comparTo目标字符串
。存入的元素在比较的时候,如果没有比较器,就会将元素本身
转成Comparator类型并调用comparTo方法进行比较,所以
必须实现comparator接口,并重写comparTo方法
。调用compartTo方法比较
如果方法返回一个小于0的数,表示当前元素小于被比较元

如果返回 0 表示当前元素等于被比较元素
如果返回一个大于0的数, 表示当前元素大于被比较元素
6、Comparator比较器
。这是一个接口,定义了一个compare抽象方法
。compare方法可以对两个元素进行比较

public class MyComparator implements Comparator(Student){
        @Override
        public int compare(Student 01, Student 02){
            reutrn 1;
        }
    }
}

7、注意:
TreeSet集合的存储原理限定了必须要对存入的元素进行比较
要么存入的元素自身实现Comparable接口, 要么提供外部的实现了Comparator接口的比较器, 否则程序运行就会报错
8、测试
需求: 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台

public class MyComparator implements Comparator{

    @Override
    public int compare(Student o1, Student o2) {
        int num = o2.getSum() - o1.getSum();            //根据学生的总成绩降序排列
        return num ;
    }
}


public static void main(String[] args) {
    
    TreeSet set = new TreeSet<>(new MyComparator());
    
    Student student1 = new Student("小红",100);
    Student student2 = new Student("小明",50);
    Student student3 = new Student("小李",60);
    set.add(student1);
    set.add(student2);
    set.add(student3);
    
    for (Student student : set) {
        System.out.println(student);
    }
}

七、超级for
1、定义:
。Iterator的简写形式
。简化数组和Collection集合的遍历
2、格式:

for(元素数据类型  变量 :数组或者Collection集合){
    使用变量即可,该变量就是当前元素
}

3、演示:

public static void main(String[] args){
    
    TreeSet set = new TreeSet<>(new MyComparator());
    
    Student student1 = new Student("小红");
    Student student2 = new Student("小红");
    Student student3 = new Student("小红");
    
    set.add(student1);
   set.add(student2);     
   set.add(student3);
   
   for(Student student :set ){
       System.out.println(student);
   }
        
}

4、三种迭代方式的删除
。普通for循环,可以删除,但是需要移动角标
。迭代器,可以删除,但是必须使用迭代器自身的remove方
法,否则会出现并发修改错误
。超级for循环不能删除
八、Collections工具类的使用
1、定义
。一个用于操作Collection集合工具类
2、常用方法
。sort(Listlist)根据元素的自然顺序排序
sort英 /sɔːt/排序
。swap(List list ,int i ,int j )交换集合中两个角标上的值
swap英 /swɒp/交换
。reverse(List list)反转集合中的元素顺序
。replaceAll(Listlist , T oldVal ,T newVal)替换

public static void main(String[] args){
    
    List cl = new ArrayList<>();

    cl.add("a");
    cl.add("d");
    cl.add("s");
    cl.add("t");
    cl.add("a");
    cl.add("e");
 
     System.out.priontln(cl);//[a, d, s, t, a, e]
     
     Collections.sort(cl);
    System.out.println(cl);//[a, a, d, e, s, t]
    
    Collections.swap(cl,1,2);
    System.out.println(cl);//[a, d, a, e, s, t]
    
    Collections.reverse(cl);//英 /rɪˈvɜːs/颠倒
    System.out.println(cl);//[t, s, e, a, d, a]
    
    Collections.replaceAll(cl,"a","f");//英 /rɪˈpleɪs/替换
    System.out.println(cl);//[t, s, e, f, d, f]
}

你可能感兴趣的:(#千峰#days15Set集合)