数组与集合
①存储对象:数组(基本类和引用类型)
……………….集合(引用类型)
②数组声明了它容纳的元素的类型,而集合不声明
数组的存放的类型只能是一种,集合存放的类型可以不是一种(不加泛型时添加的类型是Object);
1、概述
JAVA的集合类主要由:Collection和Map两个接口接口派生而出。也因此JAVA的集合可分为Collection和Map种体系
★Collection接口:
…………………….☞Set子接口: 元素无序、不可重复的集合
…………………….☞List子接口:素有序、可重复的集合
…………………….☞Queue子接口:队列
★Map接口:
…………………….☞具有映射关系“key-value对”集合
JAVA集合继承树如下图:
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);
}
}