java基础
文章平均质量分 75
蛙广志
定位抖音直播 server,有需要可以私聊内推
展开
-
【集合-HashMap】手撕HashMap源码,带你一行一行分析,全面且深入,全程干货!
本文全程硬核~!带你深入底层,一行行分析HashMap,由于篇幅可能过程,本文先介绍学习HashMap的前置知识,考虑到全文篇幅过长影响阅读体验,所以将文章分为以下部分:HashMap的一些概念和底层结构HashMap底层是由哈希表存储数据1.要说哈希表,我们先从数组和链表说起:老生常谈了,简单来说就是数组查询快,链表增删快,那有没有一种结构结合两种数据结构的优点,查询快,增删也快?有,那就是哈希表2.哈希表张啥样?table中的每个元素也是链表的头节点,所以哈希表=数组+链表3.HashM原创 2021-04-04 15:41:44 · 171 阅读 · 1 评论 -
【集合-HashMap】源码级理解HashMap之深入构造方法和神奇位运算
壹:HashMap的基本属性//序列化IDprivate static final long serialVersionUID = 362498820763181265L;//哈希表默认的桶数,也就是数组的长度,同时这个容量必须是二的次数幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16//桶的最大数量static final int MAXIMUM_CAPACITY = 1 << 30;//默原创 2021-04-04 15:38:47 · 396 阅读 · 2 评论 -
【集合-HashMap】源码级理解HashMap之get()和remove()方法
壹:get(Object key)方法//调用getNode()方法,获取不到返回null,否则返回key对应的valuepublic V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }//重点在这里 final Node<K,V> getNode(int hash, Object key)原创 2021-04-04 15:38:07 · 440 阅读 · 3 评论 -
【集合-HashMap】源码级理解HashMap之resize()方法,带你一行行手撕
1.为什么要扩容?当容器元素比数组长度大的多时,就会链化眼中,get()操作就会退化成链表的顺序查找,为了提高效率,减弱链化,所以进行扩容壹:一行行带你读源码final Node<K,V>[] resize() { //引用扩容前的哈希表 Node<K,V>[] oldTab = table; //表示扩容前table数组的长度 int oldCap = (oldTab == null) ? 0 : oldTab.length原创 2021-04-04 15:37:36 · 645 阅读 · 4 评论 -
【集合-HashMap】源码级理解HashMap之putVal()方法,一行行手撕源码
public V put(K key, V value) { //调用putVal()方法 //传入的参数:经过哈希扰动和hashcode,key,val,onlyIfAbsent,evict return putVal(hash(key), key, value, false, true); }//这里得到onlyIfAbsent表示如果hash冲突时,新值是否替换旧值,false表示替换//evict我们用不到,暂时不分析final V putVal(int ha原创 2021-04-04 15:37:23 · 1289 阅读 · 9 评论 -
【集合】源码级深入理解LinkedList,点开即食
在讲LinkedList之前,建议先对ArrayList有一个较为深入的理解,这样两者对比之下,就能找到更适合生产环境中的容器类型可以阅读博主的另一边文章,带你全面了解ArrayList,从扩容机制,常见方法,到fail-fast以及并发情况下的问题都有深入分析:深入理解ArrayList由ArrayList引发的思考由于ArrayList底层是由数组存储的,优点很明显:连续存储空间可以由角标在o(1)的时间复杂度内完成缺点:1.对于元素的增删操作最差达到o(n)2.并且存在不断扩容的问题,时间原创 2021-04-01 09:39:20 · 2098 阅读 · 4 评论 -
List,AbstractList,ArrayList是什么关系?
在阅读ArrayList的源码过程中,List接口,AbstractList抽象类和ArrayList集合类之间到底什么关系,这是一种什么设计模式?在源码中这样的设计并不罕见,首先在接口中定义这个家族中所有成员的共性方法,且不管其成员具体的实现方式,集中地规范了该有的共性方法例如List接口中的抽象方法那每个实现类都要全部实现这些方法么?那可太麻烦了,例如size()方法,对于每个List实现类来说都是返回size属性,如果每个都要重写,势必会使代码更加臃肿AbstractList中所以.原创 2021-03-30 21:47:05 · 451 阅读 · 1 评论 -
【集合】ArrayList看这一篇就够了,点开即食~!
ArrayList作为平常使用最多的集合之一,今天就彻彻底底地搞懂它,话不多说,开干!别急,整体把控继承实现关系实现了RandomAccess接口,可以随机访问实现了Cloneable接口,可以克隆实现了Serializable接口,可以序列化、反序列化实现了List接口,是List的实现类之一实现了Iterable接口,可以使用for-each迭代三大接口分析首先三大接口都是标志接口,点开源码可以发现接口中什么代码也没有,只是起到一个标志作用,所以叫标志接口在这原创 2021-03-30 12:17:29 · 571 阅读 · 9 评论 -
Diagrams:Idea自带类图分析插件(太香辣)
学习源码的过程中,免不了会想对复杂的继承实现关系一目了然,今天就教你使用Diagrams这一Idea自带的插件假设我想查看ArrayList的继承实现关系1.点进源码2.右键ShowDiagram3.想插入其他类或接口快捷键:空格(记得勾选non-project)4.其他方法使用从左至右:打开属性,打开方法,打开构造方法,打开内部类等等,可以同时打开(具体功能可以自己摸索)5.整体效果...原创 2021-03-29 16:46:31 · 2794 阅读 · 0 评论 -
接口能不能new对象?接口中能不能有实现方法?
接口到底能不能new呢?先说结论:接口是不能new的我们在学习多线程的过程中一定会遇到以下的写法new Thread(new Runnable() { @Override public void run() { for(int i = 0;i<=40;i++){ ticket.sell(); } } },"原创 2021-03-14 20:36:46 · 3507 阅读 · 2 评论 -
Java 日期类的使用
Java日期类相关的处理1.System获取时间戳2.Date类- 获取当前时间- 获取当前时间的时间戳,返回值单位毫秒- 日期的格式化和解析- 求日期差3.Calendar类常用方法:4.LocalTime,LocalDate,LocalDateTime常用方法:本文介绍日期相关的常用方法,简洁实用,快速上手1.System获取时间戳获取当前时间戳,返回值单位为毫秒,表示当前日期与UTC时间1970年1月1日的差值 long l = System.currentTimeMillis();2.D原创 2021-03-08 18:14:13 · 699 阅读 · 3 评论 -
Java NIO
详解Java NIO写在前面:Java NIO1.Java NIO简介2.JavaNIO与IO的主要区别3.缓冲区(Buffer) 和通道(channel)4.详解缓冲区的创建及常见方法4.1详解Buffer类4.2接下来一个实例来解释执行各种方法时四种变量的变化5.直接缓冲区和非直接缓冲区4.文件通道(FileChannel)5.NIO的非阻塞式网络通信6.管道7.Java NIO2写在前面:在学习完IO后,又深入学习了NIO,这篇笔记花了笔者挺长时间,如果觉得写的不错,点个赞把,如果有什么问题,请不原创 2021-02-21 23:03:24 · 176 阅读 · 0 评论 -
NIO非阻塞与选择器(Selector)
浅析NIO非阻塞与选择器写在前面阻塞与非阻塞选择器(Selector)什么是选择器?选择器的使用方式选择器常用的方法一个具体实例展示如何使用非阻塞式IO写在前面笔者的另一篇博客详解了NIO中的各个方面,包括缓冲区,通道,分散聚集等等NIO核心内容,附博客链接阻塞与非阻塞首先我们先看一下官方对于阻塞与非阻塞的定义,有一个初步的认知传统的IO 流都是阻塞式的。也就是说,当一个线程调用read() 或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完原创 2021-02-21 23:02:41 · 319 阅读 · 0 评论 -
详解IO流
Java IO详解IO概述1.什么是IO2.流及流的分类2.1什么是流?2.2流的分类3.IO流对象3.1字节流4.IO流方法4.1字符流方法4.2字节流方法5.代码实例5.1使用`FileReader`和`FileWriter`实现文本的复制5.2使用`FileInputStream`和`FileOutputStream`实现图片的复制IO概述1.什么是IOI/O是Input/Out普通的缩写,I/O技术是非常使用的技术,用于处理设备之间的数据传输。在Java程序中,对于数据的输入/输出操作以“流原创 2021-02-19 22:56:28 · 430 阅读 · 0 评论