java源码与面试
文章平均质量分 81
lik_lik
学生
展开
-
OpenFeign 父子容器及AutoConfiguration源码解析
本文约2千字,主要知识在使用Spring Cloud时,经常使用OpenFeign 作为远程服务调用的类库;Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。Spring Boot3中,也引入了一套全新的声明式HTTP调原创 2022-12-21 11:26:59 · 890 阅读 · 1 评论 -
Spring 揭秘 12.1
有关公开当前调用的代理对象的探讨同一个对象内的嵌套方法调用 Spring AOP 拦截失效问题经典示例:Spring 事务失效书中示例原因分析归根结底,是Spring AOP实现机制造成的。其采用代理模式实现AOP。具体的横切逻辑,会被动态添加到代理对象中。一般代理对象与目标对象方法的调用时序:在代理对象方法中,不管你如何添加横切逻辑,最终都需要调用目标对象上的同一方法,来执行最初所定义的方法逻辑。而 同一个对象内的嵌套方法调用 拦截失效代理对象的method1原创 2021-09-01 11:06:53 · 204 阅读 · 0 评论 -
HashSet概览
类介绍(注释)HashSet是基于HashMap、Set接口的实现,它不保证元素的遍历顺序。add、remove、contains、size 方法,时间复杂度是O(1)HashSet是非线程安全的,并发出错时,会快速失败,抛出ConcurrentModificationException常用方法源码构造函数无参构造函数// 内部组合的HashMapprivate transient HashMap<E,Object> map;public HashSet() {.原创 2020-07-10 15:37:57 · 12518 阅读 · 0 评论 -
TreeSet概览
类介绍(注释)TreeSet是基于TreeMap的实现,它可以通过自然排序、显式``传入的Comparator对元素进行排序。TreeMap(和其他的可排序的Map)中的元素,在没显式传入构造器的时候,一定要使该类 实现Comparable、equals方法。add、remove、contains 方法,时间复杂度是O(log(n))TreeSet是非线程安全的,并发出错时,会快速失败,抛出ConcurrentModificationException常用方法源码构造函数public.原创 2020-07-10 14:39:39 · 12526 阅读 · 0 评论 -
LinkedHashMap常用方法源码
类介绍(注释)add、contains、remove 方法,时间复杂度是O(1)。LinkedHashMap的遍历耗时,与_capacity无关,与map的size(元素多少)呈线性。_HashMap的遍历,可能比_LinkedHashMap更耗时,其和_capacity呈线性关系。LinkedHashMap是非线程安全的,并发出错时,会快速失败,抛出ConcurrentModificationException。可以使用_Collections.synchronizedMap(new Link.原创 2020-07-05 13:20:25 · 5261 阅读 · 0 评论 -
TreeMap概览
相对于HashMap来说,TreeMap 是较简单的。类介绍(注释)TreeMap是红黑树的实现,它可以通过自然排序、构造时传入的Comparator对key进行排序。TreeMap(和其他的可排序的Map)中的元素,在没显式传入构造器的时候,一定要使该类 实现Comparable、equals方法。containsKey、get、 put、remove 方法,时间复杂度是O(log(n))TreeMap是非线程安全的,并发出错时,会快速失败,抛出ConcurrentModificationE原创 2020-07-02 10:06:55 · 2970 阅读 · 0 评论 -
Guava 优秀源码记录
Guava 优秀源码记录Maps.difference(差异)两个Map间 高效的差异算法(Maps.difference)其底层的实现也算是最优的实现了,只需要循环一次。入参就是两个 Map,比较之后能够返回四种差异:左边 Map 独有 key。右边 Map 独有 key。左右边 Map 都有 key,并且 value 相等。左右边 Map 都有 key,但是 value 不等。// 对比两个 map 的差异private static <K, V> void doDiff原创 2020-07-01 19:03:41 · 2977 阅读 · 0 评论 -
HashMap初步解析
参考美团技术团队-Java 8系列之重新认识HashMap一些Map的比较HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全.原创 2020-07-01 10:54:57 · 1909 阅读 · 0 评论 -
LinkedList常用方法分析
LinkedList概览与ArrayList一样,LinkedList也实现了List接口。ArrayList由于基于数组,在中间删除元素或插入元素的操作中,效率较低。而LinkedList适合于修改较频繁的场景、集合元素先入先出和先入后出的场景(队列)。ArrayList的底层数据结构,是一个双向链表。如下图所示:LinkedList中,有以下重要概念:LinkedList中每个节点,被称为Node。prev 即 前驱节点。next 即 后继节点。first 是 头节点,它的前驱节点恒为nulllast原创 2020-06-29 22:12:19 · 3085 阅读 · 0 评论 -
ArrayList 源码
ArrayList 源码ArrayList概览基本概念ArrayList 的结构较为简单,就是一个数组。结构如下图所示。ArrayList中有一些重要概念、属性:index:当前下标elementData:数组,该数组的大小,经常与 ArrayList 的size 混淆,需要注意。DEFAULT_CAPACITY:数组的初始大小,默认是 10size 表示当前ArrayList实际有多少个数据,没有使用 volatile 修饰;modCount :当前数组的版本号,数组结构有变动,就会原创 2020-06-27 20:24:15 · 4162 阅读 · 0 评论 -
Arrays、Collections、Objects方法源码
Arrays、Collections、Objects,都是对应对象的工具类。好的工具类通用的写法特征:构造器必须是私有的。这样的话,工具类就无法被 new 出来,因为工具类在使用的时候,无需初始化,直接使用即可,所以不会开放出构造器出来。工具类的工具方法必须被 static、final 关键字修饰。这样的话就可以保证方法不可变、不能被重写,并且可以直接使用,非常方便。我们需要注意的是,尽量不在工具方法中,对共享变量有做修改的操作访问(如果必须要做的话,必须加锁),因为会有线程安全的问题。除上述情况原创 2020-06-26 16:55:06 · 1888 阅读 · 0 评论 -
Java常用关键字
static字面上,意思是静态的,一旦被static修饰,说明被修饰的对象在一定范围内是共享的,这时候需要注意并发读写的问题。static 修饰类成员static 修饰类成员时,如何保证线程安全是我们常常需要考虑的。当多个线程同时对共享变量进行读写时,很有可能会出现并发问题,如我们定义了:public static List<String> list = new ArrayList();这样的共享变量。这个 list 如果同时被多个线程访问的话,就有线程安全的问题,这时候一般有两个解决.原创 2020-06-25 10:22:27 · 2681 阅读 · 0 评论 -
String源码与常见问题
String源码与常见问题String不变性(immutable)不可变指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的对象。String str = "hello";str = "world";如上图,是str在被赋值过程中,debug体现的变化。从代码上来看,str 的值好像被修改了,但从 debug 的日志来看,其实是 str 的内存地址已经被修改了,也就说 str =“world” 这个看似简单的赋值,其实已经把 str 的引用指向了新的 String对象。Stri原创 2020-06-24 21:40:14 · 2722 阅读 · 0 评论 -
Long源码与常见问题
Long源码与常见问题Long的缓存Long 最被我们关注的就是 Long 的缓存问题,Long 自己实现了一种缓存机制,缓存了从 -128 到 127 ,即 -2~ 2-1 内的所有 Long 值,如果是这个范围内的 Long 值,就不会初始化,而是从缓存中拿,缓存初始化源码如下:private static class LongCache { private LongCache(){} static final Long cache[] = new Long[-(-128) +原创 2020-06-24 21:38:26 · 8336 阅读 · 0 评论