欢迎光临
我们一直在努力

JAVA快速入门到精通牛客零基础刷题指南:38,39 手把手带刷:集合类,Set,List 含增强 for 循环 vs 普通 for 循环核心对比

集合类

Set

  • Set接口代表无序不可重复集合。
  • Set集合通常记不住元素的添加顺序,并且Set集合不允许包含相同的元素,向Set中加入相同元素时会失败,即方法返回false。
  • Set接口常用的实现类有:HashSet、TreeSet。

HashSet是Set接口的典型实现,它具有以下特点:

  • HashSet不能保证元素的排列顺序;
  • HashSet集合元素的值可以是 null;
  • HashSet是非线程安全的,多线程环境下须通过代码来保证其同步。
  • TreeSet可以保证元素的排列顺序,它比HashSet多了一些方法:

  • 返回集合中第一个/最后一个元素;
  • 返回集合中位于指定元素之前/之后的元素;
  • 返回集合中某个限定范围内的元素组成的子集。
  • TreeSet采用红黑树的数据结构来存储元素,它支持两种排序方式:自然排序、定制排序。

    1. 自然排序:

    • – 添加时,调用元素的compareTo方法比较元素的大小,并按照升序排列元素;
    • – 添加到TreeSet中的对象必须实现Comparable接口,该接口定义了compareTo方法;
    • – Java提供的很多类型均已经实现了Comparable接口,如包装类、String、Date等。

    2. 定制排序:

    • – 创建TreeSet时,传入Comparator接口的实例;
    • – Comparator接口定义了compare方法,用于比较两个对象的大小;
    • – TreeSet不再调用compareTo方法,转而调用compare方法比较大小。

    JAVA38 字符串去重

    import java.util.HashSet;
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String str = scanner.nextLine();
    scanner.close();
    HashSet<Character> hs = new HashSet<>();

    //将所有字符添加到HashSet
    for(char c:str.toCharArray()){
    //由于HashSet本身结构不允许有重复的项,所以会自动去重
    hs.add(c);
    }

    for (char c:hs) {
    System.out.print(c);
    }
    }
    }

    • 新建HashSet,然后遍历字符串,将所有字符添加到Set。
    • 由于HashSet本身结构不允许有重复的项,所以会自动去除重复的元素。

    List

    List接口代表有序集合,它提供了根据索引来访问集合的方法:

  • 将元素插入到集合中指定的索引处;
  • 将指定索引处的元素从集合中删除;
  • 从集合中返回指定索引处的元素;
  • 返回某个元素在集合中的索引值;
  • 从集合中,返回起始索引和结束索引之间的元素所组成的子集。
  • List还提供了一个listIterator方法,以返回一个ListIterator对象。ListIterator是一个接口,它继承于Iterator接口,并增加了如下的方法:

    boolean hasPrevious(); // 判断迭代器指向的元素是否有上一个元素
    E previous(); // 返回该迭代器所指向的元素的上一个元素
    boolean hasNext(); // 判断迭代器指向的元素是否有下一个元素
    E next(); // 返回该迭代器所指向的元素的下一个元素
    void add(E e); // 在迭代器所指向的元素位置插入一个元素

    List接口常用实现类有ArrayList、LinkedList,ArrayList是采用数组实现有序集合,LinkedList是采用链表实现的有序集合。数组和链表的区别在于:

    • – 数组需要占据连续的内存空间,访问效率高、增删效率低;
    • – 链表不必占据连续的内存空间,增删效率高、访问效率低,它以指针维护元素的顺序,即上一个元素会指向下一个元素。

    JAVA39 集合遍历

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    List<Integer> list = new ArrayList<>();
    int num1 = scanner.nextInt();
    int num2 = scanner.nextInt();
    int num3 = scanner.nextInt();
    int num4 = scanner.nextInt();
    int num5 = scanner.nextInt();
    scanner.close();
    list.add(num1);
    list.add(num2);
    list.add(num3);
    list.add(num4);
    list.add(num5);
    System.out.print("普通for循环:");

    //write your code here……
    for(int i=0;i<list.size();i++){
    System.out.print(list.get(i)+" ");
    }

    System.out.println();
    System.out.print("增强for循环:");

    //write your code here……
    for(int i:list){
    System.out.print(i+" ");
    }

    System.out.println();
    System.out.print("迭代器遍历:");

    //write your code here……
    Iterator it=list.iterator();
    while(it.hasNext()){
    System.out.print(it.next()+" ");
    }

    System.out.println();
    }
    }

    普通for循环
    • 泛型容器类的获取其长度用size
    • 数组,字符串获取其长度用length
    • 泛型容器类获取其值可以用get方法,数组则是用[]加下标的方法
    增强 for 循环(for-each)

    for (元素类型 变量名 : 要遍历的数组或集合) {
    // 循环体:直接使用“变量名”操作当前元素
    }

    遍历数组时

    底层等价于普通for循环遍历索引

    // 增强for循环
    for (int num : array) {
    System.out.println(num);
    }

    // 编译器自动转换成的普通for循环
    for (int i = 0; i < array.length; i++) {
    int num = array[i];
    System.out.println(num);
    }

    遍历集合时(如 List、Set)

    底层依赖 Iterator(迭代器) 实现,编译器会自动转换成迭代器的 hasNext() 和 next() 调用:

    // 增强for循环
    for (String str : list) {
    System.out.println(str);
    }

    // 编译器自动转换成的迭代器代码
    for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
    String str = it.next();
    System.out.println(str);
    }

    正因为底层用了 Iterator,所以增强for循环能遍历所有实现了 Iterable 接口的集合类。

    增强for循环 🆚 普通for循环

    对比维度

    增强for循环(for-each)

    普通for循环

    语法简洁度

    非常简洁,无需关心索引/迭代器

    较繁琐,需要手动控制索引(i)或迭代器

    索引访问

    ❌ 无法直接获取元素的索引位置

    ✅ 可以通过 i 直接访问索引

    修改集合结构

    ❌ 不能在循环中直接添加/删除集合元素(会报错)

    ✅ 可以通过索引自由修改集合结构

    适用范围

    仅适用于数组或实现了 Iterable 接口的集合

    适用于所有需要循环的场景(甚至非遍历场景)

    遍历顺序

    数组/List:按索引顺序;Set:取决于具体实现

    完全由开发者控制(想怎么遍历就怎么遍历)

    性能

    与普通for循环几乎无差异(编译器优化后)

    与增强for循环几乎无差异

    Iterator迭代器
    • hasNext()方法:用来判断集合中是否有下一个元素可以迭代。如果返回true,说明可以迭代。
    • next()方法:用来返回迭代的下一个元素,并把指针向后移动一位。
    赞(0)
    未经允许不得转载:171主机测评 » JAVA快速入门到精通牛客零基础刷题指南:38,39 手把手带刷:集合类,Set,List 含增强 for 循环 vs 普通 for 循环核心对比
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址