目录
Collection接口
特点:存储一组不唯一、无序的对象。
- Collection接口是一个顶层接口,继承它的子接口有List、Set等;
- Collection接口提供了基本的集合操作,如添加、删除、查找元素等,并且支持迭代器遍历集合中的元素;
- Collection接口还提供了一些常用的批量操作方法,如addAll()、removeAll()、retainAll()等。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionDemo {
public static void main(String[] args) {
// 创建一个ArrayList集合实例
Collection<String> collection = new ArrayList<>();
// 添加元素
collection.add("A");
collection.add("B");
collection.add("C");
System.out.println("判断集合是否为空:" + collection.isEmpty()); // 输出:false
System.out.println("获取集合中元素的个数:" + collection.size()); // 输出:3
// 遍历集合
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
// 输出:
// A
// B
// C
}
// 删除元素
collection.remove("B");
System.out.println("删除一个元素后,获取集合中元素的个数:" + collection.size()); // 输出:2
// 判断是否包含指定元素
System.out.println("是否包含元素 A:" + collection.contains("A")); // 输出:true
System.out.println("是否包含元素 B:" + collection.contains("B")); // 输出:false
// 将集合转化为数组形式返回
Object[] array = collection.toArray();
// 清空集合中所有元素
collection.clear();
System.out.println("清空集合后,获取集合中元素的个数:" + collection.size()); // 输出:0
}
}
Collection子接口:List与Set接口
Collection接口的两个主要子接口是List和Set,它们都继承了Collection接口,但是它们在实现方式和使用方法上有所不同。
- List接口
List接口代表一个有序的元素列表,并且集合中的元素可以重复。List提供了按照索引访问集合中元素的方法,并且允许在列表中插入、添加、修改、删除元素等操作。
常用的List实现类包括:ArrayList、LinkedList、Vector等
api方法使用:
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
// 创建ArrayList实例
List<String> list = new ArrayList<>();
// 添加元素
list.add("apple");
list.add("banana");
list.add("orange");
// 获取指定位置元素
System.out.println(list.get(0)); // 输出:apple
// 在指定位置添加元素
list.add(1, "pear");
// 获取元素的索引值
System.out.println(list.indexOf("pear")); // 输出:1
// 修改指定位置上的元素
list.set(2, "watermelon");
// 遍历所有元素
for (String fruit : list) {
System.out.println(fruit);
// 输出:
// apple
// pear
// watermelon
// banana
// orange
}
// 删除指定位置上的元素
list.remove(0);
// 清空集合中的所有元素
list.clear();
}
}
2.Set接口
Set接口代表一组不可重复的元素,并且集合中的元素没有特定的顺序。Set保证相同的元素只会出现一次,如果尝试向Set中添加一个已经存在的元素,那么add()操作将返回false(并不会报错)。
常用的Set实现类包括:HashSet、TreeSet等。
总之,List和Set接口的不同点在于,List可以存储重复元素并且保持插入的顺序,而Set不允许有重复元素,且不保证元素的顺序。
api方法使用:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
// 创建HashSet实例
Set<String> set = new HashSet<>();
// 添加元素
set.add("apple");
set.add("banana");
set.add("orange");
// 获取元素个数
System.out.println(set.size()); // 输出:3
// 判断是否包含某个元素
System.out.println(set.contains("banana")); // 输出:true
// 遍历所有元素
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
// 输出:
// orange
// banana
// apple
}
// 删除指定元素
set.remove("orange");
// 清空集合中的所有元素
set.clear();
}
}
Collection子接口:Iterator接口
-
Iterator 接口提供了迭代器模式的实现:使用者无需知道集合底层的数据结构、算法等实现细节,只需要通过 Iterator 接口提供的操作方法便可遍历整个集合。
-
Iterator 接口可以实现单向遍历集合。只能按照前进方向依次遍历集合中的元素,且不支持随机访问(如 List 中的 index 访问)。
-
Iterator 接口提供了大量便捷的 API 方法,包括 hasNext()、next()、remove() 等,使得使用者可以轻松获取、删除集合中的元素。
以下是一些常用的 Iterator 接口的 API 使用方法:
-
hasNext(): 判断是否还有下一个元素。
-
next(): 返回集合中下一个元素,并将指针移动到下一个位置。如果没有下一个元素,会抛出 NoSuchElementException 异常。
-
remove(): 移除集合中最后一个返回的元素,该方法必须在调用 next() 之后进行,否则会抛出 IllegalStateException 异常。
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
System.out.println(element);
}
输出结果:
1 2 3
Map接口
Map 接口是 Java 集合框架中的一个成员,它提供了一种键值对映射的方式来存储和管理数据。Map 接口中的每个元素都包括一个键和一个值,其中键用于唯一标识所存储的对象,而值则表示与该键相关联的信息。
Map 接口的特点包括:
-
Map 接口允许使用不同类型的对象作为键和值,并且支持 null 对象作为键和值。
-
Map 接口提供了快速查找的功能,可以根据键快速定位到对应的值,而不需要遍历整个集合。
-
Map 接口提供了大量的 API 方法,包括 put()、get()、remove() 等,使得使用者可以方便地插入、获取或删除 Map 中的元素。
下面是一些常用的 Map 接口的 API 使用方法:
-
put(): 向 Map 中插入一个键值对。如果该键已经存在,则会覆盖其原来的值。
-
get(): 根据指定的键获取 Map 中对应的值。
-
remove(): 根据指定的键从 Map 中移除对应的键值对。
-
containsKey(): 判断 Map 中是否存在指定的键。
-
containsValue(): 判断 Map 中是否存在指定的值。
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
// 创建HashMap实例
Map<String, Integer> map = new HashMap<>();
// 插入元素
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
// 获取指定键的值
System.out.println(map.get("apple")); // 输出:1
// 遍历所有元素
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + ":" + value);
// 输出:
// apple:1
// banana:2
// orange:3
}
// 移除指定键的元素
map.remove("banana");
// 清空集合中的所有元素
map.clear();
}
}
泛型
泛型是 Java 语言中的一个功能,它允许在定义类、接口和方法的时候使用类型参数,以支持类、接口和方法的通用性,在编译期间对类型进行检查和限制,提高程序的可读性、可维护性和安全性。
Java 引入了泛型概念之后,可以更加准确和灵活地声明变量和方法,使得代码更加简洁、易读和可扩展。当需要在类或方法中使用某种类型,但又不确定具体使用哪一种类型(例如:集合框架中的 List、Set、Map 等),就可以使用泛型来定义类或方法,这样可以避免类型转换等一系列问题。
泛型主要有以下几个方面:
-
类型参数化:在定义类、接口和方法时声明类型参数,例如:
class MyClass<T> {}
。 -
类型约束:通过泛型定义继承或接口实现关系,并指定范型类型限制,例如:
class MyClass<T extends Number> {}
表示T必须是数字类型。 -
类型推断:在实例化泛型类时可以省略类型参数。例如:
MyClass<String> obj = new MyClass<>();
,在尖括号中不需要再明确指定 String。
public class GenericMethodDemo {
/**
*演示了如何使用泛型定义一个通用方法 printArray,该方法可以接受任意类型的数组作为参数,并打印出数组中的所有元素。由于使用了泛型,这个方法可以在不改变具体数据类型的情况下被多次调用,提高了代码的复用性和扩展性。
*/
public static <T> void printArray(T[] inputArray) {
for (T element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
Integer[] intArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.0, 2.0, 3.0, 4.0, 5.0};
Character[] charArray = {'H', 'E', 'L', 'L', 'O'};
System.out.println("intArray:");
printArray(intArray);
System.out.println("\ndoubleArray:");
printArray(doubleArray);
System.out.println("\ncharArray:");
printArray(charArray);
}
}