集合概述
为了保存数量不确定的数据,以及保存具有映射关系的数据,java提供了集合类。集合类主要负责保存,盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于 java.util 包下,后来为了处理多线程环境下的并发安全问题,Java5还在java.util.concurrent 包下提供了一些多线程支持的集合类。
集合类和数组不一样,数组元素即可以是基本数据类型,也可以是对象(实际上保存的是对象的应用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的对象)
java的集合类有两个接口派生而出: Collection和 Map,
Collection下面有Set(无序集合,元素不可重复),Queue(队列),List(有序集合,元素可以集合)。
Set :EnumSet,SortedSet(TreeSet), HashSet(LinkedHashSet)
Queue : Deque(ArrayDeque, LinkedList), Priority
List :ArrayList, Vector(Stack)
public class CollectionTest {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("孙悟空");
c.add(6);
System.out.println("c元素的集合个数为: "+c.size());
c.remove(6);
System.out.println("c元素的集合个数为: "+c.size());
System.out.println("c集合是否包含孙悟空字符串: "+c.contains("孙悟空"));
c.add("轻量级Java EE企业应用实战");
System.out.println("c集合里的元素为: "+c);
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂java讲义");
System.out.println("c集合是否完全包含books集合?"+c.containsAll(books));
c.removeAll(books);
System.out.println("c集合里面的元素 "+c);
c.clear();
System.out.println("c集合的元素: "+c);
books.retainAll(c);
System.out.println("books集合的元素: "+books);
}
}
使用Lambda表达式遍历集合
java8 为Iterable接口新增了一个forEach默认方法,该方法所需参数的类型是一个函数式接口,而Iterable 接口时Collection的父接口。因此Collection集合也可以直接调用该方法。
public class CollectionEach {
public static void main(String[] args) {
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java 讲义");
books.add("疯狂Android讲义");
books.forEach(obj->{
System.out.println("迭代集合元素: "+obj);
});
}
}
使用 java8 增强的Iterator遍历集合元素
Iterator接口也是java集合框架的成员,但它与Collection系列,Map系列的集合不一样: Collection系列集合,Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
public class IteratorTest {
public static void main(String[] args) {
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
Iterator it = books.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
}
使用Lambda 表达式遍历 Iterator
public class IteratorEach {
public static void main(String[] args) {
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
Iterator it = books.iterator();
it.forEachRemaining(obj -> System.out.println("迭代集合元素: "+obj));
}
}
使用foreach 循环遍历集合元素
public class ForeachTest {
public static void main(String[] args) {
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
for (Object book : books) {
System.out.println(book);
}
}
}
使用java8新增的Predicate 操作集合
java8起Collection集合新增了一个removelf方法,该方法将会批量删除符合filter条件的所有元素
public class ForeachTest {
public static void main(String[] args) {
Collection books = new HashSet();
books.add(new String("轻量级Java EE企业应用实战1"));
books.add(new String("轻量级Java EE企业应用实战2"));
books.add(new String("轻量级Java EE企业应用实战3"));
books.add(new String("轻量级Java4"));
books.add(new String("轻量级Java5"));
books.add(new String("轻量级Java6"));
books.add(new String("轻量级Java7"));
books.add(new String("轻量级Java8"));
books.add(new String("轻量级Java9"));
books.removeIf(ele->((String)ele).length()<10);
System.out.println(books);
}
}
使用java8新增的 Stream 操作集合
public class IntStreamTest {
public static void main(String[] args) {
IntStream is = IntStream.builder()
.add(20)
.add(13)
.add(-2)
.add(18)
.build();
System.out.println("is所有元素的最大值: "+is.max().getAsInt());
System.out.println("is所有的元素的平方是否都大于20: "+is.allMatch(els->els*els >20));
is.forEach(System.out::println);
}
}