他的回复:
华为云账号:cqy_self+ 第六周笔记第一章 Java集合Collection接口及List子类1、集合框架简介1.1、简介集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程安全的集合类位于java.utilL.concurrent包下。Java集合类主要由两个根接口Collection和Map派生出来的。1.1.2 Collection接口单个对象保存的最顶层父接口Collection接口以及其子接口,在每次进行数据操作时只能对单个对象进行处理。Collection接口的定义如下:public interface Collection extends IterableInterable:迭代器接口(就是为了遍历集合)Interator iterator();(取得集合的迭代器,JDK1.5之前直接写在Collection接口中)从JDK1.5开始Collection接口追加了泛型应用,可以直接避免ClassCastException。核心方法:向集合中添加数据:public boolean add(E e);取得Iterator接口对象,用于集合输出:public Iterator iteratorCollection派生出了三个子接口:List、Set、Queue ( Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。1.1.3 List接口在进行单个集合处理的时候,优先考虑List接口。核心方法:根据索引取得保存数据:public E get(int index);修改数据:public E set(int index,E element);List子接口与Collection接口相比,最大的特点在于其有一个get()方法,可以根据索引取得内容。由于List本身还是接口,要想取得接口的实例化对象,就必须有子类,在List接口下有三个常用的子类:ArrayList , Vector , LinkedList;集合类的继承体系:1.2集合和数组的区别数组声明了它容纳的元素的类型,而集合不声明。数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。数组的存放的类型只能是一种(基本类型/引用类型)。集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。1.3 Collections工具类Collections是一个操作Set、List和Map等集合的工具类。Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。Collections中常用方法,都是静态方法reverse(List)︰反转List中元素的顺序。shuffle(List):对List集合元素进行随机排序。sort(List)︰根据元素的自然顺序对指定List集合元素按升序排序。swap(List,int,int)︰将指定list集合中的i处元素和j处元素进行交换。int frequency(Collection,Object):返回指定集合中指定元素的出现次数。void copy(List dest,List src)︰将src中的内容复制到dest中。boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值。 第二章 Java集合Collection接口及Set子类1. Set接口和简介set接口继承自Collection接口,但是并没有对方法进行扩充,是Collection的子接口。Set接口中元素无序,并且会对元素进行对比,保证存入的元素不出现重复。Set接口不允许重复元素,最多包含一个null。Set接口的遍历方式:使用迭代器或增强for循环。set接口主要有两个实现类,分别是HashSet和TreeSet。2、HashSet子类和APIHashSet是Set接口的一个实现类,它不保证Set的迭代顺序,无序存放。Set接口的唯一性:底层依赖于hashCode()和equals()方法。2. HashSet子类和APIHashSet是Set接口的一个实现类,它不保证Set的迭代顺序,无序存放。Set接口的唯一性:底层依赖于hashCode()和equals()方法。3.TreeSet子类和APITreeSet是set接口的一个实现类,主要作用是对象的排序及确定存入对象的唯一性。TreeSet中的元素支持2种排序方式:第一种:自然排序,在元素中定义排序规则。元素自身具有比较性,实现Comparable接口,重写compareTo方法第二种:比较器排序,创建TreeSet时提供Comparator进行排序。实现Comparator接口,实现compare方法。4. Set与List接口及其子类的异同List集合中的元素可重复,Set集合中的元素不可重复。List集合中的元素有序的,Set集合中的元素是无序。List中最常用的两个子类: ArrayList和LinkedList。Set中最常用的两个子类:HashSet和TreeSet。第三章 Java集合Map接口及子类1. Map接口和简介1.1 定义Map集合中存储的元素是一组键值对象,是key与value是一个映射。Map提供了一个更通用的元素存储方法,每个键映射有一个值。Map集合中一个key对应一个value,不能存在相同的key值,value值可以相同。key和value之间存在单向一对一关系,即通过指定的key总能找到唯一确定的value。Map接口的常用实现类有:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap。1.2 Map集合和Collection集合区别:① Map集合存储元素是成对出现的,也就是键值对出现,而且键是不可以重复的。② Collection集合存储元素是一个一个存储的,也就是单一存储的。第四章 Java集合队列1. Queue队列机制1.1 定义队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端。队列:先进先出;队头删除,队尾插入。属性:队头指针front,队尾指针rear。方法:入列enQueue,出列deQueue,判断是否为空isEmpty,判断是否已满isFull,清空makeEmpty,返回元素个数size。1.2 Java中的Queue的实现有三种方式:阻塞队列:阻塞队列是一个可以阻塞的先进先出集合,比如某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。非阻塞队列:非阻塞队列是使用CAS( compare and set)机制实现,并发性能好。双端队列(Deque):Deque是一个既可以在头部操作元素,又可以为尾部操作元素,俗称为双向队列。2. Queue队列之阻塞队列ArrayBlockingQueue基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。ArrayBlockingQueue可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。ArrayBlockingQueue常用方法:put方法用来向队尾存入元素,如果队列满,则等待。take方法用来从队首取元素,如果队列为空,则等待。offer方法用来向队尾存入元素,如果队列满,则等待一定的时间,当时间期限达到时,如果还没有插入成功,则返回a1se;否则返回true 。poll方法用来从队首取元素,如果队列空,则等待一定的时间,当时间期限达到时,如果取不到,则返回null;否则返回取得的元素。3. Queue队列之优先级队列PriorityQueue优先级队列既可以根据元素的自然顺序来排序,也可以根据Comparator来设置排序规则。PriorityQueue优先级队列对于自定义的类来说,需要自定义比较器。PriorityQueue优先队列的大小是不受限制的,但在创建时可以指定初始大小。当我们向优先队列增加元素的时候,队列大小会自动增加。PriorityQueue优先队列不允许空值。PriorityQueue是非线程安全的,所以Java提供了PriorityBlockingQueue在多线程环境使用。4.Queue队列之延时队列DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。不能将null元素放置到DelayQueue队列中。DelayQueue只能添加(offer/put/add)实现了Delayed接口的对象。第五章 Java Stream1.Stream概述流Stream是数据渠道,用于操作数据源集合、数组等所生成的元素序列。集合讲的是数据,流讲的是计算。Stream不是数据结构,不会保存数据。Stream不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。Stream是惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。2. Stream的操作流程和创建Stream操作的三个步骤:创建Stream:一个数据源(集合、数组),获取一个流。中间操作:一个中间操作链,对数据源的数据进行处理。③终止操作:一个终止操作,执行中间操作链。并产生结果。3.Stream中间操作中间操作:中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。中间操作目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的,就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。 4.Stream的串行流和并行流Stream的串行流:所有的collection集合都可以通过stream默认方法获取流: list.stream();Stream接口的静态方法of可以获取数组对应的流:Stream.of(6,1,5,4,3);Stream的并行流:并行流是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流规约成一个value的规约操作。