#千峰#days15Set集合

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

public static void main(String[] args){
    //集合中的元素还是集合
    ArrayList<ArrayList<Student>> school = new ArrayList<>();
    
    ArrayList<Studen> clas1 = new ArrayList<>();
    clas1.add(new Studen("小红",18));
    clas1.add(new Studen"小刚",20);
    
    school.add(clas1);
    
    ArrayList<Student> clas2 = new ArrayList<>();
    clas2.add(new Student("小张",18));'
     clas2.add(new Student("小张",18));
     school.add(clas2);
     
     ArrayList<Student> 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<Student> s = new HashSet<>();
    
    Student student = new Student("小红", 18);
    Student student2 = new Student("小红", 18);

    s.add(student);
    s.add(student2);
    
    Iterator<Student> 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<? exends E> c)构造出一个包含指定
collectio中元素的新set
4、常用方法
。boolean add(E e)如果此set集合中尚未包含指定元素,则添
加指定元素
。boolean remove(Object o) 移除某个元素
。int size()获取集合的长度
5、演示:去除arrayList集合中的重复元素

public static void main(String[] args) {

    ArrayList<String> al = new ArrayList<>();
    al.add("a");
    al.add("s");
    al.add("x");
    al.add("a");
    al.add("s");
    
    HashSet<String> 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<Iterator> 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<Character> hs = new HashSet<>();        //创建HashSet集合对象

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

    Iterator<Character> 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<String> hashSet = new HashSet<>();
    
    hashSet.add("b");
    hashSet.add("c");
    hashSet.add("a");
    hashSet.add("d");
    
    System.out.println(hashSet); //结果 : [a, b, c, d]
    
    LinkedHashSet<String> 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<? super E> 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<Student>{

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


public static void main(String[] args) {
    
    TreeSet<Student> 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<Student> 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(List<t>list)根据元素的自然顺序排序
sort英 /sɔːt/排序
。swap(List<T> list ,int i ,int j )交换集合中两个角标上的值
swap英 /swɒp/交换
。reverse(List<?> list)反转集合中的元素顺序
。replaceAll(List<T>list , T oldVal ,T newVal)替换

public static void main(String[] args){
    
    List<String> 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]
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,944评论 0 13
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 758评论 0 2
  • 今日任务1、TreeSet介绍(掌握TreeSet集合的应用)2、Comparable 接口介绍(掌握)3、Com...
    Villain丶Cc阅读 1,827评论 0 1
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 754评论 0 1
  • 在编程中,常常需要集中存放多个数据。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于...
    一一一二二三阅读 411评论 0 1