Java
文章平均质量分 65
快乐的编码小猪
有梦想,敢打敢拼,愿意尝试新鲜的事物
展开
-
理解HashMap的容量为何是2的N次方
在阅读HashMap的原理文章的时候,其中有一个知识点说的是HashMap的数组长度是2的N次方,即使调用含有容量参数的构造方法,内部也会将数组长度调整到2的N次方.这么做最大的原因,是为了减少哈希冲突,尽量散列.我看了几篇文章,没有完全解释清楚为何能减少,所以我多看了几遍源码,加上根据我自己的理解,确定是利用了二进制按位与的特点假如数组长度是16,put操作的时候都是拿元素的hash key和数组长度-1进行的按位与所以获取下标的公式是:x&1111,x指hash key证明如下:原创 2021-11-14 09:40:08 · 641 阅读 · 0 评论 -
Java动态代理原理详细解析
动态代理简介动态代理Demo动态代理导出字节码解释动态代理原理运行时创建字节码demo动态代理应用原创 2021-06-16 11:09:19 · 154 阅读 · 0 评论 -
线程切换的几个核心问题
线程切换的几个核心问题切换线程切换了什么什么设备管理了切线程的切换CPU上下文内核态,用户态如何量化线程切换引起的开销总的切换流程原创 2020-02-22 22:10:30 · 1183 阅读 · 0 评论 -
从Okhttp的Head中学习一种key,value的存储方式
在用okhttp的时候,我们可能会自定义一些head,一般是这么写代码 Request.Builder builder = new Builder().url(url) .addHeader(InstagramWebConstants.HEADER_ORIGIN, .addHeader(InstagramWebConstants.HEADE...原创 2019-09-28 10:15:34 · 844 阅读 · 0 评论 -
带生命周期的AsynsTask
其中让我们吐槽AsynsTask的一个点就是它生命周期无感知,在LifeCycle出来之前,一般都是在Activity/Fragment的onDestroy手动去掉,按照道理来说也可以,但是如果遇到一个界面有好多个AsynsTask,手动取消就不是那么优雅了,看着在onDestroy里一坨cancel方法,有种想砸键盘的冲动,但是AsynsTask已经封装好了切换线程的操作,而且内部的实现原理还算...原创 2019-09-16 20:59:14 · 180 阅读 · 0 评论 -
吐槽Okhttp的一个语法点
最近在看okhttp源码的时候,有个语法点我想吐槽一下,先看代码,代码在RealCall.java中 void executeOn(ExecutorService executorService) { 1 assert (!Thread.holdsLock(client.dispatcher())); boolean success = false; try ...原创 2019-09-12 16:26:07 · 154 阅读 · 0 评论 -
Okhttp的cookie和拦截器
在okhttp中应用cookie十分简单。只需要重写cookiejar即可。 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(hostSelectionInterceptor) .cookieJar(new CookieJar() { ...原创 2019-09-11 20:58:52 · 783 阅读 · 0 评论 -
责任链模式应用之Okhttp的拦截器机制
责任链模式的概念责任链模式定义如下:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chai...原创 2019-09-11 09:03:21 · 411 阅读 · 0 评论 -
匿名内部类为何能访问外部类的变量
从学习java的时候知道匿名内部类能访问外部类的变量,那为何呢。先从一个最简答的例子开始:public class InnerTest { private int num = 0; public static void main(String[] args) { InnerTest innerTest = new InnerTest(); innerTest.inner();...原创 2019-08-15 23:40:31 · 2297 阅读 · 1 评论 -
Dagger 之外的第二个选择
android中有关注入的开源项目主要有Dagger2,还有Arouter,但arouter不是专门去做注入的工作,暂不比较.Dagger2比较优秀。在android中MVP是最合适使用依赖注入的场景。但Dagger2有一个缺点,就是比较繁琐,项目injectMVP就是简化这个过程,达到轻量级的效果。原创 2019-06-26 15:29:15 · 163 阅读 · 0 评论 -
Java 内存模型的总结
看了几遍《Java 并发编程的艺术》,对Java内存模型JMM的理解加深了不少,记录一下自己的理解吧。概念:java线程之间的通信由JMM来控制,决定一个线程对共享变量的修改何时对另外一个线程可见,抽象的说:共享变量存储在主内存中,而每个线程由一份本地内存,存储了共享变量的副本。如下一张图:JMM如何控制呢。答案就是JMM有一条规则保证,这套规则就叫Happens-before规则...原创 2019-01-29 14:04:02 · 188 阅读 · 0 评论 -
final 变量可以修改
在之前java 开发的认知中,final 修饰的变量一旦初始化,就不能被修改,如果是类变量,只能在构造方法中初始化,在其他方法中如果初始化,编译器也会报错,IDE也会拒绝编译。如下:这个没问题,这是所有开发者的共识,但是如果遇到了反射,会有些不同,如下:public class OneCity { private final ArrayList<String> name...原创 2019-01-23 16:19:16 · 11246 阅读 · 0 评论 -
final 和 volatile的关系
之前的一片文章final 变量可变欠下了一个技术债,就是反射修改final变量值,到最后调用了Unsafe.putObjectVolatile方法,看方法名字中包含了"Volatile",那么推论Volatile和final有渊源,或者说在内存语义上有关联。那么这种关联是什么呢,下面来分析一下。先我们看一些概念。volatile变量写的概念如下:在Java 并发编程这本书中,写到如果对一个vo...原创 2019-01-24 10:05:48 · 1917 阅读 · 0 评论