允子在Java中已经为我们提供了数组,为什么还要使用集合?要搞清楚为什么,首先得分别分析以下数组、集合各自的特点
数组特点
因为数组定义后,类型确定、长度确定,
在进行增删数据(增删时需要放弃原有数组或移位)操作时不方便
集合特点
集合的大小不固定,启动后还可以动态变化,类型也可以不固定
集合非常适合做元素的增删操作
注:集合中只能存储引用类型数据,如果要存储基本数据类型要使用包装类
集合可以看作是Java中存储对象数据的一种容器。
小结:
数组和集合的元素存储的个数问题。
数组定义后类型固定,长度固定
集合类型可以不固定,大小是可变的
数组和集合存储元素的类型问题。
数组可以存储基本数据类型和引用数据类型的数据
集合只能存储引用数据类型的数据
数组和集合适合的场景。
数组适合做数据个数和类型确定的场景
集合适合做数据个数不确定,且要做增删元素的场景
Collection的常用方法如下
方法演示代码如下:
package com.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
* @Time: 2022/4/5 14:25
* @Author: 宁洪康
* @Package: com.collection
* @File: Collection_Api.java
* @Software: IntelliJ IDEA
*/
public class Collection_Api {
public static void main(String[] args) {
// ArrayList 有序、可重复、有索引
Collection<String> list1 = new ArrayList<String>(); // 多态写法,不能调用子类特有方法
// 1,添加元素,添加成功返回true
list1.add("Java");
list1.add("HTML");
list1.add("MySql");
list1.add("Java");
// list1.add(23); // 错误写法,泛型规定了只能添加String类型
System.out.println(list1.add("宋老狗")); // true
System.out.println(list1); // [Java, HTML, MySql, Java, 宋老狗]
System.out.println("--------------");
// 2.清空集合元素
//list1.clear();
//System.out.println(list1);
//System.out.println("--------------");
// 3.判断集合是否为空,为空返回true
System.out.println(list1.isEmpty());
System.out.println("--------------");
// 4.获取集合大小
System.out.println(list1.size());
System.out.println("--------------");
// 5.判断集合中是否有某元素
System.out.println(list1.contains("宋狗")); // false
System.out.println(list1.contains("宋老狗")); // true
System.out.println("--------------");
// 6.删除某个元素:如果有多个重复元素,默认删除前的的第一个
list1.remove("Java"); // ture
System.out.println(list1.remove("java")); // false
System.out.println(list1);
System.out.println("--------------");
// 7.把集合转换成数组
Object[] arr = list1.toArray();
System.out.println(Arrays.toString(arr));
System.out.println("--------------------拓展--------------------");
Collection<String> c1 = new ArrayList<>();
c1.add("java1");
c1.add("java2");
Collection<String> c2 = new ArrayList<>();
c2.add("宋老狗");
c2.add("高衙内");
// 用addAll把集合c2的元素全部导入c1中
c1.addAll(c2);
System.out.println(c1);
System.out.println(c2);
}
}
代码结果如下:
?
Collection集合的遍历方式:
? ? ? ? 方式一:迭代器
????????方式二:foreach/增强for
????????方式三:lambda表达式
迭代器遍历概述
遍历就是一个一个把容器中的元素访问一遍
迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式
Collection集合获取迭代器的方法
?Iterator,的常用方法
以下是迭代器的用法
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @Time: 2022/4/5 15:56
* @Author: 宁洪康
* @Package: com.collection
* @File: CollectionTraversal_1.java
* @Software: IntelliJ IDEA
*/
public class CollectionTraversal_1 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("宋老狗");
lists.add("高衙内");
lists.add("月全食");
lists.add("夹子");
System.out.println(lists);
// 1.得到集合的迭代器对象
// 返回迭代器对象,迭代器对象的默认指向集合的0索引
Iterator<String> it = lists.iterator();
// 2.定义while循环
// boolean hasNext() 询问当前位置是否有元素,存在返回true
// E next() 获取当前位置元素,并将迭代器对象移向下一位置
while (it.hasNext()) {
String ele = it.next();
System.out.println(ele);
}
}
}
迭代器小结
????????通过 Iterator<E>? iterator();得到迭代器对象,默认指向当前集合的0索引
????????迭代器如果取元素越界可能会出现NoSuchElementException(无此元素异常)异常
?
增强for循环
增强for循环出现与JDK5之后,其内部原理是一个Iterator迭代器,遍历集合相当于迭代器的简化写法
增强for循环既可以既可以遍历数组也可以遍历集合
实现Iterator接口的类才可以使用迭代器和增强for,Collection已经实现了Iterator接口
格式:
for(元素数据类型 变量名:数组或者Collection集合){
// 在此处使用变量,该变量就是元素
}
?以下是增强for的用法:
package com.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**
* @Time: 2022/4/5 16:24
* @Author: 宁洪康
* @Package: com.collection
* @File: CollectionTraversal_2.java
* @Software: IntelliJ IDEA
*/
public class CollectionTraversal_2 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("宋老狗");
lists.add("高衙内");
lists.add("月全食");
lists.add("夹子");
System.out.println(lists);
// 遍历集合
for (String ele : lists) {
System.out.println(ele);
}
System.out.println("----------");
// 遍历数组
double[] scores = {100.0, 89, 67, 76.0, 85.5};
for (double score : scores) {
System.out.println(score);
}
System.out.println("----------");
// 注:改变增强for里面的变量值对集合、数组没有影响
double[] scores2 = {100.0, 89, 67, 76.0, 85.5};
for (double score : scores2) {
if(score == 100.0) {
score = 60.0; // 修改无意义,不影响数组的元素值
}
System.out.println(score);
}
System.out.println(Arrays.toString(scores2)); // 改变增强for里的变量值对数组没有影响
}
}
以下是输出结果:
增强for小结
? ? ? ? 增强for既可以遍历集合也可以遍历数组
Lambda表达式遍历集合
得益于JDK8开始的Lambda表达式,为集合提供了一种更简单的、更直接的遍历方式
以下是Collection结合Lambda遍历的API
?以下是Lambda表达式遍历集合的使用
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
/**
* @Time: 2022/4/5 16:45
* @Author: 宁洪康
* @Package: com.collection
* @File: CollectionTraversal_3.java
* @Software: IntelliJ IDEA
*/
public class CollectionTraversal_3 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("宋老狗");
lists.add("高衙内");
lists.add("月全食");
lists.add("夹子");
System.out.println(lists);
lists.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
// 以下是forEach方法的具体实现,来源于Iterable
/* default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}*/
System.out.println("--------");
// 使用Lambda简化
lists.forEach(s -> {
System.out.println(s);
});
System.out.println("--------");
// 使用Lambda进一步简化简化
lists.forEach(s -> System.out.println(s));
System.out.println("--------");
// 终极简化
lists.forEach(System.out::println);
}
}
以下是输出结果:
?Collection集合存储自定义类型对象
我们以一个小案例来分析
需求:某影院系统需要在后台存储三部电影,请依次展示出来
分析:
????????1.定义一个电影类并重写toString()方法,定义一个集合存储电影对象
? ? ? ? 2.创建3个电影对象,封装相关数据,把3个对象存入到集合
? ? ? ? 3.遍历集合中的3个对象,输出相关信息
以下是Movie类
package com.collection;
/**
* @Time: 2022/4/5 17:07
* @Author: 宁洪康
* @Package: com.collection
* @File: Movie.java
* @Software: IntelliJ IDEA
*/
public class Movie {
private String name;
private float score;
private String actor;
public Movie() {
}
public Movie(String name, float score, String actor) {
this.name = name;
this.score = score;
this.actor = actor;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
@Override
public String toString() {
return "Movie{" +
"name='" + name + '\'' +
", score=" + score +
", actor='" + actor + '\'' +
'}';
}
}
以下是MovieDemo类,类中定义了集合对象并将3个电影对象依次加入到了集合中
package com.collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* @Time: 2022/4/5 17:14
* @Author: 宁洪康
* @Package: com.collection
* @File: MovieDemo.java
* @Software: IntelliJ IDEA
*/
public class MovieDemo {
public static void main(String[] args) {
// 创建一个集合对象存储三部电影对象
Collection<Movie> movies = new ArrayList<>();
movies.add(new Movie("《你好,李焕英》", 9.5f, "张小斐,贾玲,沈腾,陈赫"));
movies.add(new Movie("《唐人街探案3》", 8.5F, "王宝强,刘昊然"));
movies.add(new Movie("《刺杀小说家》", 8.6F, "杨幂,雷佳音"));
//遍历集合容器中的每一个电影对象
for (Movie movie : movies) {
System.out.println(movie);
}
}
}
以下是运行结果
?总结
集合中存储的是元素对象的地址
|