javaSE——集合(一)

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接口定义了如下四个方法:

  1. boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true。

  2. Object next():返回集合里的下一个元素。

  3. void remove():删除集合里上一次next方法返回的元素

  4. 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]

猜你喜欢

转载自blog.csdn.net/qq_41819893/article/details/121942419