个人主页→VON
收录专栏→java从入门到起飞
目录
一、前言
java中的集合也是一个重点,同样也是难点,涉及到的东西较多较杂,希望大家能够和我一起来学习java集合进阶方面的知识。预计一周的时间将java集合进阶部分拿下,加油。
二、Collection集合简要概述
在Java中,java.util.Collection
是一个接口,它是所有Java集合框架的根。它定义了集合类必须实现的基本操作,如添加元素、删除元素、迭代等。所有的集合类(如 List
, Set
, Queue
等)都是 Collection
接口的直接或间接实现。
Collection的主要实现
-
List:这是一个有序的集合,可以包含重复的元素,并且可以通过索引访问元素。主要的实现包括:
ArrayList
:实现了基于动态数组的数据结构。LinkedList
:实现了基于双向链表的数据结构。Vector
:与ArrayList
类似,但是线程安全的。
-
Set:这是一个不允许有重复元素的集合。主要的实现包括:
HashSet
:提供了一个平均性能较高的实现,不保证元素的顺序。TreeSet
:提供了排序功能,元素按自然顺序或由Comparator
指定的顺序进行排序。LinkedHashSet
:结合了HashSet
和LinkedHashMap
的特性,维护了插入顺序。
-
Queue:用于按照特定顺序保持元素的集合,主要用于FIFO(先进先出)情况。主要的实现包括:
LinkedList
:实现Queue
接口,并提供队列操作。PriorityQueue
:按照优先级顺序对元素进行排序。
Collection的方法
Collection
接口定义了一些常用的方法,比如:
boolean add(E e)
:向集合中添加一个元素。boolean remove(Object o)
:从集合中移除指定的元素。void clear()
:移除集合中的所有元素。boolean contains(Object o)
:如果此集合包含指定元素,则返回true
。Iterator<E> iterator()
:返回集合的迭代器。int size()
:返回集合中的元素数量。boolean isEmpty()
:如果集合不包含任何元素,则返回true
。
迭代器(Iterator)
Iterator
接口是 Collection
中的一个内部接口,用于遍历集合中的元素。它提供了 hasNext()
方法来检查集合中是否还有更多的元素,以及 next()
方法来获取集合中的下一个元素。
三、单列集合顶层接口Collection
CollectionDemo01
关于Collection的一些常见函数的使用
java
package ArrayDemo.CollectionDemo;
import java.util.ArrayList;
import java.util.Collection;
public class A01_CollectionDemo01 {
public static void main(String[] args) {
// 注:
// Collection是一个接口,不能够直接创建他的对象
// 只能创建他实现类的对象
Collection<String> coll = new ArrayList<>();
// 集合中常见方法
// 1.添加元素
// List系列的允许元素重复
// Set系列的不允许元素重复
coll.add("a");
coll.add("b");
coll.add("c");
System.out.println(coll);// [a, b, c]
// 2.清空
/*coll.clear();
System.out.println(coll);*/ // []
// 3.删除
// 注:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除。只能通过元素的对象进行删除
System.out.println(coll.remove("a"));// true
// 如果删除成功返回true,删除失败返回False
System.out.println(coll.remove("d"));// false
System.out.println(coll);// [b, c]
// 4.判断元素是否包含
// 底层是依赖equals方法进行判断是否存在的
// 所以,如果集合中储存的是自定义对象,也想通过contains方法来判断是否包含,那么在javabean中,一定要重写equals方法
System.out.println(coll.contains("a"));// false
System.out.println(coll.contains("b"));// true
System.out.println(coll.contains("c"));// true
// 5.判断集合是否为空
boolean result = coll.isEmpty();
System.out.println(result);// false
// 6.获取集合的长度
int size = coll.size();
System.out.println(size);// 2
}
}
CollectionDemo02
思考一下为什么结果为false?
java
package ArrayDemo.CollectionDemo;
import java.util.ArrayList;
import java.util.Collection;
public class A02_CollectionDemo02 {
public static void main(String[] args) {
// 1.创建集合对象
Collection<Student> coll = new ArrayList<>();
// 2.创建三个 学生对象
Student s1 = new Student("zhang",18);
Student s2 = new Student("li",19);
Student s3 = new Student("wang",20);
// 3.将学生对象添加到集合中
coll.add(s1);
coll.add(s2);
coll.add(s3);
// 4.判断集合中某一个学生对象是否包含
Student s4 = new Student("zhang",18);
System.out.println(coll.contains(s4));// false
}
}
不知道你们有没有疑问,明明集合中有该对象,但是判断的时候结果却是false。
原因如下:
因为contains方法底层依赖equals方法判断对象是否一致的
如果存的是自定义对象,没有重写equals方法,那么默认使用Object类中的equals方法进行判断,而Object类中equals方法,依赖地址值进行判断。
解决方法:
在类中的javabean中重写equals方法
重写之后结果为true
CollectionDemo03
利用迭代器遍历集合中的数据
java
package ArrayDemo.CollectionDemo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class A03_CollectionDemo03 {
public static void main(String[] args) {
/*
Collection系列集合三种通用的遍历方式
1.迭代器遍历
2.增强for遍历
3.lambda表达式遍历
迭代器相关的三个方法
1.Iterator<E>iterator():获取一个迭代器对象
2.boolean hasNext() :判断当前指向的位置是否有元素
3.E next() :获取当前指向的元素并移动指针
*/
// 1.创建集合并添加集合元素
Collection<String> coll = new ArrayList<>();
coll.add("a");
coll.add("b");
coll.add("c");
coll.add("d");
// 2.获取迭代器对象
Iterator<String> it = coll.iterator();
// 3.利用循环去获取元素
while(it.hasNext()){
// 4.获取元素并移动指针
System.out.println(it.next());
}
}
}
使用迭代器遍历集合的时候要注意以下几点:
// 注:
// 1.报错NoSuchElementException
// 2.迭代器遍历完毕,指针不会复位
// 3.循环中只能用一次next方法
// 4.迭代器遍历时,不能用集合的方法进行增加或者删除
// 如果想要删除元素,可以用迭代器提供的remove方法进行删除
// 如果要添加,暂时没有方法
// 报错NoSuchElementException
// System.out.println(it.next());// NoSuchElementException
// 迭代器遍历完毕,指针不会复位
// System.out.println(it.hasNext());// false
CollectionDemo04
增强for循环遍历
java
package ArrayDemo.CollectionDemo;
import java.util.ArrayList;
import java.util.Collection;
public class A04_CollectionDemo04 {
public static void main(String[] args) {
// 增强for遍历
// for(数据类型 变量名:集合/数组){
//
// }
// 1.创建集合并添加集合元素
Collection<String> coll = new ArrayList<>();
coll.add("a");
coll.add("b");
coll.add("c");
coll.add("d");
// 2.利用增强for进行遍历
// s就是一个第三方变量,在循环过程中依次表示集合中的每一个数据
for (String s : coll) {
s="s";
}
System.out.println(coll);// [a, b, c, d]
// 注:
// 修改增强for中的变量,不会改变集合原本的数据
}
}
自我感觉最好用的一种遍历方式并且有快捷键。
快捷键:集合.for
CollectionDemo05
java
package ArrayDemo.CollectionDemo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class A05_CollectionDemo05 {
public static void main(String[] args) {
// 1.创建集合并添加集合元素
Collection<String> coll = new ArrayList<>();
coll.add("a");
coll.add("b");
coll.add("c");
coll.add("d");
// 2.利用匿名内部类的形式
// 底层原理:
// 将每一个元素都传递给下面的accept方法
coll.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// lambda表达式
coll.forEach (s->System.out.println(s));
}
}
这个我也不是太理解,希望各位大佬给予指导。