他的回复:
华为云ID :sinslu 第六周笔记一、Collection接口之List1、集合框架简介集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程安全的集合类位于java.utilL.concurrent包下。Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue ( Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。List代表了有序可重复集合,可直接根据元素的索引来访问; set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。2、List接口List是有序集合,可以通过下标访问集合中的元素。List允许重复值,允许有多个null值。List接口是Collection接口的子类。List的实现类有LinkedList、ArrayList、Vector、Stack。3、ArrayList子类ArrayList是List接口的常用实现类,底层采用数组实现,其容量能自动增长。ArrayList特点是随机访问速度快,插入和移除性能较差。ArrayList支持null元素、有序、元素可以重复、线程不安全4、LinkedList子类LinkedList底层的数据结构是基于双向循环链表。LinkedList是有序,可以重复,非同步的。LinkedList最经常使用的两种数据结构:栈和队列。LinkedList。LinkedList和ArrayList区别:时间复杂度:对于随机访问,ArrayList通过索引快速定位元素位置,而LinkedList需要对列表中元素挨个查找,所以ArrayList快于LinkedList。对于删除插入操作,ArrayList需要对数组重新排序,而且在数组装满的时候要将所有的数据重新装入一个新的数组,LinkedList只需添加一项Entry对象,所以LinkedList快于ArrayList。空间复杂度:LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。5、Vector子类Vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。Vector集合也是以o开始的下标表示元素的位置。当Vector对象创建后,数组的元素个数会随着Vector集合中元素个数的增大和缩小而自动变化。Vector类中的大多数方法是同步的,使用synchronized修饰的,Vector是线程安全的。6、Stack栈和操作Stack是栈,它的特性是:先进后出,后进先出。Java工具包中的Stack是继承于Vector的,意味着Vector拥有的属性和功能,Stack都拥有。Stack底层实际上也是通过数组去实现的,具体操作如下:执行push时(将元素推入栈中),是通过将元素追加的数组的末尾中。执行peek时(取出栈顶元素,不执行删除),是返回数组末尾的元素。执行pop时(取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。7、Collections工具类Collections是一个操作Set、List和Map等集合的工具类。Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。Collections中常用方法,都是静态方法二、Collection接口之Set1、Set接口和简介set接口继承自Collection接口,但是并没有对方法进行扩充,是Collection的子接口。Set接口中元素无序,并且会对元素进行对比,保证存入的元素不出现重复。Set接口不允许重复元素,最多包含一个null。Set接口的遍历方式:使用迭代器或增强for循环。set接口主要有两个实现类,分别是HashSet和TreeSet。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。List中提供索引的方式来添加元素和获取元素,Set只能一个一个的比较,显然效率和实用性是比不上List集合的。三、Map1、Map接口和简介Map集合中存储的元素是一组键值对象,是key与value是一个映射。Map提供了一个更通用的元素存储方法,每个键映射有一个值。Map集合中一个key对应一个value,不能存在相同的key值,value值可以相同。key和value之间存在单向一对一关系,即通过指定的key总能找到唯一确定的value。Map接口的常用实现类有:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMapMap集合和Collection集合区别:Map集合存储元素是成对出现的,也就是键值对出现,而且键是不可以重复的。Collection集合存储元素是一个一个存储的,也就是单一存储的。2、HashMap子类HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap由数组+链表组成的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即同一时刻可以有多个线程同时操作HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。3、LinkedHashMap子类LinkedHashMap是链表和哈希表组合的一个数据存储结构。LinkedHashMap存储数据是有序的。LinkedHashMap是线程不安全的。4、ConcurrentHashMap子类ConcurrentHashMap底层采用数组+链表+红黑树的存储结构。ConcurrentHashMap 的key和value都不能为空。ConcurrentHashMap 线程是安全的,支持高并发操作。ConcurrentHashMap采用分段锁技术有效提升并发访问效率。5、Hashtable子类Hashtable是线程同步安全的。Hashtable的键和值不能为null。四、队列1、Queue队列机制队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端。队列:先进先出;队头删除,队尾插入。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接口的对象。五、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的并行流:并行流是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。