1、集合和数组的区别
(1)、长度区别
-
数组固定
-
长度可变
(2)、内容区别
-
数组可以是基本数据类型,也可以是引用数据类型
-
集合只能是引用类型--
(3)、元素内容
-
数组只能存储同一种类型
-
集合可以存储不同类型
2、集合分类
Collection 接口的接口 对象的集合(单列集合):
List 接口:元素按进入先后有序保存,可重复
LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
Vector 接口实现类 数组, 同步, 线程安全
Stack 是Vector类的实现类
Set 接口: 仅接收一次,不可重复,并做内部排序
HashSet 使用hash表(数组)存储元素
LinkedHashSet 链表维护元素的插入次序
TreeSet 底层实现为二叉树,元素排好序
Map接口 键值对的集合 (双列集合)
Hashtable 接口实现类, 同步, 线程安全
HashMap 接口实现类 ,没有同步, 线程不安全
LinkedHashMap 双向链表和哈希表实现
WeakHashMap
TreeMap 红黑树对所有的key进行排序
IdentifyHashMap
3、Lambda表达式
Lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。
Lambda表达式的语法:
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
Stream流
Stream 本质上是个接口,接口中定义了很多对 Stream 对象的操作
Stream 中主要包含如下几个方法:
collect(toList()) |
通过 Stream 生成一个列表 |
map |
将流中的一个值转换成一个新的值 |
filter |
过滤 Stream 中的元素 |
flatMap |
将多个 Stream 连接成一个 Stream |
max |
求最大值 |
min |
求最小值 |
reduce |
从一组值中生成一个新的值 |
传统方式和stream流处理list集合,获取list集合字符长度是三且不为空的字符串并且打印
public class Dermo01Strema {
public static void main(String[] args) {
List<String> name = new ArrayList<String>();
name.add("张三");
name.add("王五");
/**
* 传统方式
*/
for(String s: name){
if(null != s && s.length() == 3){
System.out.println(s);
}
}
/**
* strema方式
*/
name.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println);
}
}
4、遍历集合
(1)、使用Lambda表达式遍历集合
Iterator接口新增了一个forEach(Consumer action)默认方法,该方法所需要参数的类型是一个函数式接口。而Iterator接口是Collection接口的父接口,因此Collection集合也可以直接调用该方法。
import java.util.Collection;
import java.util.HashSet;
public class CollectionEach{
public static void main(String[] args) {
//创建一个集合
Collection books = new HashSet();
books.add("字符串1");
books.add("字符串2");
books.add("字符串3");
//调用forEach()方法遍历集合
books.forEach(obj->System.out.println("迭代集合元素:"+obj));
}
}
输出:
迭代集合元素:字符串2
迭代集合元素:字符串1
迭代集合元素:字符串3
(2)、使用Iterator遍历集合
Iterator对象称为迭代器,主要用于遍历Collection集合中的元素,所有实现了Collectionj接口的集合类都有一个Iterator()方法,用以返回一个实现了Iterator接口的对象,既可以返回一个迭代器。Iterator仅用于遍历集合,它本身并不存放对象。Iterator接口定义了如下四个方法:
-
boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true。
-
Object next():返回集合里的下一个元素。
-
void remove():删除集合里上一次next方法返回的元素
-
void forEachRemaining(Consumer action):java 8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素
执行迭代器过程
public static void main(String[] args) {
List list = new ArrayList();
list.add("张三");
list.add(45);
list.add(true);
list.addAll(list);
//得到list集合的迭代器
Iterator iterator = list.iterator();
//hshNext()判断是否还有下一个元素
while(iterator.hasNext()){
//next()将指针下移并将下移后的元素返回
System.out.println(iterator.next());
}
}
当多次遍历时,需要重置迭代器,然后再进行while循环
iterator = list.iterator();
(3)、使用Lambda表达式遍历Iterator集合
java 8为Iterator新增了一个forEachRemaining(Consumer action)方法,该方法所需要的Consumer参数同样也是函数式接口。
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class IteratorEach{
public static void main(String[] args) {
//创建一个集合
Collection books = new HashSet();
books.add("字符串1");
books.add("字符串2");
books.add("字符串3");
//获取books集合对应的迭代器
Iterator it = books.iterator();
//使用Lambda表达式(目标类型是Comsumer)来遍历集合元素
it.forEachRemaining(obj->System.out.println("迭代集合元素:"+obj));
}
}
输出:
迭代集合元素:字符串2
迭代集合元素:字符串1
迭代集合元素:字符串3
(4)、使用foreach循环遍历元素
与使用Iterator接口迭代访问集合元素类似的是,foreach循环中的迭代变量也不是集合元素本身,系统只是以此把集合元素的值赋给迭代变量,因此在foreach循环中修改迭代变量的值也没有任何意思。同样,使用foreach循环迭代访问集合元素是,该集合也不能改变。
import java.util.Collection;
import java.util.HashSet;
public class FroeachTest{
public static void main(String[] args) {
//创建一个集合
Collection books = new HashSet();
books.add("字符串1");
books.add("字符串2");
books.add("字符串3");
for (Object obj:books) {
//此处的book变量也不是集合元素本身
String book = (String)obj;
System.out.println(book);
}
System.out.println(books);
}
}
输出:
字符串2
字符串1
字符串3
[字符串2, 字符串1, 字符串3]