javaSE——集合(一)

一、集合

1、集合简介

数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。

集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。

2、集合和数组的区别

(1)、长度区别

  • 数组固定

  • 长度可变

(2)、内容区别

  • 数组可以是基本数据类型,也可以是引用数据类型

  • 集合只能是引用类型--

(3)、元素内容

  • 数组只能存储同一种类型

  • 集合可以存储不同类型

3、集合分类

Collection 接口的接口 对象的集合(单列集合):

List 接口:元素按进入先后有序保存,可重复

LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全

ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全

Vector 接口实现类 数组, 同步, 线程安全

Stack 是Vector类的实现类

Set 接口: 仅接收一次,不可重复,并做内部排序

HashSet 使用hash表(数组)存储元素

LinkedHashSet 链表维护元素的插入次序

TreeSet 底层实现为二叉树,元素排好序

Map接口 键值对的集合 (双列集合)

Hashtable 接口实现类, 同步, 线程安全

HashMap 接口实现类 ,没有同步, 线程不安全

LinkedHashMap 双向链表和哈希表实现

WeakHashMap

TreeMap 红黑树对所有的key进行排序

IdentifyHashMap

4、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);
    }
}

5、遍历集合

(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]

二、Collection接口常用方法

Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可用于操作List和Queue集合。

Collection接口实现类的特点

public interface Collection<E> extends Iterable <E>Collection
  • Collection实现子类可以存放多个元素,每个元素可以是Object

  • 有些Collection的实现类,可以存放重复的元素,有些不可以

  • 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)

  • Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的

Collection接口里定义了如下操作集合元素的方法:

  1. boolean add(Object o):该方法用于向集合中添加一个元素。如果集合对象被添加操作改变了,则返回true

  2. boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true。

  3. void clear():清楚集合里所有元素,将集合长度变为0。

  4. boolean contains(Object o):返回集合里是否包含指定元素

  5. boolean containsAll(Collection c):返回集合里是否包含集合c里的所有元素

  6. boolean isEmpty():返回集合是否为空。当集合长度为0时返回true,否则返回flase

  7. Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素

  8. boolean remove(Object o):删除集合中的指定元素o,当集合中包含一个或多个元素o时,该方法只删除第一个符合条件的元素,该方法返回true。

  9. boolean removeAll(Collection c):从集合中删除集合c里包含的所有元素(相当于把调用该方法的集合减集合c),如果删除了一个或一个以上的元素,则该方法返回true

  10. boolean retainAll(Collection c):从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集),如果该操作改变了调用该方法的集合,则该方法返回true。

  11. int size():该方法返回集合里元素的个数。

  12. Object[] toArray():该方法把集合转换成一个数组,所有集合元素变成对应的数组元素。

通过ArrayList实现Collection接口

add()添加单个元素

public static void main(String[] args) {
    List list = new ArrayList();
    list.add("jack");
    list.add(10);
    list.add(true);
    System.out.println("List="+list);
}

remove()删除指定元素

list.remove(true);
System.out.println("List="+list);

contains()查找元素是否存在

System.out.println("jack");

size()获取元素个数

System.out.println(list.size());

isEmpty()判断是否为空

System.out.println(list.isEmpty());

clear()清空

list.clear();
System.out.println("List="+list);

addAll()添加多个元素

ArrayList arrayList = new ArrayList();
arrayList.add("红楼梦");
arrayList.add(false);
arrayList.add(45);
arrayList.addAll(arrayList);
System.out.println("ArrayList="+arrayList);

containsAll()查找多个元素是否都存在

System.out.println(list.containsAll(arrayList));

removeAll()删除多个元素

list.removeAll(arrayList); 
System.out.println("list="+list);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DF10F-0001A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值