数组固定
长度可变
数组可以是基本数据类型,也可以是引用数据类型
集合只能是引用类型--
数组只能存储同一种类型
集合可以存储不同类型
Collection 接口的接口 对象的集合(单列集合):
List 接口:元素按进入先后有序保存,可重复
LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
Vector 接口实现类 数组, 同步, 线程安全
Stack 是Vector类的实现类
Set 接口: 仅接收一次,不可重复,并做内部排序
HashSet 使用hash表(数组)存储元素
LinkedHashSet 链表维护元素的插入次序
TreeSet 底层实现为二叉树,元素排好序
Map接口 键值对的集合 (双列集合)
Hashtable 接口实现类, 同步, 线程安全
HashMap 接口实现类 ,没有同步, 线程不安全
LinkedHashMap 双向链表和哈希表实现
WeakHashMap
TreeMap 红黑树对所有的key进行排序
IdentifyHashMap
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); } }
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
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();
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
与使用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]