📃个人主页:个人主页
🔥系列专栏:JAVASE基础
目录
前言:
集合和数组类似,都是容器。为什么用集合?
数组的特点
- 数组定义完成并启动后,类型确定、长度固定。
- 不适合元素的个数和类型不确定的业务场景,更不适合做需要增删数据操作。
- 数组的功能也比较的单一,处理数据的能力并不是很强大。
集合的特点
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
- 集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
- 同时,集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。
1、数组和集合的元素存储的个数问题。
数组定义后类型确定,长度固定 集合类型可以不固定,大小是可变的。
2、数组和集合存储元素的类型问题。
数组可以存储基本类型和引用类型的数据。 集合只能存储引用数据类型的数据。
3、数组和集合适合的场景 数组适合做数据个数和类型确定的场景。
集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。
1.集合的体系特点
集合类体系结构
- Collection单列集合,每个元素(数据)只包含一个值。
- Map双列集合,每个元素包含两个值(键值对)。
- 注意:前期先掌握Collection集合体系的使用。
Collection集合体系
Collection集合特点
List系列集合:添加的元素是有序、可重复、有索引。
- ArrayList、LinekdList :有序、可重复、有索引。
Set系列集合:添加的元素是无序、不重复、无索引。
- HashSet: 无序、不重复、无索引;
- LinkedHashSet: 有序、不重复、无索引。
- TreeSet:按照大小默认升序排序、不重复、无索引。
泛型
- 集合都是泛型的形式,可以在编译阶段约束集合只能操作某种数据类型
Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList<>(); // JDK 1.7开始后面的泛型类型申明可以省略不写
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
2.Collection集合常用API
Collection集合
- Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
Collection API如下:
方法名称 | 说明 |
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定的对象在当前集合中删除 |
public boolean contains(Object obj) | 判断当前集合中是否包含给定的对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数。 |
public Object[] toArray() | 把集合中的元素,存储到数组中 |
@org.junit.Test
public void test() {
Collection<String> list = new ArrayList<>();
//1.public boolean add(E e) 把给定的对象添加到当前集合中
list.add("java");
list.add("html");
list.add("mysql");
list.add("java");
list.add("python");
System.out.println(list);
System.out.println("--------------------------------------------------");
//2.public void clear() 清空集合中所有的元素
// list.clear();
// System.out.println(list);
//3.public boolean remove(E e) 把给定的对象在当前集合中删除
list.remove("java");
System.out.println(list);
System.out.println("--------------------------------------------------");
//4.public boolean contains(Object obj) 判断当前集合中是否包含给定的对象
System.out.println(list.contains("html"));
System.out.println(list.contains("htm"));
System.out.println("--------------------------------------------------");
//5.public boolean isEmpty() 判断当前集合是否为空
System.out.println(list.isEmpty());
// list.clear();
// System.out.println(list.isEmpty());
System.out.println("--------------------------------------------------");
//6.public int size() 返回集合中元素的个数。
System.out.println(list.size());
System.out.println("--------------------------------------------------");
//7.public Object[] toArray() 把集合中的元素,存储到数组中
Object[] array = list.toArray();
System.out.println(array[0]);
System.out.println(array.length);
}
3.Collection集合的遍历方式
方式一:迭代器
迭代器遍历概述
- 遍历就是一个一个的把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式。
Collection集合获取迭代器
方法名称 | 说明 |
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引 |
Iterator中的常用方法
方法名称 | 说明 |
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。 |
迭代器执行流程
public void test() {
Collection<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("mysql");
list.add("java");
list.add("python");
System.out.println(list);
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
}
方式二:foreach/增强for循环
增强for循环
for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
public void test() {
Collection<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("mysql");
list.add("java");
list.add("python");
System.out.println(list);
for (String ele:list){
System.out.println(ele);
}
}
方式三:lambda表达式
Lambda表达式遍历集合
得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
Collection结合Lambda遍历的API
方法名称 | 说明 |
default void forEach(Consumer<? super T> action): | 结合lambda遍历集合 |
public void test() {
Collection<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("mysql");
list.add("java");
list.add("python");
System.out.println(list);
list.forEach(System.out::println);
}
4.List系列集合
Collection集合体系
List系列集合特点
- ArrayList、LinekdList :有序,可重复,有索引。
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
List集合特有方法
List集合因为支持索引,所以多了很多索引操作的独特api,其他Collection的功能List也都继承了。
方法名称 | 说明 |
void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) | 返回指定索引处的元素 |
ArrayList集合底层原理
- ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
- 第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
LinkedList集合的底层原理
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
LinkedList集合的特有功能
方法名称 | 说明 |
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |