JAVA集合

数组与集合
①存储对象:数组(基本类和引用类型)
……………….集合(引用类型)
②数组声明了它容纳的元素的类型,而集合不声明
数组的存放的类型只能是一种,集合存放的类型可以不是一种(不加泛型时添加的类型是Object);

1、概述

JAVA的集合类主要由:Collection和Map两个接口接口派生而出。也因此JAVA的集合可分为Collection和Map种体系
★Collection接口:
…………………….☞Set子接口: 元素无序、不可重复的集合
…………………….☞List子接口:素有序、可重复的集合
…………………….☞Queue子接口:队列
★Map接口:
…………………….☞具有映射关系“key-value对”集合

JAVA集合继承树如下图:
Collecton集合体系继承树
这里写图片描述

2、Collection接口和Interator接口

Colletion接口时Set、Queue、List接口的父接口,所以该接口定义的方法,可以操作这三类集合。
这里写图片描述
测试代码如下:

package ThisIsACollection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class CollectionTest {
    public static void main(String[] args) {
        Collection actor=new ArrayList();
        Collection book=new HashSet();
        actor.add("John.Snow");
        actor.add("悟空");
        actor.add("八戒");
        System.out.println(actor.size());
        System.out.println(actor.contains("八戒"));
        /*调用了重写的toString方法
        (位于如下图的AbstractCollecton类中)*/
        System.out.println(actor);
        book.add("冰与火之歌");
        book.add("西游记");
        System.out.println(book.size());
        System.out.println(book.contains("红楼梦"));
        System.out.println(book);

    }
}

运行结果:
这里写图片描述
上面的程序创建了量Collection对象,一个是actor集合,另一个是book集合,其中actor集合是ArryList,而book集合是是HashSet.虽然他们的实现类不同,但当把他们当成Collection来使用时,使用方法Collection方法来操作它们,没有任何区别。
当使用System.out.println()输出集合对象时,将输出[e1,e2,e3…]形式,所有的Collection实现类都重写了,toString方法。


toString()在AbstractCollection类中重写了
这里写图片描述
重写代码如下

 /**
     collection.  
    * The string collection's elements in the
    * order they are returned by its iterator, 
    * enclosed in square brackets
    * (<tt>"[]"</tt>).  Adjacent elements are 
    * separated by the characters
 Elements are converted to strings as
    * by {@link String#valueOf(Object)}.
    *
    * @return a string representation of this collection
    */
    public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            /*e == this的作用。
            这里为什么要判断打印的内容是否为自己本身?
(this Collection)" : e);
        会调用e的toString函数来生成字符串,若不加判断,
        则会形成无限的toString递归调用。*/
        sb.append(e == this ? "(this Collection)" : e);
          if (! it.hasNext())
            return sb.append(']').toString();
           sb.append(',').append(' ');
        }
    }
}

2.1使用Lambda表达式遍历集合

示例代码如下

import java.util.Collection;
import java.util.HashSet;
public class CollectionEach {
    public static void main(String[] args) {
      Collection books=new HashSet();
      books.add("第一行代码");
      books.add("深入理解JAVA虚拟机");
      books.add("离散数学");
      books.forEach(obj-> System.out.println("迭代元素集合:"+obj));
    }
}


    java8为Iterable新增加了一个forEach(Consumer action)默认方法,该方法所需要的参数是一个函数式接口,而Iterable接口是Collection接口的父接口,因此Collection集合也可以直接调用此方法。
     当程序调用Iterable的forEach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accp(T t )方法(该接口中唯一的抽象方法)。正因为Consumer是函数式接口,因此可用Lambda表达式来遍历集合元素。


2.2 使用Java8增强的Iterator遍历集合元素


Iterator接口也是java集合框架的成员,但它与Collection和Map系列的集合不一样:
Itreator主要用来遍历(迭代访问)Collection集合中的元素。Itreator的对象也被称为迭代器。

import java.util.HashSet;
import java.util.Iterator;
public class ItreatorTest {
    public static void main(String[] args) {
        Collection books=new HashSet();
        books.add("第一行代码");
        books.add("深入理解JAVA虚拟机");
        books.add("离散数学");
        //获取books集合的迭代器
        Iterator it =books.iterator();
        while(it.hasNext()){
            String book=(String)it.next();
            System.out.println(book);
            if (book.equals("离散数学")) {
                it.remove();
            }
            /*使用Iterator对集合的元素进行遍历时
            * Iterator并不是把元素本身传给了迭代变量,
            * 而是把值传递给了迭代变量*/
            book="测试字符串";
        }
        System.out.println(books);
    }
}

2.3、使用Lambda表达式遍历Iterator

JAVA8新增了Iterator新增了一个forEachRemaining(Consumer action),该方法所需要的Consumer参数同样也是函数式接口。当程序调用Iterator的forEachRemaining(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的抽象方法)。

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("第一行代码");
        books.add("深入理解JAVA虚拟机");
        books.add("离散数学");
        Iterator it =books.iterator();
        it.forEachRemaining(obj-> System.out.println("迭代集合元素是"+obj));
    }
}

2.4、使用foreach循环遍历集合元素

import java.util.Collection;
import java.util.HashSet;
public class ForEachTest {
    public static void main(String[] args) {
        Collection books = new HashSet();
        books.add("第一行代码");
        books.add("深入理解JAVA虚拟机");
        books.add("离散数学");
        for (Object o: books) {
            String book =(String)o;
            System.out.println(book);
        }
        System.out.println(books);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值