Java
文章平均质量分 92
Java日常开发总结
Hirezy
人生没有彩排,每一个细节都是现场直播。
是非审之于己,毁誉听之于人,得失安之于数,成败归之于零.
展开
-
Java 各种锁的小结
本文小结了 Java 常用的一些锁及其一些特性,掌握这些锁是掌握 Java 并发编程的基础。当然,Java 的锁并不止这些,例如 ConcurrentHashMap 的分段锁(Segment),分布式环境下所使用的分布式锁。《Java并发编程艺术》《Java并发编程实战》不可不说的Java“锁”事。原创 2024-09-07 00:06:08 · 1015 阅读 · 0 评论 -
Java泛型的协变、逆变和不变
平时在看一些开源框架源码时总发现他们会或多或少的用到泛型来定义数据类型。这可以理解,毕竟牛逼的开源框架大都是为了解决一类普遍问题而存在的;但看不懂的是,有时参数或者返回值会出现诸如extends T>和super T>这样带通配符的泛型参数,这种通配符的泛型是什么意思?如果直接用指定的T会有什么问题?这样做是为了解决什么问题?这是我的疑惑。咨询公司完全做Java开发的服务端同学后,也未能完全解惑。于是查找资料后引出今天的主题----Java泛型的协变extends T>)、逆变super T>)和不变T。原创 2024-09-05 00:15:18 · 869 阅读 · 0 评论 -
Kotlin 泛型之类型擦除
本文介绍了 Java 和 Kotlin 的泛型以及类型擦除,并介绍了如何获得声明的泛型类型。Kotlin 的泛型远不止这些,后续的文章会进一步介绍泛型的协变和逆变.原创 2024-09-04 00:17:57 · 907 阅读 · 0 评论 -
深入浅出Java线程池(下)源码解析篇
在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。原创 2024-09-03 00:31:12 · 1319 阅读 · 0 评论 -
深入浅出Java线程池(上)基础理论篇
我们知道,线程的创建与切换的成本是比较昂贵的。JVM的线程实现使用的是轻量级进程,也就是一个线程对应一个cpu核心。因此在创建与切换线程时,则会涉及到系统调用,是开销比较大的过程。为了解决这个问题,线程池诞生了。与很多连接池,如sql连接池、http连接池的思想类似,线程池的出现是为了复用线程,减少创建和切换线程所带来的开销,同时可以更方便地管理线程。线程池的内部维护有一定数量的线程,这些线程就像一个个的“工人”,我们只需要向线程池提交任务,那么这些任务就会被自动分配到这些“工人”,也就是线程去执行。原创 2024-08-14 20:12:04 · 1003 阅读 · 0 评论 -
Java深入理解equals()与hashCode()方法
Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。equals()方法详解equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下:很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。while (n–!原创 2024-07-21 23:51:29 · 730 阅读 · 0 评论 -
深入解析Hashtable、LinkHashMap、TreeMap
在深入解析HashMap文章中我从散列表的角度解析了HashMap,在深入解析ConcurrentHashMap解析了ConcurrentHashMap的底层实现原理。本文是HashMap系列文章的第三篇,主要内容是讲解与HashMap相关的集合类。HashMap本身功能已经相对完善,但在某些特殊的情景下,他就显得无能为力,如高并发、需要记住key插入顺序、给key排序等。实现这些功能往往需要付出一定的代价,在没有必然的需求情景下,增添这些功能是没必要的。原创 2024-07-17 21:10:56 · 635 阅读 · 0 评论 -
深入解析ConcurrentHashMap
ConcurrentHashMap优秀的CAS+自旋锁+synchronize并发设计,是整个框架的重点所在。从而保证了ConcurrentHashMap的线程安全。原创 2024-07-17 20:46:25 · 1164 阅读 · 0 评论 -
深入剖析HashMap实现原理
HashMap本质上是一个散列表,那么就离不开散列表的三大问题:散列函数、哈希冲突、扩容方案;同时作为一个数据结构,必须考虑多线程并发访问的问题,也就是线程安全。这四大重点则为学习HashMap的重点,也是HashMap设计的重点。原创 2024-07-16 20:54:06 · 1137 阅读 · 0 评论 -
Kotlin Flow 操作符
Kotlin Flow 常用的操作符,巧妙使用Flow操作符可以大大简化我们的程序结构,提升可读性与可维护性。原创 2023-12-06 21:31:03 · 1288 阅读 · 1 评论 -
算法系列(二)并查集
算法系列(二)并查集算法 - 并查集前言Quick FindQuick Union加权 Quick Union路径压缩的加权 Quick Union比较前言用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。方法描述UF(int N)构造一个大小为 N 的并查集void union(int p, int q)连接 p 和 q 节点int find(int p)查找 p 所在的连通分量编号boolean connec原创 2022-01-30 21:15:00 · 1018 阅读 · 0 评论 -
算法系列(一)栈和队列
算法 - 栈和队列算法 - 栈和队列栈1. 数组实现2. 链表实现队列栈public interface MyStack<Item> extends Iterable<Item> { MyStack<Item> push(Item item); Item pop() throws Exception; boolean isEmpty(); int size();}1. 数组实现public原创 2022-01-27 10:46:12 · 1004 阅读 · 0 评论 -
Leetcode 题解(四)数组与矩阵
Leetcode 题解 - 数组与矩阵Leetcode 题解 - 数组与矩阵1. 把数组中的 0 移到末尾2. 改变矩阵维度3. 找出数组中最长的连续 14. 有序矩阵查找5. 有序矩阵的 Kth Element6. 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数7. 找出数组中重复的数,数组值在 [1, n] 之间8. 数组相邻差值的个数9. 数组的度10. 对角元素相等的矩阵11. 嵌套数组12. 分隔数组1. 把数组中的原创 2022-01-26 14:15:00 · 1137 阅读 · 0 评论 -
Java基础系列深入Java IO
Java IOJava IO一、概览二、磁盘操作三、字节操作实现文件复制装饰者模式四、字符操作编码与解码String 的编码方式Reader 与 Writer实现逐行输出文本文件的内容五、对象操作序列化Serializabletransient六、网络操作InetAddressURLSocketsDatagram七、NIO流与块通道与缓冲区缓冲区状态变量文件 NIO 实例选择器套接字 NIO 实例内存映射文件对比原创 2022-01-21 05:00:00 · 724 阅读 · 0 评论 -
深入Java 并发
Java 并发Java 并发一、使用线程实现 Runnable 接口实现 Callable 接口继承 Thread 类实现接口 VS 继承 Thread二、基础线程机制ExecutorDaemonsleep()yield()三、中断InterruptedExceptioninterrupted()Executor 的中断操作四、互斥同步synchronizedReentrantLock比较使用选择五、线程之间的协作join()wa原创 2021-10-12 13:54:58 · 3674 阅读 · 5 评论 -
深入理解Java 容器
Java 容器Java 容器一、概览CollectionMap二、容器中的设计模式迭代器模式适配器模式三、源码分析ArrayListVectorCopyOnWriteArrayListLinkedListHashMapConcurrentHashMapLinkedHashMapWeakHashMap参考资料一、概览容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对原创 2021-10-11 15:02:09 · 2276 阅读 · 4 评论 -
深入理解Java 虚拟机
Java 虚拟机Java 虚拟机一、运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区运行时常量池直接内存二、垃圾收集判断一个对象是否可被回收引用类型垃圾收集算法垃圾收集器三、内存分配与回收策略Minor GC 和 Full GC内存分配策略Full GC 的触发条件四、类加载机制类的生命周期类加载过程类初始化时机类与类加载器类加载器分类双亲委派模型自定义类加载器实现参考资料本文大部分内容参考 周志明原创 2021-10-09 12:06:01 · 2280 阅读 · 4 评论 -
Java对象的四种引用
前言在JDK1.2之前,创建的对象只有在处于可触及(reachable)的状态下,才能被程序使用。也就是说,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。垃圾回收器一旦发现这些无用对象,就会对其进行回收。但是,在某些情况下,我们会希望有些对象不需要被立即回收,或者说从全局的角度来说没有立即回收的必要性。比如缓存系统的设计,在内存不吃紧或者说为了提高运行效率的情况下,一些暂时不用的对象仍然可放置在内存中,而不是立即进行回收。为了满足这种要求,从JDK1.2版本开始,Java的设计人员把对象的引原创 2021-09-09 16:33:50 · 6380 阅读 · 6 评论 -
Android View体系‘铁三角‘
前言在搞Android开发的时候,和View的交互是必不可免的,因为我们肉眼可见,可以控制操作最直观的也是View,因此很有必要来吹水一下整个View体系的三件大事情,既View 绘制流程,View 事件分发,View 刷新机制。目录View 绘制流程View 事件分发View 刷新机制View 绘制流程View 的显示是以 Activity 为载体的,Activity 是在 ActivityThread 的 performLaunchActivity 中进行创建的,在创建完成之后就会调用原创 2021-09-07 12:03:38 · 6692 阅读 · 6 评论 -
Socket通信之TCP拆包和封包
前言我们在使用Socket传递信息时候,经常会遇到这样的问题,输入流数据读取不完整,或者输入流读取数据错乱的问题。下面就针对这俩个问题谈谈我的想法,以及解决思路。举例说明最近我在做一个工业物联网的项目,其中就用到了TCP,只要是通过TCP远程操控和实时获取工业设备信息(比如控制电灯,空调,智慧屏…),由于设备众多,为了保证服务端实时数据的完整性,我在数据链路层采用了异步传输,半双工传输。服务端读取数据后,通过CRC校验的方式来确定数据的完整性。但是后发现还是不能百分百保证数据的完整性。public原创 2021-08-16 17:57:32 · 6196 阅读 · 0 评论 -
Android 缓存机制
一、Android 中的缓存策略一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。因此 LRU(Least Recently Used)缓存算法便应运而生,LRU 是近期最常使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。采用LRU 算法的缓存有两种:LrhCache 和原创 2021-07-31 15:16:40 · 12090 阅读 · 1 评论 -
Android全面解析Handler
前言:由于Handler和Binder是Android开发的俩大利器之一,所以有必要来深入讲解一下Handler,关于Binder可以参考我上一篇博客《IPC机制 Binder》,废话不多说,今天我将图文并茂,一节一节解剖Handler,一节一节的总结Handler相关知识点。#mermaid-svg-w8x1zwBESUZ0ZyLz .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-fami原创 2021-07-23 17:38:32 · 14535 阅读 · 12 评论 -
Java基础之深入认识hashCode和equals
Java是很多开发者都曾经接触过的一门开发语言,它之所以流行,那是因为他有很多的设计思想解决了很多现实中的问题,其中对象的equals方法,hashCode方法的设计思想值得我们学习,所以我们有必要去深入学习一下这两个方法。1:hashCode的作用hashcode的作用大概归纳为如下几点:hashCode的存在主要用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的。如果两个对象相同,就是适用于equals(java.lang转载 2021-05-14 18:34:07 · 4162 阅读 · 0 评论 -
深入解析Glide
在深入了解Glide之前,我们要先来认识一下Glide到底是什么,不要只知道他是图片处理框架,只会其简单的使用,只知道这些是不够的,因为学东西就是要刨根问底,学以致用。今天我们就带着这样几个问题来学习Glide。Glide是什么?Glide的实现原理是什么?Glide对比其他图片加载框架有什么优缺点(也就是为什么要使用Glide)? 自己如何设计一款图片加载框架?Glide是什么?1.Glide是什么?Glide是Google在2014的IO大会发布一款图片处理框架,是目前android领域比较成熟的原创 2021-04-07 02:07:20 · 7444 阅读 · 7 评论 -
Bitmap详解(上)常用概念和常用API
前言:图片的操作我相信大家都操作过,在算法层面大家往往都是把图片转成MAT矩阵处理的,而Android 开发层面大多数都是bitmap位图操作。接下来我将分算法层面以及android层面来讲解一下图片的操作。好了,废话不多说,先将android层面的图像处理,这里我将分俩篇介绍,一个是基础篇,另外一篇是实战演练篇。基本概念什么是BitmapBitmap位图包括像素以及长、宽、颜色等描述信息。长宽和像素位数是用来描述图片的,可以通过这些信息计算出图片的像素占用内存的大小。Config:图片像素类型原创 2021-04-06 00:25:53 · 2630 阅读 · 2 评论 -
主流语言实现冒泡排序算法
什么是冒泡排序冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。下面主要讲解几种常用开发语言的冒泡排序的实现逻辑:主流语言实原创 2020-06-19 21:10:42 · 1718 阅读 · 0 评论 -
深入探索多线程优化方法
前言什么是线程的概念我就不在介绍,不懂的自行百度,我想百分之九十九的人都是知道的,至于多线程,通俗的就是有很多的线程在一起工作从而完成某一件事,从而提升效率。这就是使用多线程的好处之一,举个列子,一家酒店,几个厨子,杂工,切菜工,服务员…大家各司其职,各完成一道工序,这道菜才可以快速做成,如果一直只要一个厨师去做,哈哈哈,告诉你,人多,店就等着被关门吧。由于,我在做Java或android的...原创 2020-11-23 20:58:14 · 1841 阅读 · 0 评论 -
for循环之性能优化
前言for循环是开发时常用的语法之一,比如对数组,集合的遍历等,但是如果使用不好也会出现很多新能损耗的问题,今天就来讲解一下for循环的常用性能优化问题。嵌套循环嵌套循环是有俩层或者俩层以上的循环嵌套在一起,下面直接上代码说明。外大内小嵌套: /** * 大循环驱动小循环(即外大内小) */ private static void bigSmall...原创 2020-01-19 11:24:43 · 20642 阅读 · 13 评论 -
Nginx 与 Tomcat,Apache的区别
一、定义:ApacheApache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。其属于应用服务器。Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。(Apche可以支持PHPcgiperl,但是要使用Java的话,你需要Tomcat在Apache后台支撑,将Java请求由Apa...原创 2020-01-16 15:18:03 · 2947 阅读 · 2 评论 -
音视频之——FFmpeg教程(一)——初见FFmpeg
什么是FFmpeg打开FFmpeg官网首先就会介绍什么是FFmpeg。原文:FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machi...原创 2020-01-14 13:29:08 · 5641 阅读 · 4 评论 -
别让for循环毁了你的程序(二)
上一篇,我们讲解了:别让for循环毁了你的程序(一),今天我继续讲解for循环还会带来哪些坑。这些坑都是开发中的小细节,都是值得我们注意的。. 在遍历ArrayList时调用 ArrayList.remove()方法。举个栗子一:移除所有能被2整除的数 List<Integer> list=new ArrayList<>(); ...原创 2020-01-09 18:53:45 · 751 阅读 · 3 评论 -
别让for循环毁了你的程序(一)
前言for循环是开发中常用的,但是使用for循环仍然有很多有需要注意的地方。今天我们就来细说for循环带了的坑。for循环问题一,遍历list集合出现死循环。今天,同事遇到了一个奇怪的问题,问题是这样的,他遍历向一个集合添加数据,结果发现for循环变成了死循环。大致代码如下。//学生类class Student{ private String name;//性命 private ...原创 2020-01-09 17:39:00 · 2875 阅读 · 4 评论 -
【Android自定义View】Bitmap的绘制和颜色滤镜
前言Bitmap在开发中是经常遇到的,因为他用到的地方有很多,比如Android的图片预览,自定义相机,自定义美颜相机,图片滤镜,图像算法。。。。,既然使用场景这么多,今天就先讲一下Android中常用的吧。今天,我们来说说Bitmap相关的绘制以及颜色滤镜。看看我们是怎样虐狗的哈看看虐狗前的图原图,是一只可爱的阿拉斯加。Bitmap 绘制Bitmap的绘制,主要有以下4个方法,其中2...原创 2020-01-07 10:55:15 · 9219 阅读 · 6 评论 -
OpenGL(一)——OpenGL入门
1.概念2D+透视 = 3D3D术语:光栅化:实际绘制或填充每个顶点之间的像素形成过程着色:沿着顶点之间改变颜色值,能够轻松创建光照照射到一个立方体的效果纹理贴图:将纹理图片附着到你绘图的图像上混合:颜色混合效果渲染:表示计算机从模型创建最终图像的过程2.认识GPUGPU全称是GraphicProcessing Unit--图形处理器,其最大的作用就是进行各种绘制计算机图形所...原创 2020-01-05 09:16:49 · 4587 阅读 · 3 评论 -
常用加密算法之非对称加密算法
非对称加密算法 非对称加密算法是一种密钥的保密方法。非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的...原创 2018-03-16 21:44:45 · 82202 阅读 · 4 评论 -
java_security之base64原理解析以及三种代码的实现方式
一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就...原创 2018-03-18 14:55:00 · 745 阅读 · 0 评论 -
设计模式之--单例模式
序言今天,我会来详细的讲解二十三种设计模式中最常见的设计模式--单例模式,包括单例模式的特点,应用常见,单例模式使用的好处,以及单例模式实现的方式,以及每个方式之间的优缺点等。好了,话不多说了,让我们走进单例模式,一层层揭开单例模式的面纱吧。单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。...原创 2018-03-19 17:24:37 · 191 阅读 · 1 评论 -
设计模式简介
设计模式简介设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 ...原创 2018-03-19 17:47:33 · 181 阅读 · 1 评论 -
设计模式--装饰器模式
装饰器模式装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。简单来说,装饰器模式就是在不改变原有类的结构和功能上,通过实现共有接口方式,加强了自身的功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的...原创 2018-03-20 22:51:03 · 324 阅读 · 0 评论 -
高效 保活长连接:手把手教你实现 自适应的心跳保活机制
前言当实现具备实时性需求时,我们一般会选择长连接的通信方式而在实现长连接方式时,存在很多性能问题,如 长连接保活今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接目录1. 长连接 介绍1.1 简介1.2 作用通过 长时间保持双方连接,从而:提高通信速度确保实时性避免短时间内重复连接所造成的信道资源 & 网络资源的浪费1.3 长连接 与 短连接的区别2. 长连接断开的原因...转载 2018-03-25 21:40:52 · 1025 阅读 · 0 评论