03Java标准集合类
文章
01 Java数据结构
数据结构1 线性数据结构数据存储的常用结构有:栈、队列、数组、链表和红黑树。我们分别来了解一下: 栈 栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 简单的说:采用该结构的集合,对元素的存取有如下的特点 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。 栈的入口、出口的都是栈的顶端位置。 这里两个名词需要注意: 压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。 弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。 队列 队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。 简单的说,采用该结构的集合,对元素的存取有如下的特点: 先进先出(即,存进去的元素,要在后它前面的元素依次取出后...
02 集合底层结构
Java 容器一、概览容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection单列集合 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 LinkedHashSet:具有 HashSet 的查找效率,并且内部使用双向链表维护元素的插入顺序。 2. List ArrayList:基于动态数组实现,支持随机访问。 Vector:和 ArrayList 类似,但它是线程安全的。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。...
03 List
List 接口0 概述简介List 接口和 Set 接口齐头并进,是我们日常开发中接触的很多的一种集合类型了。整个 List 集合的组成部分如下图 List 接口直接继承 Collection 接口,它定义为可以存储重复元素的集合,并且元素按照插入顺序有序排列,且可以通过索引访问指定位置的元素。常见的实现有:ArrayList、LinkedList、Vector和Stack AbstractList 和 AbstractSequentialListAbstractList 抽象类实现了 List 接口,其内部实现了所有的 List 都需具备的功能,子类可以专注于实现自己具体的操作逻辑。 12345// 查找元素 o 第一次出现的索引位置public int indexOf(Object o)// 查找元素 o 最后一次出现的索引位置public int lastIndexOf(Object o)//··· AbstractSequentialList 抽象类继承了 AbstractList,在原基础上限制了访问元素的顺序只能够按照顺序访问,而不支持随机访问,如果需要满足随机...
04 Queue
Queue0 Queue介绍主要方法Queue队列,在 JDK 中有两种不同类型的集合实现:单向队列(AbstractQueue) 和 双端队列(Deque) Queue 中提供了两套增加、删除元素的 API,当插入或删除元素失败时,会有两种不同的失败处理策略。 方法及失败策略 插入方法 删除方法 查找方法 抛出异常 add() remove() get() 返回失败默认值 offer() poll() peek() 选取哪种方法的决定因素:插入和删除元素失败时,希望抛出异常还是返回布尔值 add() 和 offer() 对比: 在队列长度大小确定的场景下,队列放满元素后,添加下一个元素时,add() 会抛出 IllegalStateException异常,而 offer() 会返回 false 。 但是它们两个方法在插入某些不合法的元素时都会抛出三个相同的异常。 remove() 和 poll() 对比: 在队列为空的场景下, remove() 会抛出 NoSuchElementException异常,而 poll() 则返回 null 。 get()和...
05 Set
0 Set 接口Set接口Set接口继承了Collection接口,是一个不包括重复元素的集合,更确切地说,Set 中任意两个元素不会出现 o1.equals(o2),而且 Set 至多只能存储一个 NULL 值元素,Set 集合的组成部分可以用下面这张图概括: 在 Set 集合体系中,我们需要着重关注两点: 存入可变元素时,必须非常小心,因为任意时候元素状态的改变都有可能使得 Set 内部出现两个相等的元素,即 o1.equals(o2) = true,所以一般不要更改存入 Set 中的元素,否则将会破坏了 equals() 的作用! Set 的最大作用就是判重,在项目中最大的作用也是判重! 接下来我们去看它的实现类和子类: AbstractSet 和 SortedSet AbstractSet 抽象类AbstractSet 是一个实现 Set 的一个抽象类,定义在这里可以将所有具体 Set 集合的相同行为在这里实现,避免子类包含大量的重复代码 所有的 Set 也应该要有相同的 hashCode() 和 equals() 方法,所以使用抽象类把该方法重写后,子类无需关...
06 Map
0 Map 集合体系详解Map接口是由<key, value>组成的集合,由key映射到唯一的value,所以Map不能包含重复的key,每个键至多映射一个值。下图是整个 Map 集合体系的主要组成部分,我将会按照日常使用频率从高到低一一讲解。 不得不提的是 Map 的设计理念:定位元素的时间复杂度优化到 O(1) Map 体系下主要分为 AbstractMap 和 SortedMap两类集合 AbstractMap是对 Map 接口的扩展,它定义了普通的 Map 集合具有的通用行为,可以避免子类重复编写大量相同的代码,子类继承 AbstractMap 后可以重写它的方法,实现额外的逻辑,对外提供更多的功能。 SortedMap 定义了该类 Map 具有 排序行为,同时它在内部定义好有关排序的抽象方法,当子类实现它时,必须重写所有方法,对外提供排序功能。 1 HashMap底层原理HashMap 是一个最通用的利用哈希表存储元素的集合,将元素放入 HashMap 时,将key的哈希值转换为数组的索引下标确定存放位置,查找时,根据key的哈希地址转换成数组的索引下标确...
07 Iterable&Ieterator
Iterator Iterable ListIterator1 Iterator所有Java集合类都提供iterator()方法,该方法返回Iterator的实例以遍历该集合中的元素。 12345public interface Iterator<E> { boolean hasNext(); E next(); void remove();} 提供的API接口含义如下: hasNext():判断集合中是否存在下一个对象 next():返回集合中的下一个对象,并将访问指针移动一位 remove():删除集合中调用next()方法返回的对象.每次调用next()只能调用一次此方法。 在早期,遍历集合的方式只有一种,通过Iterator迭代器操作 12345678910List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Iterator iter = list.iterator();while (iter....
08 Comparable&Comparator
Comparable概述Java Comparable接口,用于根据对象的natural order对array或对象list进行natural order 。 元素的自然排序是通过在对象中实现其compareTo()方法来实现的。 1234public interface Comparable<T> { public int compareTo(T o);} 使用123456789101112131415import java.time.LocalDate; public class Employee implements Comparable<Employee> { private Long id; private String name; private LocalDate dob; @Override public int compareTo(Employee o) { return this.getId().compareTo( o.g...
09 Sort
1 数组排序Arrays.sortJava程序使用Arrays.sort()方法升序排序 12345678910111213141516import java.util.Arrays; public class JavaSortExample { public static void main(String[] args) { //Unsorted array Integer[] numbers = new Integer[] { 15, 11, 9, 55, 47, 18, 520, 1123, 366, 420 }; //Sort the array Arrays.sort(numbers); //Print array to confirm System.out.println(Arrays.toString(numbers)); }} 逆序1234567Integer...
10 Stream
Java 8 数据流教程1 数据流原理基本原理 数据流和输入输出流不同这个示例驱动的教程是Java8数据流(Stream)的深入总结。当我第一次看到StreamAPI时,我非常疑惑,因为它听起来和Java IO的InputStream 和 OutputStream一样。但是Java8的数据流是完全不同的东西。 在函数式编程中,单体是一个结构,表示定义为步骤序列的计算。单体结构的类型定义了它对链式操作,或具有相同类型的嵌套函数的含义。 数据流的链式操作数据流表示元素的序列,并支持不同种类的操作来执行元素上的计算: 123456789List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");myList .stream() .filter(s -> s.startsWith("c")) .map(String::toUpperCase) ....













