前面介绍了List和Queue相关源码,这篇开始,我们先来学习一种java集合中的除Collection外的另一个分支------Map,这一分支的类图结构如下: 这里为什么不先介绍Set相关:因为很多Set实现类是通过对应的Map来实现,使用Map中key不能重复的特性,往Set中add元素的本质就是Map的put(),这里先介绍Map,后续介绍Set的时候再做具体介绍 首先,我们来看Map接口: /** Map将key映射到value(存储键值对); 一个map不能存在重复的key; 一个k…
AbstractSequentialList为顺序访问的list提供了一个骨架实现,使实现顺序访问的list变得简单; 我们来看源码: /** AbstractSequentialList 继承自 AbstractList,是 List 接口的简化版实现.只支持按顺序访问,而不像 AbstractList 那样支持随机访问. 如果要支持随机访问,应该继承自AbstractList; 想要实现一个支持按次序访问的List的话,只需要继承该类并实现size()和listIterator()方法; 如…
最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻,且在网上找了半天没有找到太好的关于容器类细节的讲解(其中找到一些博客,讲得很好,但是其中还是有些东西没有触碰到我原来的理解痛点),还是决定自己写一个Java容器解析系列. <Java编程思想>书中对容器进行完整的类关系图如下: 官方文档:Java Collection Framework 本系列将…
Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ var array = [1,2,3,4,5,6,7,8,9]; var filterarray = $.grep(array,function(value){ return value > 5;//筛选出大于5的 }); for(var i=0;i<filterarray.length;i++){…
本篇我们来介绍一个最常用的Map结构--HashMap 关于HashMap,关于其基本原理,网上对其进行讲解的博客非常多,且很多都写的比较好,所以.... 这里直接贴上地址: 关于hash算法: Hash算法 Hash时取模一定要模质数吗? 关于HashMap: 深入Java集合学习系列:HashMap的实现原理 漫画:什么是HashMap? JDK 源码中 HashMap 的 hash 方法原理是什么? What is the use of Holder class in HashMap?(H…
集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection 接口 Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素(Elements).一些 Collection 允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK 不提…
关于WeakHashMap其实没有太多可说的,其与HashMap大致相同,区别就在于: 对每个key的引用方式为弱引用; 关于java4种引用方式,参考java Reference 网上很多说 弱引用指向 Entry,这种说法是完全错误的 在key被回收时,对应的value并没有回收,只有在调用WeakHashMap的方法时才会回收value; 具体请看下列源码解析: /** * 数据结构原理几乎与HashMap一致; * WeakHashMap 不会阻止Entry.key被回收; * Weak…
IdentityHashMap,使用什么的跟HashMap相同,主要不同点在于: 数据结构:使用一个数组table来存储 key:value,table[2k] 为key, table[2k + 1] 为value,也即: key:value ==> table[2k]:table[2k + 1](HashMap使用数组 + 链表); IdentityHashMap 中的 key 和 value 通过==来比较是否相等(HashMap通过equals()); IdentityHashMap 中的…
ArrayDeque,从名字上就可以看出来,其是通过数组实现的双端队列,我们先来看其源码: /** 有自动扩容机制; 不是线程安全的; 不允许添加null; 作为栈使用时比java.util.Stack快; 作为队列使用时比LinkedList快; 支持fast-fail; * @since 1.6 */ public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Clone…
PriorityQueue:优先级队列; 在介绍该类之前,我们需要先了解一种数据结构--堆,在有些书上也直接称之为优先队列: 堆(Heap)是是具有下列性质的完全二叉树:每个结点的值都 >= 其左右子结点的值,称为最大堆(Max Heap,或称大顶堆);每个结点的值都 <= 其左右子结点的值,称为最小堆(Min Heap,或称小顶堆): Note:上述定义摘自<大话数据结构>,其定义并不是很准确,堆有很多种,完全二叉树只是其一种实现方式,也是最常见的一种实现方式.在<数据结构…
首先我们来看一下Queue接口: /** * @since 1.5 */ public interface Queue<E> extends Collection<E> { // 添加指定元素,在添加失败时(队列满),抛出IllegalStateException boolean add(E e); // 添加指定元素,在添加失败时(队列满),返回false boolean offer(E e); // 删除并返回头部,当队列为空时,抛出NoSuchElementException…
ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这里直接将收藏的博客列出来: 从源码角度彻底搞懂ArrayList 这篇博客的重要内容包括: 1. ArrayList使用的数据结构; 2. ArrayList的增删改查实现方式和时间复杂度分析; 3. ArrayList的自动扩容机制; 4. ArrayList的随机访问特性; 5. ArrayLi…
做为数据结构学习的常规,肯定是先学习线性表,也就是Java中的List,开始 Java中List相关的类关系图如下: 此篇作为对Java中相关类的开篇.从上图中可以看出,List和AbstractList是表的具体实现类的抽象. 首先我们来看一下List接口: /** list 表示一个序列,与Set不同,list通常允许重复元素和null; list还提供了一个特别的迭代器,ListIterator,其允许对元素进行插入和替换,并且允许双向的查询; 因为可以向list中添加自身,这时就需要注意…
在之前讲LinkedHashMap的时候,我们说起可以用来实现LRU(least recent used)算法,接下来我看一下其中的一个具体实现-----android sdk 中的LruCache. 关于Lru算法,请参考漫画:什么是LRU算法? talk is cheap, I am gonna show you something really expensive. package android.util;// 该类是从Android sdk 中摘录 public class LruCa…
LinkedHashMap继承自HashMap,除了提供HashMap的功能外,LinkedHashMap还是维护一个双向链表(实际为带头结点的双向循环链表),持有所有的键值对的引用: 这个双向链表定义了迭代器的迭代顺序,默认按插入顺序迭代; 也可以在构造时设置为按照LRU方式(访问顺序)迭代(from least-recently accessed to most-recently access-order),最近最少访问的键值对放在链表最前(头结点之后的第一个结点); 废话不多说,直接看源码…
在Java中,对于所有的Collection,都有一个特性,可以通过迭代器来遍历和删除其中的元素,因为Collection接口继承自Iterable接口. public interface Collection<E> extends Iterable<E> Iterable接口中只有一个方法: /** 该接口的实现类可以被用于"foreach"语句 * @since 1.5 */ public interface Iterable<T> { // 返…
HashTable的实现原理与HashMap没有什么区别; 其与HashMap的主要区别如下: 添加进入jdk时间:HashTable在jdk1.0时添加,HashMap在jdk1.2时添加; 类签名:两者都实现了Map接口,但是HashMap继承自AbstractMap,HashTable继承自Dictionary; HashMap允许key和value为null,HashTable不允许key和value为null; HashMap不是线程安全的,HashTable线程安全,每个方法要么是s…
HashMap的缺点: 自动装箱导致的性能损失; 使用拉链法来解决hash冲突,如果hash冲突较多,需要遍历链表,导致性能下降,在Java 8 中,如果链表长度>8,会使用红黑树来代替链表; 由于loadFactor的存在,导致(1 - loadFactor) * capacity 的空间会浪费,capacity越大,浪费空间更多; 扩容时需要重新计算hash,浪费性能; 每一个value都由一个Node保存,Node除了保存本身的数据外,还需要其他冗余数据,如hash值,下一个节点的指针等;…
Comparable和Comparator接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到. 关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接口的区别,直接看源码即可: package java.lang; // 在java.lang包下 /** * 该接口的实现类: * 1. 本身具有排序的能力,我们称之为该类的自然排序,其compareTo()方法就称为该类的自然排序方法; * 2. 数组或List,可以使用Collections.s…
在通向具体化的List,Queue之前,我们需要先了解一下Collection接口和AbstractCollection抽象类,这两个都是处于Collection顶层的存在. Collection接口,是Collection hierarchy的根接口,我们来看其定义了哪些必须实现的方法: /** Collection接口,是CollectionC hierarchy的根接口. 一个Collection表示一些元素对象的聚集; 一些Collection的实现类允许重复的元素对象,另一些不允许:…
本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubelet 会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态:第二,当很多容器在同一Pod中运行的时候,很多时候需要数据文件的共享.Kubernete Volume解决了这个问题. 1.2 介绍 Docker有一个Volumes的概念,虽然这个Volume有点宽松和管理性比较小.在Docker中…
流的概念 JAVA程序通过流来完成输入/输出.流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式.这样就意味一个输入流能够抽象多种不同类型的输入:从磁盘文件.从键盘或从网络套接字:同样,一个输出流可以输出到控制台.磁盘文件或相连的网络. 在我们平时接触的输入/输出流中,有这样一个概念必须要弄明白,何谓输入.何谓输出?讨论这个问题的前提是要知道以什么为参考物,这个参考物就是程序或者内存.输入:就是从磁盘文件或者网络等外部的…
一.参考其他资料即可.可以采用haproxy+apache+horizon方式部署,haproxy/httpd支持ssl.…
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer java基础解析系列(三)---HashMap 这是我的博客目录,欢迎阅读 实验 遍历HashMap public static void main(String[] args) { Map<String, String> map=new HashMap<St…
java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 java基础解…
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMa…
java基础解析系列(二)---Integer 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bug的时候,才能处理更加从容. 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder 这是我的博客目录,欢迎阅读 自动装箱和拆箱 装箱就是自动将基本数据类型装换为包装器类型,拆箱就是自动将包装器类型转换为基本数据类型. Integer i=666;//装箱 int n=i;//拆箱 分析 privat…
java基础解析系列(三)---HashMap java基础解析系列 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer java基础解析系列(三)---HashMap 这是我的博客目录,欢迎阅读 基本概念 节点: Node<Key,Value>,存放key和value static class Node<K,V> implements Map.Entry<K,V> { fi…
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接如下,可点击跳转: 链接:https://blog.csdn.net/pjh88/article/details/107166950 什么是数组与动态数组? 数组 数组是相同数据类型的元素按照一定的顺序排列的集合,若将有限个类型相同的变量的集合命名,那么这个名称称为数组名,组成数组的各个变量称为数组…
1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种方法:正则和字符串切片函数split(). 2.测试场景 宏哥在这里说一下,自己的胡诌的测试场景哈,然后按照宏哥说的进行自动化测试,测试场景:在度娘或者其他搜索引擎中搜索"北京宏哥",然后搜索完毕,会返回搜索结果,告诉你搜索到多少个"北京宏哥".宏哥这里分别用度娘和必应…