自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (1)
  • 收藏
  • 关注

原创 6. Queue

LinkedList实现了Queue和Deque接口,所以LinkedList也用来实现普通队列,相关操作有: offer, poll, peek, offerFirst, offerLast, pollFirst, pollLast, peekFirst, peekLast。优先级队列,即插入的元素不是依次从队尾插入,而是保持一定的顺序,出列时队首的先出。优先级队列底层用到了基于数组的heap树型数据结构,即大顶堆,小顶堆。阻塞队列:基于数组的阻塞队列,基于链表的阻塞队列,优先级阻塞队列等。

2023-11-07 18:07:06 179

原创 5.LinkedList

返回指定索引位的元素,实现也很简单,即从链表的头开始遍历到指定的索引位即可。相比ArrayList的实现,它的时间复杂度比较高是O(n)通过new LinkedList() 或 new LinkedList(Collection c)初始化一个链表。当业务中查询少,但需要频繁增,删的场合可使用LinkedList替代ArrayList。在指定索引位新增一个元素,先找到index位的结点,然后将新结点插入到指定位置即可。删除指定索引位的元素,相比ArrayList实现比较简单,不需要移位。

2023-11-07 13:33:34 322

原创 4. ArrayList

相比于数组它有自动扩容的优点。大部分情况下没必要为了提高一点点性能不使用ArrayList而使用原始数组。RandomAccess是一个标记接口,没有具体方法,表示该类的实例支持随机访问,即支持根据下标快速定位元素,查询时间复杂度为O(1)4)查找元素平均时间复杂度:O(n);当知道元素下标时时间复杂度是O(1)3)新增/删除元素平均时间复杂度: O(n), 因为涉及到元素的移位。1)初始化时容量默认是10, 可通过构造函数指定,达到优化效果。2)当容量不够时会自动扩容,扩容为原来的1.5倍。

2023-11-07 10:11:05 179

原创 3. List

Java 集合API中使用List接口来抽象化线性表,提供针对集合的CURD操作,相比Collection接口,List可以支持按索引位插入和查找,尤其当实现类是ArrayList时,可实现按下标的随机查找。

2023-11-06 18:20:16 371

原创 2. Collection接口

java.util.Collection是List, Set, Queue的共同父接口,它规定了所有集合类的共通方法。

2023-11-06 17:44:55 81

原创 1. Collection,List, Map, Queue

BlockingQueue: 阻塞队列接口,以阻塞的方式插入/取出队列元素,非常有用,常用于生产消费者模式。基于hash表的实现(拉链法, 每个bucket中出现hash碰撞时使用链表串联,但为了效率,当链表元素大于8时,升级为red-black tree)继承自HashMap, 内部维护了一个链表,用于保存元素的插入顺序(或访问顺序),使用迭代器时可按顺序迭代。即优先级队列,保存队列元素的顺序不是按照插入的顺序,而是按照优先级排序。LinkedList特点:底层双向链表实现,不支持随机查找,增删快。

2023-11-06 14:58:16 358

原创 6. Java并发编程-并发包-Lock和Condition

前文介绍了java语言本身通过synchronized, wait, notify实现了管程,解决了并发编程两大难题:互斥和同步。 这两大问题并发包中也得到了相应的实现,分别时Lock和Condition。众所周知,java并发包是并发大师Doug Lea精心打造,他这么做的原因是什么?原来的语言级实现有哪些不足吗?确实如此,以互斥锁为例,并发包中的Lock新增了三个功能:1)支持响应中断支持超时支持非阻塞获取锁如何保证可见性可见性是并发三大挑战之一,其余两个是:有序性和原子性。 原子性

2022-07-06 16:31:02 286 1

原创 5. Java并发编程-Java线程状态、生命周期

首先Java中的线程对应到OS中的线程,深刻理解了OS中的线程学习Java中线程是非常简单的。线程生命周期中涉及到五个状态,分别是:new(初始), ready(就绪), running(运行), block(阻塞)和terminated(终止)new, ready, runnning, terminated比较好理解,重点分析一下block。当运行态的线程调用了一个阻塞API(如读写文件),在条件变量上等待(wait),休眠(sleep), 等待其他线程结束(join)等,此时进入block状态。Java

2022-07-06 14:54:58 225

原创 4. Java并发编程-管程

并发编程已经发展很多年,自分时OS以来就已经存在,相关的理论和技术非常多。 这其中的管程是解决并发编程的关键技术。指的是管理共享变量以及对共享变量的操作过程,让它们支持并发。 在Java领域即管理类的成员变量和方法,让这个类是线程安全的。管程的英文是:Monitor, 直译是监视器,在OS领域可意译为管程。在OS课程中,我们都会学到信号量,知道可用信号量实现互斥锁和同步变量,分别用来解决并发的两大核心问题:互斥和同步(线程间通信,协作)。而管程和信号量其实是等价的,即:可用信号量实现管程,也能用管程实现信

2022-07-05 15:47:25 648

原创 3. Java并发编程-wait & notify

上一节示例中破除占用且等待条件时,如果当前不能满足可以同时持有两个资源锁的时候,当前线程自旋,空耗CPU。如果等待时间不长,或并发压力不大时,也是一个不错的方案。但相反,则严重浪费CPU。此种场景下,最好的方法是:如果线程不满足条件则阻塞自己,进入等待状态,当满足条件时阻塞的线程被唤醒,重新执行,这样就能避免空耗CPU的问题。线程首先获取到互斥锁,当线程要求的条件不满足时,释放互斥锁,进入等待状态;当要求的条件满足时,通知等待的线程,重新获取互斥锁。使用synchronized搭配wait(), notif

2022-07-04 17:29:31 295

原创 2. Java并发编程-互斥锁、死锁

即一个或多个操作在CPU执行的过程中不被中断的特性。一段代码同一时刻只有一个线程运行,称为互斥。 当我们能保证对共享变量的写是互斥的,就能保证原子性 了。将一段需要互斥执行的代码称为临界区。1)当修饰静态方法时,锁定的是当前类Class对象2)当修饰非静态方法时,锁定的是当前对象一组互相竞争资源的线程因相互等待,导致永久阻塞的现象。一旦发生死锁通常没有好的方法,只能重启应用。 重点是在预防死锁。死锁发生的条件:1)互斥,共享资源A和B只能被一个线程占用2)占有且等待,线程一已经取得了资源A,在等待B资

2022-07-04 15:52:12 338

原创 1. Java并发编程-Java内存模型

可见性的原因是CPU缓存,不同CPU之间缓存的数据互相之间不可见。有序性的原因是编译优化(指令重排序)原子性的原因是一条高级指令可能对应多个CPU指令,而OS只能保证CPU指令的原子性。解决可见性和有序性可以通过禁用CPU缓存和禁用编译优化实现,但这样会严重影响程序性能,合理的方案应该是按需禁用。Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法,具体包括:volatile, synchronized和final关键字以及六项Happens-Before规则。这个关键字不是Java语言特有

2022-07-04 13:49:49 123

原创 1. HikariCP连接池优化配置小结

1. 什么是HikariCP连接池Fast, simple, reliable. HikariCP is a “zero-overhead” production ready JDBC connection pool. At roughly 130Kb, the library is very light。2. 为什么HikariCP连接池值得使用和研究1)使用广泛在上亿个站点中使用,每天服务的请求多达10亿;最重要的是它现在是spring boot的默认连接池。2)一个印度阿三引起的口水战h

2022-05-13 13:49:34 14730

原创 10. Java8新特性-新日期和时间API

彻底弄懂GMT、UTC、CST、时区和夏令时格林威治时间、世界时、祖鲁时间、GMT、UTC、跨时区、夏令时,这些眼花缭乱的时间术语,我们可能都不陌生,但是真正遇到问题,可能又不那么确定,不得不再去查一查,处理完可能过段时间又忘记。今天,我们彻底来梳理一下它们。GMTGMT: Greenwich Mean Time, 即格林威治平时(也称格林威治时间),它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。为什么是英国,因为近代的世界秩序是由英国发起的。1884年10月在美国华盛顿

2022-01-24 16:02:20 694

原创 9. Java8新特性-Optional

主要内容:为什么要避免null引用从null到Optional读取Opational中可能值的几种方法null引用的由来1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。Hoare选择null引用这种方式,“只是因为这种方法实现起来非常容易”。如何减少NullPointerException通常可以采用防御式编程来减少NullPointerException。 如:public String getCarInsuranceNa

2022-01-20 11:40:08 608

原创 8. Java8新特性-默认方法(default method)

传统上(< JDK8)接口中定义的方法都是public abstract的,都是没有实现的,实现接口的类必须为接口中定义的每一个方法提供实现,否则会有编译错误。但一旦库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题。 因为现存的实现类都不在库设计者的控制范围内,当项目升级JDK版本后,这些实体类为了适配更改后的接口,需要再修改,尤其是JDK8是非常重要的版本更新增加了大量方法。所以库设计者为了避免出现大规模更改代码,方便大家升级到JDK8,引入了新的机制,即JDK8之后接口现在支持

2022-01-19 16:13:58 1462

原创 7. Java8新特性-并行数据处理(parallel)

在JDK7之前,并行处理数据集合非常麻烦。首先需要自己明确的把包含数据的数据结构分成若干个子部分,第二需要给每个子部分分配一个独立的线程;第三需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成,最后把这些部分合并起来。Doug Lea 在JDK7中引入了fork/join框架,让这些操作更稳定,更不易出错。本节主要内容:1. 用并行流并行处理数据2. 并行流的性能分析3. fork/join框架4. 使用Spliterator分割流学完本节期望能达到:1. 熟练使用并

2022-01-18 13:49:14 9055 1

原创 97-things-every-programmer-should-know-34: 依靠开源项目实现理想

很有可能工作中无法开发出自己理想中的软件。 也许你正在一家大型保险公司开发业务系统,其实你更想去google, Apple, Microsoft之类的科技公司,但硬实力不允许啊。幸运的是,解决这个问题的最佳答案是:参与开源项目。 当前有数以千计的开源项目,大多数很活跃,能提供你想要的各种类型的开发经验。如果你很想开发操作系统,数十个操作系统开源项目可供你选择。如果你想开发音乐软件,动画,机器人,PC单机游戏,大型在线游戏,手机端等,你都至少能找到一个你感兴趣的开源项目。当然,天下没有免费的午餐,你不得不

2021-12-30 10:55:06 116

原创 二. 征服C指针:C如何使用内存

虚拟内存现代OS都会给应用程序每个进程分配独立的虚拟地址空间。这样做的目的是为了保证安全,防止应用程序破坏内存空间。。这和 C 语言本 身并没有关系,而是操作系统和 CPU 协同工作的结果。即:应用程序面对的是虚拟地址空间。作用域有如下三种:全局变量在函数外定义的变量,默认就是全局变量。全局变量在任何地方都是可见的。当程序被分割到多个源码文件进行编译时,声明为全局变量的变量也是可以从其他源码文件中引用。文件内部的静态变量同样是定义在函数外部,一旦有static修饰,就变成了文件内部的

2021-12-28 17:40:37 569

原创 一. 征服C指针:C是什么样的语言

为了解决眼前问题,由开发现场的人发明的虽然使用方便,但看上去不怎么顺眼如果不熟悉它的人糊里糊涂使用了它,难免会带来悲剧C的发展历程Ken Tompson使用汇编语言开发了UNIX。他又基于BCPL语言开发了B语言。B语言不直接产生机器代码,而是通过解释器执行中间代码,所以执行效率一般。1971年Dennis Ritchie对B语言进行了改良,加入了char数据类型,并且可以直接生成机器代码。这样就诞生了C语言。后来主要是为了满足使用UNIX的程序员的需要(用C语言改写了UNIX,并且开发人员也用

2021-12-28 15:47:37 452

原创 6. Java8新特性-用流收集数据(Advanced)

本节重点内容:用Collectors类创建和使用收集器将流归约为一个值数据分组和分区开发自己的自定义收集器之前的几节已经分析了流的操作,可分为两类:中间操作和终端操作。 中间操作(filter, map, flatMap)可以链接起来将一个流转化为另一个流,这些操作本身不会消耗流,其目的是建立一个流水线。而终端操作(forEach, reduce, findFirst, findAny, count等)会消耗流,以产生一个最终结果。之前我们已经使用过一个终端操作collect(toList(

2021-09-02 10:44:19 284 1

原创 5. Java8新特性-使用流(Using Stream)

本节会详解介绍如何使用流,以发挥出它的强大功能,主要包括:1)筛选,切片,匹配2)查找,匹配和归约3)使用数值范围等数值流4)从多个源创建流5)无限流筛选和切片用谓词筛选Stream接口支持filter方法,该方法接收Predicate谓词,而Predicate之前已经介绍了是函数式接口,所以我们可以很方便的传递lambda,对流元素做筛选。筛除重复的元素类似sql中的distinct关键字,Stream接口也提供了distinct方法,用于将重复元素过滤出去,如:List<In

2021-08-25 10:08:46 389

原创 4. Java8新特性-什么是流(Stream)

本节重点内容什么是流集合与流内部迭代与外部迭代中间操作与终端操作流是什么?流是Java API的新成员,它允许你以声明式的方式处理数据集合(通过查询语句表达,而不是现写一个实现),可以把它看作遍历数据集的高级迭代器。另外,流还可以透明的并行处理,无须写多余的多线程代码。先看一段示例,以比较传统方法和流处理集合的不同:// 现有一批菜肴,需要筛选出卡路里小于400且按卡路里排序,最后打印菜肴的名称// java8之前的写法public static void main(String

2021-08-23 17:41:15 397 2

原创 3. Java8新特性-通过行为参数化传递代码

行为参数化:让方法接受多种行为作为参数,并在内部使用,来完成不同的行为。行为参数化可以让代码更好的适应不断变化的要求,减轻未来的工作量。过去我们也一直实践行为参数化传递代码,如执行集合排序,java API提供了Collections.sort方法,传递两个参数,第一个是待排序集合,第二个是Comparator。这是一个典型的策略模式,即针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使得它们可以互相替换,却不影响主体逻辑。过去我们行为参数化很多情况下采用传递匿名内部类实例的形式,如:/*

2021-08-18 17:42:42 400

原创 2. Java8新特性-为什么需要关心Java8

原因:Java8所做的改变,在许多方面比Java历史上任何一次改变都深远,且熟练掌握它们会让你编程更容易,效率更高。优点一:简化代码如,在Java8之前,写一个对集合排序的程序需要这样写:Collections.sort(inventory, new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getW

2021-08-18 14:56:49 183

原创 1. 我心目中的顶级程序员(Java生态)

Ken ThompsonKen Thompson,1983年图灵奖得主,获得国家技术奖章 (UNIX之父)贡献:C语言,UNIX操作系统(主导), Regular Expression, 定义UTF-8, Go语言共同作者2000年退休,离开贝尔实验室,成为一名飞行员2006年,进入Google,开发Go语言Dennis RitchieDennis Ritchie, 1983年图灵奖得主,获得国家技术奖章 (C语言之父)贡献:C语言(主导),UNIX操作系统,《C 语言程序设计》名言:

2021-08-18 11:23:07 729

原创 1. JDK版本变迁和各版本新特性

JDK从1995年发布起至今已历经20多年,从JDK1.0升级到JDK16(2021年8月),本节先一起回顾一下JDK的版本变迁和各版本的新特性版本变迁1995年5月23日,Java语言诞生;1996年1月,第一个JDK-JDK1.0诞生;1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术;1996年9月,约8.3万个网页应用了Java技术来制作;1997年2月18日,JDK1.1发布;1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议纪

2021-08-17 17:27:51 6956 1

翻译 97-things-every-programmer-should-know-32: 封装行为,而不仅仅是状态

在系统论中,控制 是处理大型复杂系统最有用的方式之一。在软件开发行业,控制或封装的价值很容易理解。可通过编程语言的子程序,函数,模块,包,类等进行控制。模块和包用于解决更大规模的封装需求,而类,函数等用于解决更细粒度的封装需求。**过去这些年我意识到类层次的封装似乎成为了开发者最难封装的结构。**找出一个类中main方法包含3000行代码的类并不常见,或一个类仅有属性和对应的get/set方法。这些示例证明开发者并没有完全理解面向对象思想,在利用面向对象建模方面是失败的。一个对象既要封装状态,也要封装行

2021-08-17 12:04:13 103

原创 22. spring-容器:详解AnnotationConfigApplicationContext

先看类结构图可以看出跟XmlWebApplicationContext很像,都是基于AbstractApplicationContext, 而容器加载和实例化bean的核心方法都是在AbstractApplicationContext中组织,不同之处各个子类再重写。AnnotationConfigApplicationContextpublic class AnnotationConfigApplicationContext extends GenericApplicationContext imp

2021-08-12 13:39:48 331

原创 21. spring-容器:详解XmlWebApplicationContext

先看类结构图类结构图异常复杂,顶层的一些接口之前已经接触过了,像BeanFactory,ApplicationContext,ResourceLoder等。 对于XmlWebApplicationContext来说比较重要的基础类是:1)AbstractRefreshableConfigApplicationContext它是ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, XmlWebApplicationContex

2021-08-12 10:45:03 965

原创 20. spring-容器: ApplicationContext

BeanFactory vs ApplicationContext相同点都是spring的容器接口,都具备基本的容器功能, ApplicationContext本质上也是BeanFactory,它是BeanFactory的子接口。不同点BeanFactory只具备基本的容器功能,适用于性能受限的特殊场景。ApplicationContext是高级容器,在BeanFactory的基础上做了增强,如:支持i18n支持ResourceLoader,能作为抽象资源的访问接口消息发送机制(Appli

2021-08-10 14:55:23 120

翻译 97-things-every-programmer-should-know-30:DRY(Don‘t Repeat Yourself)

在所有的编程准则中,DRY也许是其中最基础的一个了。该准则是从《程序员修炼之道》中首次提出。它是其他许多已知的软件开发实践和设计模式的基石。一个能够识别重复代码并且知道通过适当的练习和合适的抽象来解决问题的开发者能开发出更清晰的代码,相比而言给应用增加不必要的重复性的开发者会持续污染应用。重复意味着浪费每一行写进应用的代码最后都需要维护,也就意味着是未来bug的潜在来源。重复造成了不必要的代码库膨胀。导致更多机会出现bug,并增加了系统的偶然复杂性。更多重复性代码也会导致应用开发者无法全面的理解整个应用

2021-08-06 15:19:55 138

原创 19. spring-容器: 如何解决Spring的循环依赖问题

123123

2021-06-18 13:54:21 267 1

原创 97-things-every-programmer-should-know-29: 不要依赖“魔法”的发生

如果你从足够远的地方观察任意的活动,进程或学科,你会感觉看上去挺简单的。无开发经验的管理者会认为程序员干的事挺简单的。 而无管理经验的程序员也会觉得管理者干的事没难度。编程这件事是一些人花一部分时间做。但难点的部分是思考 - 它是最不可见且不容易被外行所观察到的。过去的几十年人们做过很多尝试,试图去除有技术含量的思考。其中一个最早且让人印象深刻的努力是使得一个编程语言不再变得神秘,一些人预测这将消除对专业程序员的需求。结果… 这门编程语言(Cobol)这些年来却贡献了许许多多专业程序员的收入。软件开发行

2021-06-17 15:05:14 77

原创 97-things-every-programmer-should-know-27: 不要只是学一门新语言,而要理解它的文化

在经典书籍《The Pragmatic Programmer》,中文译《程序员修炼之道》中,作者建议我们每年学习一门新语言,我试着采纳他们的建议,数年之后我拥有了使用多种编程语言编程的经验。从我学习多语言编程的经历,让我意识到不仅仅是要学习它的语法,更重要的是学习它的文化。 你可以使用任何语言写Fortran,但真正学会一门语言需要拥抱它的思想。如不要在C#中写一个很长的Main方法,并且使用static方式调用静态方法,而是要理解类的优点。如果花了很长时间还是未能理解函数式语言中的lambda,不要觉得不

2021-06-14 14:29:36 1360 3

原创 18. spring-容器:XmlBeanFactory源码解析-Bean实例化阶段

上一章讲了容器的启动阶段,完成的工作是从外部文件加载BeanDefinition对象,并注册到容器中。注意:本质上容器中使用一个Map来维护beanName和BeanDefinition对象之间的关系。本节开始讲解Bean的实例化阶段,看看容器内部是如何处理的。我们从DefaultListableBeanFactory的getBean方法为入口,开始跟踪:// 使用DefaultListableBeanFactory容器结合XmlBeanDefinitionReader Default

2021-06-11 16:35:30 149 1

原创 17. spring-容器:XmlBeanFactory源码解析-容器启动阶段

本节跟踪使用XmlBeanFactory容器时的启动阶段, 即包括:使用BeanDefinitionReader从xml文件中读取BeanDefinition。将BeanDefinition注册到容器中通过BeanFactoryPostProcessor对BeanDefinition做后置处理如何学习和阅读源码从本章起开始系统的学习框架源码,因为学习的目标框架都是非常成熟,优秀的框架,提供了某个领域的解决方案,且贡献者都是顶级开发者,所以源码会逻辑复杂,且代码量很大。如果不遵循一些好的阅读实践

2021-06-10 18:43:37 170

原创 16. spring-容器: 探索BeanFactory-XmlBeanFactory, DefaultListableBeanFactory, XmlBeanDefinitionReader

BeanFactoryBeanFactory是所有Spring容器的根接口,提供了基本的容器操作方法,定义如下:package org.springframework.beans.factory;import org.springframework.beans.BeansException;import org.springframework.core.ResolvableType;import org.springframework.lang.Nullable;public interf

2021-06-04 17:55:19 207

原创 15. spring-容器: 探索BeanFactory-总体分析

从本章起开始探索Spring容器,了解它背后实现的原理。IoC容器实现的大体过程包含两大阶段,分别是:容器启动阶段和Bean实例化阶段。容器启动阶段加载配置元数据,大部分情况下是依赖BeanDefinitionReader来加载和解析,并将解析后的结果组成BeanDefinition对象,最后将这些BeanDefinition注册到BeanDefinitionRegistry中。这一阶段主要做对象管理信息的收集工作。Bean的实例化阶段当某个请求方通过容器的getBean方法明确请求某个对象

2021-06-04 12:25:35 87 2

原创 14. spring-容器: @Autowired, @Qualifier, @Primary, @Resource, @Inject注解

这些注解都是用于标识需要spring容器注入bean。@Autowired, @Qualifier, @Primary是spring自带的注解@Resource, @Inject是JSR 250注解,是javaee规范。spring进行了实现。@Autowired源码如下package org.springframework.beans.factory.annotation;import java.lang.annotation.Documented;import java.lang.ann

2021-06-03 14:17:26 159 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除