Java集合学习笔记(一)—— Java集合是什么

由来

面向对象语言对事物的描述是通过对象来体现的,为便于处理对象
==》用容器存储对象【字符串(str)、列表(list)、元祖(tuple)、字典(dict)、集合(set)】总结_容器型数据类型 & 容器类型数据

数组是一种存储同一数据类型(基本类型数据)的多个元素的容器,数据多了我们可以用数组存储;那么对象多了,也不知道需要多少数量的对象(非固定长度)
==》Java就提供了集合以便使用,用集合存储对象的引用
数组是固定长度的,集合是可变长度的;集合是:只要是对象就可以存,不管是不是同一种对象;而数组只能存储一种类型的对象。

常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。

是什么

  1. 集合类存放于 java.util 包中,是一个用来存放对象的容器,准确的说是存放数据对象引用的容器
  2. 集合类型主要有3种:set(集)、list(列表)和map(映射)。
  3. 只能存放对象,不能存放int(基本数据类型)等类型,存的是对应的是Integer(int的包装类)等对象。
  4. 集合存放的都是对象的引用,而非对象本身,对象本身是放在堆内存中。所以我们称集合中的对象就是集合中对象的引用。
  5. 可以存放不同类型的对象(因为实现的时候使用了泛型),不建议使用。
    在这里插入图片描述

Java 集合框架

Java 集合框架主要结构图
Java 集合框架主要结构图

   发现一个特点,上述所有的集合类,除了map系列的集合,即左边的集合都实现了Iterator接口。
   Iterator是一个用来遍历集合中元素的接口,主要有hashNext(),next(),remove()三种方法。
   它的子接口ListIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。

从图中我们可以看到:

  1. 集合主要分为Collection和Map两个接口。
  2. Collection又分别被List和Set继承。
  3. List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和VectorList。
  4. Set被AbstractSet实现,又分为2个子类,HashSet和TreeSet。
  5. Map被AbstractMap实现,又分为2个子类,HashMap和TreeMap。
  6. Map被Hashtable实现。

List:继承自Collection。可以存在相同的对象,有序的。具体实现类有ArrayList,LinkedList,Vector等(已经被废弃,很少使用)。
Set:继承自Collection。不能存在相同的对象,无序的,就是数学意义上的集合。具体实现类有HashSet,LinkedHashSet,TreeSet等。
Map:以键值对的形式存放对象。key-value。一般是key为String类型,value为Object的类型。具体实现类有HashMap,LinkedHashMap,TreeMap等。

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象。
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
集合框架体系:
集合框架体系
Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。

具体接口、实现类、算法

Iterator接口

【JDK1.8】JDK1.8集合源码阅读——总章

public interface Iterator<E> {
  boolean hasNext();
  E next();
  default void remove() { // 此方法可用于在迭代中删除结合中的元素,如果不用Iterator,在list循环中使用remove会抛异常。
    throw new UnsupportedOperationException("remove");
  }
  /**
  * 举个简单例子(把集合里的元素每个都输出出来):
  * List<String> names = new ArrayList<>();
  * names.add("Joemsu");
  * names.add("GodnessY");
  * names.iterator().forEachRemaining(c -> System.out.println("hi! " + c));
  */
  default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
      action.accept(next());
  }
}

Collection接口

Collection接口是层次结构中的根接口。构成Collection的单位成为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List、Set是通用。

public interface Collection<E> extends Iterable<E> {  
  int size(); // 若size超过Integer.MAX_VALUE也只会返回Integer.MAX_VALUE
  boolean isEmpty(); 
  boolean contains(Object o); //如果向集合里添加null,使用contains(null),也可以返回true
  Iterator<E> iterator();
  /**
   * 深层拷贝,修改数组的数据不会对集合里的元素产生影响。
   * 注意:只能返回Object[],不能强制转换其他类型,如需要转型,使用下面带泛型的方法。
   */
  Object[] toArray();
  <T> T[] toArray(T[] a);
  boolean add(E e);
  boolean remove(Object o);
  boolean containsAll(Collection<?> c);
  boolean addAll(Collection<? extends E> c);
  boolean removeAll(Collection<?> c); 
  boolean retainAll(Collection<?> c); //保留c集合里的元素
  void clear();
  boolean equals(Object o); 
  int hashCode(); //如过a.equals(b),则hashCode()肯定相同,反之不一定
   
  @Override
  default Spliterator<E> spliterator() { //针对parallelStream()添加的方法,用于分割集合,进行并行处理
    return Spliterators.spliterator(this, 0);
  }
  
  /**
  * 如果满足filter,则删除,举个栗子:
  * Collection<String> myHeart = new ArrayList<>();
  * myHeart.add("Boduolaoshi");
  * myHeart.add("GodnessY");
  * System.out.println("before: " + myHeart.size());
  * myHeart.removeIf(s -> s.equals("Boduolaoshi"));
  * System.out.println("after: " + myHeart.size());
  */
  default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
    while (each.hasNext()) {
      if (filter.test(each.next())) {
        each.remove();
        removed = true;
      }
    }
    return removed;
  }
  
  default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
  }
  
  default Stream<E> parallelStream() { //采用并行处理,使用多核cpu的特性
    return StreamSupport.stream(spliterator(), true);
  }
}

常用方法

boolean add(Object o):添加对象到集合
boolean remove(Object o):删除指定的对象
int size():返回当前集合中元素的数量
boolean contains(Object o):查找集合中是否有指定的对象
boolean isEmpty():判断集合是否为空
Iterator iterator():返回一个迭代器

在这里插入图片描述

遍历集合

Collection集合的遍历通常通过迭代器iterator实现。

//导入java.util包
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class collection {
	public static void main(String[] args) {
		Collection<String> list = new ArrayList<>(); //实例化集合对象
		list.add("A"); //向集合中添加数据
		list.add("B");
		list.add("C");
		Iterator<String> ite = list.iterator(); //创建迭代器
		while(ite.hasNext()) { //是否还有下一个元素
			String str = (String) ite.next(); //获取集合中元素
			System.out.println(str);
		}
	}
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值