集合类
Set
- Set接口代表无序不可重复集合。
- Set集合通常记不住元素的添加顺序,并且Set集合不允许包含相同的元素,向Set中加入相同元素时会失败,即方法返回false。
- Set接口常用的实现类有:HashSet、TreeSet。
HashSet是Set接口的典型实现,它具有以下特点:
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循环
|
语法简洁度 |
非常简洁,无需关心索引/迭代器 |
较繁琐,需要手动控制索引(i)或迭代器 |
|
索引访问 |
❌ 无法直接获取元素的索引位置 |
✅ 可以通过 i 直接访问索引 |
|
修改集合结构 |
❌ 不能在循环中直接添加/删除集合元素(会报错) |
✅ 可以通过索引自由修改集合结构 |
|
适用范围 |
仅适用于数组或实现了 Iterable 接口的集合 |
适用于所有需要循环的场景(甚至非遍历场景) |
|
遍历顺序 |
数组/List:按索引顺序;Set:取决于具体实现 |
完全由开发者控制(想怎么遍历就怎么遍历) |
|
性能 |
与普通for循环几乎无差异(编译器优化后) |
与增强for循环几乎无差异 |
Iterator迭代器
- hasNext()方法:用来判断集合中是否有下一个元素可以迭代。如果返回true,说明可以迭代。
- next()方法:用来返回迭代的下一个元素,并把指针向后移动一位。
