Java
文章平均质量分 78
Harold Gao
这个作者很懒,什么都没留下…
展开
-
跟着Glide学习缓存设计
Glide 是一个开源图片加载库,使用了多种缓存来优化图片加载:Bitmap缓存池、活动资源缓存、内存缓存和磁盘缓存。那么它们的需求和实现有何不同呢?原创 2021-06-15 11:24:15 · 125 阅读 · 0 评论 -
Java基础|JVM锁优化:偏向锁、轻量级锁、重量级锁一句话总结
- 偏向锁,用于只有 1 个线程会访问同步代码的场景;- 轻量级锁,用于可能有多线程访问,但不会同时访问,即没有竞争的场景;- 自旋锁时对重量级锁的优化,用忙循环代替阻塞,使用于锁被占用时间很短的场景原创 2021-06-10 15:25:35 · 235 阅读 · 0 评论 -
Java String如何保存字符串
本文基于 String 源码进行剖析,涉及到字符编码的知识参考自 Unicode Tutorials - Herong’s Tutorial Examples,英文资料讲解的非常详细,建议大家都读一下。String 真的是 Immutable 的吗Java 中的 Unicode 字符串会按照 Latin1(所有的字符都小于 0xFF 时)或者 UTF16 的编码格式保存在 String 中,保存为 byte 数组:private final byte[] value;通常所说的 Immutab.原创 2021-05-12 16:42:01 · 966 阅读 · 0 评论 -
Android工程师学习资源推荐
Android新人入门第一书,郭神的公众号依然每个工作日都在更新:第一行代码(第3版)JavaJava 和 Kotlin 都是基于 JVM 虚拟机,学习 class 字节码结构,了解 Java 内存模型,了解 JVM 的锁优化,GC 算法,基于 JDK 13技术预览版(2019年中期):深入理解Java虚拟机(第3版)Java 并发最经典的书,出版了十几年,基于 JDK 1.6,由 concurrent 包作者们编写,2021 年读起来仍然非常受用:Java并发编程实战Kotlin只是跟原创 2021-04-12 16:22:22 · 134 阅读 · 0 评论 -
Kotlin 和 Java 中的 Lambda 表达式的区别
通过阅读编译后 class 文件,分析 Kotlin 和 Java 中 Lambda 表达式的实现方式有何区别。原创 2021-04-04 22:38:23 · 1075 阅读 · 1 评论 -
Java中的无界通配符<?>在什么时候使用
用来读取的List变量,使用extend定义下界;能使用<Object>通配符的地方,就改用无界通配符<?>原创 2021-02-08 17:36:08 · 4648 阅读 · 2 评论 -
为什么Java泛型不支持原始类型
既然原始类型的装箱和拆箱可以自动进行,而且原始类型无法实现super和extend的泛型,所以与其定义原始类型的泛型,不如定义对应包装类型的泛型。原创 2021-02-08 11:31:06 · 407 阅读 · 0 评论 -
JDK1.8集合框架之Set
总述Set利用Map实现,不允许重复元素(Map中的Key值唯一,可为null)。TreeSet,利用TreeMap实现。支持按插入顺序访问,但是添加、删除、包含等操作相对低效(log(n)时间)。HashSet,底层是HashMap。利用哈希算法,理想情况,可以提供常数时间的添加、删除、包含等操作,但是不能保证有序。LinkedHashSet,用LinkedHashMap实现。内部...原创 2018-06-24 15:55:30 · 1772 阅读 · 0 评论 -
JDK1.8 IO 包中的两种设计模式
适配器模式 适配器模式是指,将一个类的接口转换成客户希望的另外一个接口。Adpter 模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作何时使用?在软件开发前期,类和方法的命名应该就规范地设计好,在一开始出现不兼容时就应该通过重构来同一接口。通常只有在开发后期或维护期,由于双方都不太容易修改接口是,才应该考虑使用适配器模式。另一种情况是,在设计系统是,考虑使用第...原创 2018-06-30 08:46:03 · 1740 阅读 · 0 评论 -
Java NIO 详解
nio 的基本组成1. Buffer 高效的数据容器,除布尔类型,所有原始数据类型都有Buffer实现。使用步骤:写入数据到 Buffer调用flip()方法调整指针位置准备读取从 Buffer 中读取数据调用clear()方法或者compact()方法清理缓存主要属性值:capacity:Buffer缓冲区大小,只能写入capacity个原始类型。不...原创 2018-06-30 21:47:26 · 1908 阅读 · 0 评论 -
JDK1.8中的try-with-resources声明
JDK1.7开始,java引入了 try-with-resources 声明,将 try-catch-finally 简化为 try-catch,这其实是一种语法糖,在编译时会进行转化为 try-catch-finally 语句。新的声明包含三部分:try-with-resources 声明、try 块、catch 块。它要求在 try-with-resources 声明中定义的变量实现了 Aut...原创 2018-06-26 11:36:32 · 38768 阅读 · 12 评论 -
Jdk1.8集合框架之HashMap源码解析(详细解析红黑树)
HashMap特点不同步,支持null的键和值,put或get操作通常是常数时间。Map接口的实现。去掉了Hashtable的contains(Object value)方法,保留containsKey和containsValue方法。使用Iterator而不是Enumration。内部字段// 默认初始长度为16static final int DEFAULT_INI...原创 2018-06-20 17:20:51 · 2407 阅读 · 3 评论 -
JDK1.8并发之CountDownLatch
CountDownLatchCountDownLatch 是java.util.concurrent包中的类,初始化时需要一个正整数参数作为初始 status 值,Thread#1 中每次调用它的countDown()方法都使得 status 减一,Thread#2 中调用它的await()方法会导致 Thread#2 阻塞直到 status 为0。它可以用来设置一个任务阻塞直到其他 n...原创 2018-06-28 18:58:02 · 1739 阅读 · 0 评论 -
JDK1.8并发之ThreadLocal源码解析
本文的目的是分析 ThreadLocal 的源码,关于 ThreadLocal 如何使用,请阅读参考资料1。ThreadLocal.ThreadLocalMap每个线程对象都有一个 ThreadLocalMap 类型的变量。ThreadLocalMap 是 ThreadLocal 的内部类,是用基于线性探测法的散列表实现的。每一个线程对象可以往 Map 中添加多个 ThreadLocal ...原创 2018-07-17 11:37:22 · 775 阅读 · 0 评论 -
Java 正则表达式
本文详细介绍正则表达式的创建语法:单字符、群组、数量标识符等。并介绍了 Java 中使用正则表达式的Pattern、Matcher和String的相关方法。适合初学者理解并学会使用正则表达式。原创 2018-07-22 20:18:37 · 191 阅读 · 0 评论 -
Java 中的四种引用使用场景分析
强引用强引用的对象,永远不会被垃圾回收,JVM 宁愿抛出 OutOfMemeory 错误也不会回收这种对象。软引用 soft没有强引用而只有软引用的对象,只要内存空间足够,垃圾回收器就不会回收(严谨的说法是,GC 根据内存使用情况酌情考虑什么时候回收)。MyObject aStrongRef = new MyObject();SoftReference aSoftRef = new So...原创 2018-09-20 21:18:02 · 1249 阅读 · 1 评论 -
Effective Java (3rd Editin) 读书笔记:4 泛型
4 泛型泛型中的术语:术语例子参数化类型(Parameterized type)List&amp;lt;String&amp;gt;实际类型参数(Actual type parameter)String泛型(Generic type)List&amp;lt;E&amp;gt;形式类型参数(Formal type parameter)E无界通配符类型(Unbounded wi...翻译 2018-10-03 13:07:18 · 283 阅读 · 0 评论 -
Effective Java (3rd Editin) 读书笔记:1 创建和销毁对象
1 创建和销毁对象Item 1:考虑用静态工厂方法取代构造器 public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }静态工厂方法的优点:有名字,因此可以直接看出来它的用法,如 Boolean.valueOf(bool)不要每次创建新对象可以返回方法返回类型的子类可...翻译 2018-09-21 11:33:53 · 195 阅读 · 0 评论 -
Effective Java (3rd Editin) 读书笔记:2 所有对象共有的方法
2 所有对象共有的方法Item 10:重写 equals 方法时遵守通用协同不需要重写 equals() 方法的情况:类的每一个实例都认为是不同。比如 Thread 这种代表活跃的实体而不是值不需要“逻辑相等”的判断。比如 Pattern 不需要检查内嵌的正则表达式是否相等父类已经重写了合适的 equals() 方法。比如,AbstractList 等的子类private 或 pac...翻译 2018-09-21 11:35:42 · 176 阅读 · 0 评论 -
Effective Java (3rd Editin) 读书笔记:3 类和接口
3 类和接口Item 15:最小化类和成员的访问权限一个设计优秀的类应该隐藏它的所有实现细节,将它的 API 和内部实现干净地分离开。这种软件设计的基本准则被称为“封装”(encapsulation)。封装的优点:组成系统的各组件之间解耦,使得它们能够独立地开发、测试、优化、使用、理解和修改基于第一条,提高了组件的复用性基于第二条,即使整个系统开发失败,某个独立的组件仍可以非常成功...翻译 2018-09-26 20:52:17 · 181 阅读 · 0 评论 -
Java面试笔记
13.为什么集合类没有实现Cloneable和Serializable接口?答:克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。 14.什么是迭代器(Iterator)?答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实...原创 2018-03-02 22:33:26 · 183 阅读 · 0 评论 -
JDK1.8并发之生产者消费者问题
本文讨论了生产者消费者模式的三种实现方式,第三种BlockingQueue实际上就是JDK对第二种方式的封装。为了提高程序的拓展性,方便测试,我用StockRoom接口来抽象产品库存的put和take操作。这样三种实现方式可以使用相同的Producer和Consumer类代码。这些可复用的代码如下:// 测试方法:private static void test(StockRoom st...原创 2018-06-24 15:36:03 · 1062 阅读 · 0 评论 -
JDK1.8并发之synchronized和Lock
什么是线程安全? 线程安全是指保证多线程环境下共享的、可修改的状态的正确性。保证线程安全的两个办法: - 封装:将对象的内部状态隐藏、保护起来。 - 不可变:final变量产生了某种程度地不可变(immutable)效果,可以用于保护只读数据。线程安全需要保证几个基本特性: - 原子性:相关操作不会中途被其他线程干扰,一般通过同步机制实现。 - 可见性:一个线程修改了某个...原创 2018-06-23 19:25:36 · 6321 阅读 · 0 评论 -
Java数据结构与算法:归并排序
package com.mindle.test.sort;import java.util.Arrays;public class MergeSort<AnyType extends Comparable<? super AnyType>> { public void mergeSort(AnyType[] array) { AnyType...原创 2018-03-17 19:26:00 · 186 阅读 · 0 评论 -
Java数据结构与算法:快速排序
package com.mindle.test.sort;import java.util.Arrays;public class QuickSort<AnyType extends Comparable<? super AnyType>> { /** * 对于很小的数组,快速排序不如插入排序,因此需要设置截止范围,推荐在(5,20)之间 ...原创 2018-03-17 19:23:10 · 135 阅读 · 0 评论 -
Java数据结构与算法:排序
0.数据有序程度对排序时间的影响直接插入排序是数据越有序越快,最快时间复杂度可达到O(n),选择排序无论何时都是O(n^2), 快速排序越有序越慢,它要从后到前遍历找比基准小的,时间复杂度达到O(n),堆排序需要不断进行调整,时间复杂度为O(nlog2^n)1.插入排序 定理:通过交换相邻元素进行排序的任何算法平均都需要>=(N*N)时间。作为交换相邻元素来排序的一种算...原创 2018-03-17 19:20:56 · 141 阅读 · 0 评论 -
HashMap简单入门
0.README1.hashCode()和equals()函数2.HashTable的机理3.函数重写的基本要求参考文献0.README本文首先介绍了每一个对象都继承的hashCode()和equals()函数,然后说明HashTable如何利用这两个函数将键值对存入其底层数据结构,最后介绍了重写Key对象的hashCode()和e...原创 2018-03-03 22:15:30 · 349 阅读 · 0 评论 -
如何在编辑器中使用正则表达式来替换文本
README匹配邮箱利用“组”来替换代码Greedy 和 Reluctantfind(), lookingAt(), matches()的区别参考文献:README本文讨论了正则表达式的一些应用,由浅入深。 匹配邮箱String mail = "123abcABC_@123abcABC.com.cn.abc.ABC";Str...原创 2018-03-16 17:01:26 · 1235 阅读 · 0 评论 -
java数据结构与算法:堆排序
思路:把数组构建成二叉堆;大根堆根节点为最大值,删除根节点,堆大小减一,把删除的元素放在空出来的堆数组位置,即把最大值放在了数组的末尾;重复删除根节点,即找到了第二大、第三大…的元素,直到堆的长度减小到0,即可实现堆排序,时间复杂度为O(N log N);用大根堆实现从小到大排序,用小根堆实现从大到小排序。package com.mindle.heap;import java...原创 2018-03-16 13:44:24 · 161 阅读 · 0 评论 -
HttpServlet网络连接中出现的中文乱码问题的解决方法
0.README1.servlet是什么2.中文乱码问题(1) 字节流响应时(2) 字符流响应时(3) 下载中文名文件时0.READMETomcat默认的编码格式是ISO8859-1,而网络字符流通用的编码格式是UTF-8,因此会出现一些中文字符乱码问题,本文提出了在response、request、和下载文件的三种情况下的解决方案。 1...原创 2018-03-10 09:38:33 · 277 阅读 · 0 评论 -
Java内存泄漏问题
来源:牛客网内存泄露(MemoryLeak)在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。 Java使用有向图的方式进行内存管理,可...转载 2018-03-20 15:25:36 · 166 阅读 · 0 评论 -
JSON格式总结
JSON: JavaScript Object Notation(JavaScript 对象表示法)JSON 是存储和交换文本信息的语法,类似 XMLJSON 比 XML 更小、更快,更易解析1.对象(在{和}之间){ "name":"runoob", "alexa":10000, "site":null }2.嵌套对象(某个属性值为对象时)转载 2018-03-20 16:14:52 · 190 阅读 · 0 评论 -
Java面试题之小根堆Heap
Java面试题之小根堆Heap: file.txt中有十亿个数字(每行一个),请用Java实现计算选出这些数中最大的100个思路:用前100个数字构建一个容量为100的小根堆;继续读入数字,如果大于小根堆中最小的元素,就删除小根堆中的最小元素,然后插入这个数字;最后小根堆中的100个元素就是所求的值(但可能是无序的)。import java.io.Buffered...原创 2018-03-14 16:42:30 · 958 阅读 · 0 评论 -
Jdk1.8集合框架之LinkedHashMap源码解析
LinkedHashMap和HashMap的区别HashMap的迭代器LinkedHashMap的迭代器LinkedHashMap.Entry保存插入顺序和访问顺序LinkedHashMap和HashMap的区别LinkedHashMap是HashMap的子类,它和HashMap的区别是,可以按照节点插入的自然顺序(或者节点的操作顺序)来迭代所有节点。而且它的迭代比...原创 2018-06-22 14:47:56 · 594 阅读 · 0 评论 -
Java中类的实例化过程变量的初始化顺序,以及常见笔试程序阅读题分析
类是在任何static成员被访问时加载的(构造器也是static方法)。类的整个加载过程包括加载、验证、准备、解析、初始化5个阶段。我这里只讨论我们在笔试题中比较关心的、影响程序输出的部分。类加载:在准备阶段,static变量在方法区被分配内存,然后内存被初始化零值(注意和static变量初始化的区别)。在初始化阶段,执行类构造器<clinit>()方法(注意和实例构造器<ini...原创 2018-06-06 19:23:25 · 1024 阅读 · 0 评论 -
Java中的反射
最近在学习java反射机制,读到了一篇很棒的博客,我的这篇文章是对原文的概括性笔记,总结了这部分知识的学习体系。 1. java.lang.Class获取Class对象知道类名时,编译期加载:Class myObjectClass = MyObject.class通过读取字符串,运行时加载:Class class = Class.forName(&amp;quot;com.jenkov.myapp...原创 2018-06-05 15:10:25 · 212 阅读 · 0 评论 -
JDK1.8 并发之线程池
线程池优点:1. 重用线程池中的线程,避免线程的创建销毁带来的性能开销。2. 控制线程池的最大并发数。3. 对线程简单管理:如定时执行以及指定间隔循环执行。实现ThreadPoolExecutor方法是线程池的真正实现,下面是它的一个比较常用的构造方法:public ThreadPoolExecutor(int corePoolSize, ...原创 2018-05-14 17:27:35 · 3795 阅读 · 0 评论 -
Java算法:判断单链表是否有环
README单链表是否有环,这是一个挺有意思的问题,这里我并没有提出新的解法,而是解释了现有的解法,帮助新人和自己理解。 题目描述判断一个单链表是否有环,如果有,返回第一个环内的节点的引用,如果没有环,返回nuill。 编程依据1. 两个指针从链表头部同时出发,一个每次前进一步,另一个每次前进两步,如果有环,为什么它们一定会相遇?假设pOne前进...原创 2018-04-24 09:58:01 · 5903 阅读 · 0 评论 -
Java数据结构与算法:动态规划
小师弟:刚刚在牛客网上刷了一道算法题,一脸懵逼,看评论说是用动态规划做,可是都看不懂别人的代码。。。大师兄:什么题呀说来听听。 小师弟:给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。 大师兄:这个题呀,确实可以用动态规划。我来考考你,还记得动态规划的三要素吗?...原创 2018-03-21 13:41:02 · 4365 阅读 · 1 评论 -
Java读取C写的float,int和字符数组
0.README1.Java读取C写的float2.Java将C语言写的字符数组转换为String参考文献0.README本文提到了在用Java读取C写的字节文件时,因为两种语言的不同而遇到一些不兼容问题,包括float读取方式,char[]数组转字符串。1.Java读取C写的floatIntel主机中C写入的字节顺序是从低到高(左低...原创 2018-03-30 19:29:35 · 1624 阅读 · 0 评论