集合和数组都是容器。
数组的特点:
- 数组定义完成并启动后,类型确定、长度固定。
- 在进行增删数据操作的时候,数组是不太合适的,增删数据都需要放弃原有数组或者移位。
数组适合的场景:
- 当业务数据的个数是固定的,且都是同一批数据类型的时候,可以采取定义数组存储。
集合是Java中存储对象数据的一种容器。
集合的特点:
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
- 集合非常适合做元素的增删操作。
- 注意:集合中只能存储引用类型数据,如果要存储基本类型数据可以选用包装类。
集合适合的场景:
- 数据的个数不确定,需要进行增删元素的时候。
集合类体系结构:
- Collection:Collection单列集合,每个元素(数据)只包含一个值。
-
- List系列集合:添加的元素是有序、可重复、有索引。
-
-
- ArrayList、LinekdList :有序、可重复、有索引。
-
-
- Set系列集合:添加的元素是无序、不重复、无索引。
-
-
- HashSet:无序、不重复、无索引; LinkedHashSet:有序、不重复、无索引。
- TreeSet:按照大小默认升序排序、不重复、无索引。
-
- Map:Map双列集合,每个元素包含两个值(键值对)。
集合对于泛型的支持:
- 集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型
collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayListi>();// JDK 1.7开始后面的泛型类型申鸱可以省路不写
- 注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
- 如果集合中要存储基本类型的数据使用包装类。
Collection集合常用APl:具体参考官方API文档Java Platform SE 8
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class Main {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
//1、添加元素,添加成功返回true
list.add("java");
list.add("JAVA");
list.add("MySQL");
System.out.println(list.add("java")); //true
System.out.println(list); //[java, JAVA, MySQL, java]
//2、清空集合元素
// list.clear();
//System.out.println(list); //[]
//3、判断集合是否为空,是空返回true,反之返回false
System.out.println(list.isEmpty()); //false
//4、获取集合的大小
System.out.println(list.size()); // 4
//5、判断集合中是否包含某个元素
System.out.println(list.contains("java")); //true
System.out.println(list.contains("Java")); //false
//6、删除某个元素:如果有多个重复元素,默认删除前面的第一个
System.out.println(list.remove("java")); //true
System.out.println(list); //[JAVA, MySQL, java]
System.out.println(list.remove("HTML")); //false
System.out.println(list); // [JAVA, MySQL, java]
//7、把集合转换成数组
Object[] arr = list.toArray();
System.out.println("数组"+ Arrays.toString(arr));
System.out.println("--------------拓展------------");
Collection<String> c = new ArrayList<>();
c.add("java");
c.add("JAVA");
Collection<String> c1 = new ArrayList<>();
c1.add("奥");
c1.add("利");
c1.add("奥");
//addAll把c1集合里面的元素全部倒入到c中去
c.addAll(c1);
System.out.println(c); //[java, JAVA, 奥, 利, 奥]
System.out.println(c1); //[奥, 利, 奥]
}
}
Collection集合的遍历方式:
- 迭代器:
-
- 概述:遍历就是一个一个的把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式。
-
- Collection集合获取迭代器
方法名称 | 说明 |
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引 |
-
- lterator中的常用方法
方法名称 | 说明 |
boolean hasNext( ) | 询问当前位置是否有元素存在,存在返回true ,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界。 |
-
- 迭代器的默认位置:
-
-
- lterator<E> iterator():得到迭代器对象,默认指向当前集合的索引0
-
-
- 迭代器取元素越界会出现问题:会出现NoSuchElementException异常。
- 增强for循环
-
- 增强for循环:既可以遍历集合也可以遍历数组。
- 它是JDK5之后出现的,其内部原理是一个lterator迭代器,遍历集合相当于是迭代器的简化写法。
-
- 实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了lterable接口。
- 格式:
for(元素数据类型变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
for( String str : list){
System.out.println(str);
}
-
- 增强for修改变量:修改无意义,不会改变集合或数组中的值。
- Lambda表达式遍历集合:得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。
-
- Collection结合Lambda遍历的API
方法名称 | 说明 |
default void forEach(Consumer< ? super T> action) : | 结合lambda遍历集合 |
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
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);
/*
* 奥
* 利
* 奥
*/
// }
// });
//Lambda表达式遍历集合
lists.forEach( s->{
System.out.println(s);
/*
* 奥
* 利
* 奥
*/
});
//简化形式
// lists.forEach( s->System.out.println(s));
//简化形式
// lists.forEach(System.out::println);
}
}
集合中存储的是元素对象的地址。