1.集合框架包含的内容
2.List的相关方法
3.ArrayList、LinkList集合的使用
3.1 ArrayList集合
-
新增
Dog ououDog = new Dog("欧欧", "雪娜瑞"); Dog yayaDog = new Dog("亚亚", "拉布拉多"); Dog meimeiDog = new Dog("美美", "雪娜瑞"); Dog feifeiDog = new Dog("菲菲", "拉布拉多"); List dogs = new ArrayList();//创建集合对象,把狗狗对象放进去 dogs.add(ououDog); dogs.add(yayaDog); dogs.add(meimeiDog); dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置 System.out.println("共计有" + dogs.size() + "条狗狗。"); System.out.println("分别是:"); for (int i = 0; i < dogs.size(); i++) { Dog dog = (Dog) dogs.get(i); System.out.println(dog.getName() + "\t"+ dog.getStrain()); }
-
删除指定位置的小狗,使用remove()方法
dogs.remove(0);
-
删除指定的小狗
dogs.remove(feifeiDog);
-
判断是否包含指定的小狗,使用contains()方法
if(dogs.contains(meimeiDog)) System.out.println("\n集合中包含美美的信息"); else System.out.println("\n集合中不包含美美的信息"); }
-
List接口常用方法
方法名 说 明 boolean add(Object o) 在列表的末尾顺序添加元素,起始索引位置从**0开始** void add(int index,Object o) 在指定的索引位置添加元素。索引位置必须介于**0和列表中元素个数之间** int size() 返回列表中的元素个数 Object get(int index) 返回指定索引位置处的元素。取出的元素是**Object类型,使用前需要进行强制类型转换** boolean contains(Object o) 判断列表中是否存在指定元素 boolean remove(Object o) 从列表中删除元素 Object remove(int index) 从列表中删除指定位置元素,起始索引位置从**0开始**
3.2 LinkedList集合的使用
-
新增
… // 创建多个狗狗对象 LinkedList dogs = new LinkedList(); dogs.add(ououDog); dogs.add(yayaDog); dogs.addLast(meimeiDog); dogs.addFirst(feifeiDog);
-
获取第一条小狗信息,使用getFirst()方法
Dog dogFirst= (Dog)dogs.getFirst(); System.out.println("第一条狗狗昵称是"+dogFirst.getName() );
-
获取最后一条小狗的信息,使用getLast()方法
Dog dogLast= (Dog)dogs.getLast(); System.out.println("最后一条狗狗昵称是"+dogLast.getName());
-
删除第一条狗狗和最后一条,使用removeFirst()和removeLast()方法
dogs.removeFirst(); dogs.removeLast();
-
-
LinkedList的特殊方法
方法名 说 明 void addFirst(Object o) 在列表的首部添加元素 void addLast(Object o) 在列表的末尾添加元素 Object getFirst**()** 返回列表中的第一个元素 Object getLast**()** 返回列表中的最后一个元素 Object removeFirst**()** 删除并返回列表中的第一个元素 Object removeLast**()** 删除并返回列表中的最后一个元素
4.Set集合
4.1 介绍
-
Set
是一种集合接口,它继承自Collection
接口,用于存储一组不重复的元素。
4.2 特点
-
元素唯一性:
Set
集合中不允许存储重复的元素 -
无序性(部分实现):
Set
集合通常不保证元素的插入顺序,即元素在集合中的存储顺序可能与插入顺序不同。 -
不支持索引访问:与
List
集合不同,Set
集合不支持通过索引来访问元素,因为它没有维护元素的顺序。
4.3 常用实现类
-
HashSet:哈希
-
基于哈希表实现,它使用
HashMap
来存储元素。当向HashSet
中添加元素时,会根据元素的哈希码来确定存储位置。 -
性能特点:插入、删除和查找操作的时间复杂度通常为 O (1),性能较高。
public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("cherry"); System.out.println(set); // 输出: [apple, banana, cherry] set.add("apple"); // 尝试添加重复元素 System.out.println(set); // 输出: [apple, banana, cherry],重复元素未被添加 }
-
-
TreeSet
-
基于红黑树(一种自平衡的二叉搜索树)实现,它会对元素进行自然排序(元素必须实现
Comparable
接口)或根据指定的比较器进行排序。 -
性能特点:插入、删除和查找操作的时间复杂度为 O (log n),因为需要维护树的平衡。
public static void main(String[] args) { Set<Integer> set = new TreeSet<>(); set.add(3); set.add(1); set.add(2); System.out.println(set); // 输出: [1, 2, 3],元素按升序排列 }
-
-
LikedHashSet
-
继承自
HashSet
,它使用链表来维护元素的插入顺序,因此可以保证元素按照插入的顺序进行遍历。 -
性能特点:插入、删除和查找操作的时间复杂度与
HashSet
相同,为 O (1),但由于需要维护链表,会额外占用一些内存public static void main(String[] args) { Set<String> set = new LinkedHashSet<>(); set.add("apple"); set.add("banana"); set.add("cherry"); System.out.println(set); // 输出: [apple, banana, cherry],元素按插入顺序排列 }
-
-
常用方法
-
add(E e):向集合中添加元素,如果元素已经存在,则添加失败,返回
false
;否则返回true
。 -
remove(Object o):从集合中移除指定的元素,如果元素存在,则移除成功,返回
true
;否则返回false
。 -
contains(Object o):判断集合中是否包含指定的元素,如果包含则返回
true
;否则返回false
。 -
size():返回集合中元素的数量。
-
isEmpty():判断集合是否为空,如果为空则返回
true
;否则返回false
。 -
clear():清空集合中的所有元素。
-
-
遍历方式
-
使用迭代器(Iterator)
public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("cherry"); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }
-
5.Map集合接口
5.1实现类: HashMap
-
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作
-
存储,使用的是put()方法
Map countries = new HashMap(); countries.put("CN", "中华人民共和国"); countries.put("RU", "俄罗斯联邦");
-
获取指定元素的值,get()
String country = (String) countries.get("CN"); System.out.println("CN对应的国家是:" + country);
-
获取Map元素个数,size()
System.out.println("Map中共有"+countries.size()+"组数据");
-
删除指定元素,remove()
countries.remove("FR");
-
判断是否包含指定元素,containsKey()
System.out.println("Map中包含FR的key吗?" + countries.containsKey("FR"));
-
显示键集、值集、键值对集
System.out.println( countries.keySet() ) ; System.out.println( countries.values() ); System.out.println( countries );
-
-
Map接口常用方法
方法名 说 明 Object put(Object key, Object val**)** 以**“键-值对”的方式进行存储** Object get (Object key) 根据键返回相关联的值,如果不存在指定的键,返回**null** Object remove (Object key) 删除由指定的键映射的**“键-值对”** int size() 返回元素个数 Set keySet () 返回键的集合 Collection values () 返回值的集合 boolean containsKey (Object key) 如果存在由指定的键映射的**“键-值对”,返回true**
6.迭代器Iterator的使用
6.1 什么是迭代器
-
在Java中,迭代器(Iterator)是一种设计模式和接口,它为集合类提供了一种统一的方式来遍历其中的元素,而不需要关心集合的具体实现。
6.2 迭代器的作用
-
迭代器的主要作用是提供一种统一的、不依赖于具体集合实现的遍历机制。使用迭代器可以让我们以相同的方式遍历不同类型的集合(如
List
、Set
等),提高了代码的可复用性和可维护性。同时,迭代器还提供了在遍历过程中安全地删除元素的功能。
6.3 迭代器接口(java.util.Iterator)
-
Iterator
接口位于java.util
包中,它定义了三个主要的方法:-
hasNext():用于判断集合中是否还有下一个元素,如果有则返回
true
,否则返回false
。 -
next():返回集合中的下一个元素,并将迭代器的位置向后移动一位。如果没有下一个元素,调用该方法会抛出
NoSuchElementException
异常。 -
remove():移除迭代器最后返回的元素。该方法只能在每次调用
next()
方法之后调用一次,如果违反此规则,会抛出IllegalStateException
异常。
-
6.4 迭代器的使用
-
使用迭代器遍历ArrayList的示例
public static void main(String[] args) {
// 创建一个 ArrayList 并添加元素
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 使用迭代器遍历集合
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
-
在遍历过程中删除元素
-
迭代器的
remove()
方法允许在遍历集合的过程中安全地删除元素。Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); if (element.equals("banana")) { iterator.remove(); // 删除当前元素 } } System.out.println(list); // 输出: [apple, cherry]
-
6.5 迭代器的局限性
-
单向遍历:标准的
Iterator
只能单向遍历集合,即只能从前往后遍历,不能反向遍历。 -
功能有限:它只提供了基本的遍历和删除元素的功能,没有提供插入元素等其他操作的方法。
6.6 增强的迭代器
-
对于
List
集合,Java 还提供了ListIterator
接口,它是Iterator
的子接口,除了具备Iterator
的功能外,还支持双向遍历、在遍历过程中插入元素等操作。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
ListIterator<String> listIterator = list.listIterator();
// 正向遍历
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// 反向遍历
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
}
7.泛型集合
7.1 什么是泛型集合
-
概念
-
在 Java 中,集合是用于存储和管理一组对象的容器,例如
List
、Set
、Map
等。而泛型是 Java 5 引入的一项特性,它允许在定义类、接口或方法时使用类型参数。泛型集合就是在集合中使用泛型,通过在创建集合对象时指定具体的元素类型,使得集合只能存储该类型的元素。
-
7.2 特点
-
类型安全
-
在没有泛型的情况下,集合可以存储任意类型的对象,这可能会导致在运行时出现
ClassCastException
异常。使用泛型集合可以在编译时进行类型检查,确保集合中只存储指定类型的元素,从而避免了运行时的类型转换错误。
-
-
代码可读性和可维护性
-
通过指定集合中元素的类型,代码的意图更加清晰,其他开发者可以更容易理解集合中存储的数据类型。同时,也减少了类型转换的代码,使代码更加简洁和易于维护。
-
-
消除强制类型转换
-
在使用非泛型集合时,从集合中取出元素需要进行强制类型转换。而使用泛型集合,编译器会自动处理类型转换,使得代码更加简洁
-
7.3泛型的使用
-
List泛型集合
public static void main(String[] args) { // 创建一个只能存储 String 类型元素的 List List<String> stringList = new ArrayList<>(); stringList.add("apple"); stringList.add("banana"); // stringList.add(123); // 编译错误,不能添加非 String 类型的元素 // 遍历集合,无需进行类型转换 for (String fruit : stringList) { System.out.println(fruit); } }
-
Set泛型集合
public static void main(String[] args) { // 创建一个只能存储 Integer 类型元素的 Set Set<Integer> integerSet = new HashSet<>(); integerSet.add(1); integerSet.add(2); // integerSet.add("three"); // 编译错误,不能添加非 Integer 类型的元素 // 遍历集合 for (Integer number : integerSet) { System.out.println(number); } }
-
Map泛型集合
public static void main(String[] args) { // 创建一个键为 String 类型,值为 Integer 类型的 Map Map<String, Integer> scoreMap = new HashMap<>(); scoreMap.put("Alice", 85); scoreMap.put("Bob", 90); // scoreMap.put(123, "C"); // 编译错误,键和值的类型不匹配 // 遍历 Map for (Map.Entry<String, Integer> entry : scoreMap.entrySet()) { String name = entry.getKey(); Integer score = entry.getValue(); System.out.println(name + ": " + score); } }