# List 与 Set
本篇内容意在总结课上所学的知识并加以巩固,如有错误请立即联系我,谢谢!
- 关于 Collection
- 掌握 List 部分内容
- 掌握 Set 部分内容
- 迭代器
- WeChat:a735690757
- gmail:735690757carry@gmail.com
# 1,概述
在 Java 中,List 和 Set 接口都是继承自 Collection 接口。Collection 接口定义了一组通用的集合操作方法,而 List 和 Set 则分别扩展了 Collection 接口,以提供特定的集合行为。
# 2,Collection
在 Java 中,Collection 接口是一个集合框架的根接口,它定义了一组通用的集合操作方法,可以用于处理各种类型的集合。Collection 接口提供了一些常用的方法,如添加元素、删除元素、检查元素是否存在、迭代集合中的元素等。它是 Java 集合框架中最基本的接口,所有其他的集合接口都是扩展自 Collection 接口。
Collection 接口定义了如下方法(常用、不完全):
- boolean add (E e): 将元素添加到集合中,并返回是否添加成功。
- boolean addAll (Collection<? extends E> c): 将指定集合中的所有元素添加到该集合中,并返回是否添加成功。
- boolean remove (Object o): 从集合中删除指定元素,并返回是否删除成功。
- void clear (): 清空集合中的所有元素。
- boolean isEmpty (): 检查集合是否为空。
- int size (): 返回集合中元素的数量。
# 3,List
Java 中的 List 是一种常见的集合类,用于存储一组元素。List 是一个接口,它有多个实现类,如 ArrayList、LinkedList 等。
!重要!
-
允许存储重复的元素。
-
元素按照插入顺序有序存储。
-
可以通过索引访问 List 中的元素,索引从 0 开始。
-
List 可以动态调整大小,即添加或删除元素。
有序,可重复
# 3.1 ArrayList
List 的常用方法(可能不完全):(类似数组)
- add (element):向 List 末尾添加元素。
- add (index, element):在指定索引位置插入元素。
- remove (index):删除指定索引位置的元素。
- get (index):返回指定索引位置的元素。
- set (index, element):替换指定索引位置的元素。
- size ():返回 List 的大小。
- contains (element):判断 List 是否包含指定元素。
- indexOf (element):返回指定元素在 List 中第一次出现的索引位置。
- clear ():清空 List 中的所有元素。
import java.util.ArrayList; | |
import java.util.List; | |
public class ListExample { | |
public static void main(String[] args) { | |
List<String> list = new ArrayList<>(); | |
list.add("apple"); | |
list.add("banana"); | |
list.add("orange"); | |
System.out.println(list); // 输出:[apple, banana, orange] | |
list.remove(1); | |
System.out.println(list); // 输出:[apple, orange] | |
String fruit = list.get(1); | |
System.out.println(fruit); // 输出:orange | |
list.set(1, "grape"); | |
System.out.println(list); // 输出:[apple, grape] | |
} | |
} |
以上代码由 [ChatGPT Mar 14 Version] 生成。
package edu.beihua.KarryCode.listEX001.test; | |
import edu.beihua.KarryCode.listEX001.entity.news; | |
import java.util.ArrayList; | |
public class test_for_ArrayList { | |
public static void main(String[] args) { | |
/* | |
* add () ---- 增加对象 | |
* get () ---- 获取对象 | |
* 非泛型返回 Object | |
* isEmpty () ---- 判空 | |
* clear () ---- 清除 | |
* iterator ()---- 迭代器 | |
* toArray () ---- 转为数组 | |
* */ | |
news newslkr = new news(1,"timu1","lkr"); | |
news newsffl = new news(2,"timu2","ffl"); | |
news newslqr = new news(3,"timu3","lqr"); | |
news imnews = new news(4,"hexin","!!!!!"); | |
ArrayList<news> arrayList = new ArrayList<news>(); | |
arrayList.add(newslkr); // 普通追加 | |
arrayList.add(newsffl); | |
arrayList.add(newslqr); | |
arrayList.add(0,imnews); // 标记追加 | |
System.out.println("______________标题数目输出______________"); | |
System.out.println("新闻有"+arrayList.size()+"条"); | |
System.out.println("______________标题输出______________"); | |
for (int i=0;i<arrayList.size();i++){ | |
System.out.println(arrayList.get(i).getTitle()); // 不适用非泛型,可以使用(Object)强制转换,(news)进行匹配 | |
} | |
System.out.println("______________标题输出____________"); | |
for(Object obj:arrayList){ //** 增强形态的 For** | |
news newst = (news) obj; | |
System.out.println(newst.getTitle()); | |
} | |
System.out.println("______________标题输出____________"); | |
for(news news:arrayList){ //** 增强形态的 For**|| 最终版:面向对象 | |
System.out.println(news.getTitle()); | |
} | |
System.out.println("________________标题判断__________"); | |
System.out.println(arrayList.contains(newslqr)); | |
arrayList.remove(3); | |
System.out.println("______________标题输出____________"); | |
for(news news:arrayList){ //** 增强形态的 For**|| 最终版:面向对象 | |
System.out.println(news.getTitle()); | |
} | |
System.out.println("______________标题判断__________"); | |
System.out.println(arrayList.contains(newslqr)); | |
System.out.println("________________清空_______________"); | |
arrayList.clear(); | |
System.out.println(arrayList.isEmpty()); | |
} | |
} |
以上代码为上课所写(丑丑的 www)。
# 3.2 LinkedList
LinkedList 具有以下特点:
- 随机访问元素效率较低,因为需要遍历链表。
- 在链表的开头或结尾插入、删除元素的效率较高。
- 占用的内存空间相对较小。
有趣的方法:
- getFirst ():返回链表的第一个元素。
- getLast ():返回链表的最后一个元素。
- removeFirst ():删除链表的第一个元素。
- removeLast ():删除链表的最后一个元素。
import java.util.LinkedList; | |
import java.util.List; | |
public class LinkedListExample { | |
public static void main(String[] args) { | |
List<String> list = new LinkedList<>(); | |
list.add("apple"); | |
list.add("banana"); | |
list.add("orange"); | |
System.out.println(list); // 输出:[apple, banana, orange] | |
list.remove(1); | |
System.out.println(list); // 输出:[apple, orange] | |
String fruit = list.get(1); | |
System.out.println(fruit); // 输出:orange | |
list.set(1, "grape"); | |
System.out.println(list); // 输出:[apple, grape] | |
} | |
} |
以上代码由 [ChatGPT Mar 14 Version] 生成。
package edu.beihua.KarryCode.listEX001.test; | |
import edu.beihua.KarryCode.listEX001.entity.news; | |
import java.util.Iterator; | |
import java.util.LinkedList; | |
public class test_for_LinkList { | |
public static void main(String[] args) { | |
news newslkr = new news(1,"timu1","lkr"); | |
news newsffl = new news(2,"timu2","ffl"); | |
news newslqr = new news(3,"timu3","lqr"); | |
news imnews = new news(4,"hexin","!!!!!"); | |
LinkedList list = new LinkedList(); // 父父 new 子这种只能使用父子公用的方法 | |
list.add(newslkr); // 普通追加 | |
list.add(newsffl); | |
list.add(newslqr); | |
list.remove(0); | |
list.add(0,imnews); | |
System.out.println("______________内容输出____________"); | |
for(Object obj:list){ | |
news s = (news) obj; | |
System.out.println(s.getTitle()); | |
} | |
news tyu = (news)list.getFirst(); | |
System.out.println(tyu.getNo()); | |
news imnews666 = new news(10,"hexin66666","!!66666!!!"); | |
list.addFirst(imnews666); | |
System.out.println("______________内容输出____________"); | |
for(Object obj:list){ | |
news s = (news) obj; | |
System.out.println(s.getTitle()); | |
} | |
news re = (news)list.removeLast(); | |
System.out.println(re.getData()); | |
System.out.println(list.size()); | |
Iterator iterator = list.iterator(); | |
System.out.println("_________________________"); | |
while (iterator.hasNext()){ | |
news news = (news) iterator.next(); | |
System.out.println(news.getTitle()); | |
} | |
} | |
} |
# 4,Set
在 Java 中,Set 是一种集合(Collection)类型,它是一组不允许包含重复元素的对象。Set 是通过哈希表(hash table)实现的,因此它没有顺序,也不能通过索引访问其中的元素。Set 接口继承自 Collection 接口,并添加了一些独有的方法。
无序,唯一
Java 中常用的 Set 类有以下几种:
- HashSet:基于哈希表实现,具有良好的插入和查询性能,但不保证元素的顺序。
- TreeSet:基于红黑树实现,元素按照自然顺序排序或指定的 Comparator 顺序排序。
- LinkedHashSet:基于哈希表和链表实现,保证元素按照插入顺序排列。
Set 的常用方法包括:
- add (element):向集合中添加元素。
- remove (element):从集合中删除指定元素。
- contains (element):判断集合中是否包含指定元素。
- size ():返回集合中元素的数量。
- isEmpty ():判断集合是否为空。
- clear ():清空集合中的所有元素。
例如,以下是使用 HashSet 和 TreeSet 实现的 Set 的示例:
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetExample {
public static void main(String[] args) {
Set<String> hashSet = new HashSet<>();
hashSet.add("apple");
hashSet.add("banana");
hashSet.add("orange");
System.out.println(hashSet); // 输出:[orange, banana, apple]
hashSet.remove("banana");
System.out.println(hashSet); // 输出:[orange, apple]
System.out.println(hashSet.contains("orange")); // 输出:true
Set<String> treeSet = new TreeSet<>();
treeSet.add("apple");
treeSet.add("banana");
treeSet.add("orange");
System.out.println(treeSet); // 输出:[apple, banana, orange]
treeSet.remove("banana");
System.out.println(treeSet); // 输出:[apple, orange]
System.out.println(treeSet.contains("orange")); // 输出:true
}
}
以上代码由 [ChatGPT Mar 14 Version] 生成。
# 4.1 HashSet
在 Java 中,HashSet 是一种基于哈希表实现的 Set 集合,它不保证元素的顺序,但是可以快速地插入和查找元素。HashSet 使用哈希函数将元素映射到哈希表中的桶(bucket)中,桶是一个链表或树结构,用于解决哈希冲突(即不同元素映射到同一个桶中的情况)。
HashSet 的特点包括:
- 不保证元素的顺序。
- 不允许集合中存在重复元素。
- 允许 null 元素。
package edu.beihua.KarryCode.listEX001.test; | |
import edu.beihua.KarryCode.listEX001.entity.news; | |
import java.util.HashSet; | |
import java.util.Iterator; | |
import java.util.Objects; | |
import java.util.Set; | |
public class test_foe_HashSet { | |
public static void main(String[] args) { | |
/* | |
* 无论什么 List 还是 Set 均为 Cll... 的继承类,其均具有父类的方法 | |
* Set 中存放的是对象的引用,相同的引用是互斥的只能添加一次 | |
* equals () 方法可以被重写 | |
* Set 是无序的,不存在 Function(index,XXX)类似如此的有序号的的方法,且只能使用增强型的 for 进行循环输出 */ | |
Set set = new HashSet(); | |
news newslkr = new news(1,"timu1","lkr"); | |
news newsffl = new news(2,"timu2","ffl"); | |
news newslqr = new news(3,"timu3","lqr"); | |
set.add(newslkr); // 普通追加 | |
set.add(newsffl); | |
set.add(newslqr); | |
for(Object obj:set){ | |
news test = (news) obj; | |
System.out.println(test.getData()); | |
} | |
Iterator iterator = set.iterator(); | |
while (iterator.hasNext()){ | |
news test = (news) iterator.next(); | |
System.out.println(test.getData()); | |
} | |
} | |
} |
# 5,Iterator 迭代器
在 Java 中,Iterator 是一个用于遍历集合(Collection)元素的接口,它提供了一种统一的访问集合中元素的方式。通过 Iterator,我们可以遍历集合中的每个元素,而不需要知道集合的具体实现方式。
Iterator 接口包含了以下方法:
- hasNext ():判断集合中是否还有下一个元素。
- next ():返回集合中的下一个元素。
- remove ():从集合中移除通过 next () 方法返回的最后一个元素。
Iterator 的工作原理是,首先通过集合的 iterator () 方法获得一个 Iterator 对象,然后使用 hasNext () 和 next () 方法遍历集合中的元素,最后使用 remove () 方法从集合中移除元素。
在 4.1HashSet 中用到了本迭代器,以下为关键语句:
Iterator iterator = set.iterator(); | |
while (iterator.hasNext()){ | |
news test = (news) iterator.next(); | |
System.out.println(test.getData()); | |
} |