
java
文章平均质量分 73
我是黄大仙
黄大仙
展开
-
Lambda 表达式是否会造成内存泄漏
背景匿名内部类 VS Lambda 表达式匿名内部类Lambda 表达式结论背景匿名内部类会持有外部类的引用,因此有造成内存泄漏的风险;那么Lambda 表达式是否会造成内存泄漏呢?匿名内部类 VS Lambda 表达式我们新建一个类TestInner,其中test方法里面包含一个Lambda表达式,test1方法里面包含一个匿名内部类public class TestInner { public void test(){ new Thread(()->{ .原创 2022-01-17 10:15:31 · 6513 阅读 · 0 评论 -
徒手撸一个gradle插件
1.准备工作1.1创建一个Android module1.2准备maven环境2.实现插件2.1实现插件类2.2编辑properties文件2.3发布插件3.应用插件3.1引入插件3.2应用插件1.准备工作使用java开发gradle插件,基于gradle7.0版本开发,所以一些gradle的API针对低版本已经发生了变化。1.1创建一个Android module创建Android模块GradlePlugin,删除掉res和androidTest这两个目录,在main目录下创建resource.原创 2022-01-08 13:08:52 · 1500 阅读 · 0 评论 -
java的io操作
最近在做一个日志组件,考虑到性能和日志的完整性,使用了MMAP,即内存映射的方式写日志,顺便总结一下Java里面的IO操作.1.IOIO是阻塞性的,效率不高,但是很容易理解可以想像成是一个水管,水管里面有空位才能往里写,否则就要等待, 水管里面有水才能读,否则也只能等待.不管IO怎么包装,其操作都是针对字节的.private static void testIO()throws Exception{ File file = new File("test.txt"); //写原创 2020-10-08 20:33:19 · 158 阅读 · 0 评论 -
网络通信中的单播、广播和组播的实现
网络访问目前网络访问分为单播、广播和组播,以下将介绍其Java实现。单播单播就是点对点的通信,如下图所示: 实现单播服务端public class SingleServer extends Thread{ public void run(){ try { int port = 30000; byte[] buffer = new原创 2017-04-27 16:03:28 · 1783 阅读 · 0 评论 -
自己封装的简单ThreadFactory
简介自己封装的一个线程池工厂,能够比较方便的使用各种线程池,包括普通线程池、执行周期性任务线程池、单线程池,其中利用反射技术,可以直接传入函数名就可以执行,目前只支持无参函数的传入,也可以代码包装成Runnable传入。结构与功能整体结构如下图所示: ThreadFactory里面包含有四个线程池,分别是 单线程池:线程池只有一个线程,所有任务依次执行; 周期任务线程池:用于执行周期性的任原创 2017-06-25 12:47:21 · 3900 阅读 · 0 评论 -
自己封装的简单ThreadFactory2
简介自己封装的简单线程池ThreadFactory,连接上一篇博客 http://blog.csdn.net/hbdatouerzi/article/details/73715668, 新增加了传递带参函数的功能。源码地址: https://git.oschina.net/huangbei1990/threadfactory.git 使用方法传递带参函数的使用方法如下所示:public cla原创 2017-06-26 18:42:01 · 555 阅读 · 0 评论 -
Java内存区域总结
Java内存区域Java内存区域主要分为以下几个部分 1.程序计数器当前线程所执行的字节码的行号指示器,属于线程私有的一块内存区域;2.Java虚拟机栈也是属于线程私有,java虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息; 每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程;3原创 2017-08-16 19:29:57 · 326 阅读 · 0 评论 -
UML类关系总结
UML描述的类之间的关系主要有六种,分别是继承,实现,依赖,关联,聚合以及组合,并分别用各种不同的图案来表示。1.继承指类B(子类)继承类A(父类),并获得父类的功能,Java里面用extends关键字表示。 public class A {}public class B extends A{//类B继承类A}2.实现指类B实现了一个接口A,Java当中用implements关键字表示。 pu原创 2017-08-24 12:49:26 · 933 阅读 · 0 评论 -
Java对象的创建过程
简介在应用层,我们只需要写一个new关键字,就可以创建出一个对象,但实际上虚拟机帮我们做了很多的工作。1.对象的创建如下图所示为对象的创建过程 当虚拟机遇到new指令时 1) 去常量池当中定位类的符号引用; 2) 检查这个类的符号引用是否被加载,解析和初始化过; 3) 如果没有,则进行类加载的过程,第二节会讲到类加载的过程; 4) 如果已经加载过,则虚拟机为对象分配内存; 5) 虚拟原创 2017-08-24 14:34:09 · 2158 阅读 · 2 评论 -
失败重试策略
简介自己封装的失败重试策略,比较适合访问网络或者蓝牙通信的时候任务失败重试,当失败次数达到预定的次数之后,就会提示本次任务失败。 以下是代码的结构: RetryPolicyI是失败重试接口; AbstractRetryPolicy继承了接口,并实现了任务执行重试的逻辑; FixedRetryPlicy固定时间的重试; LinearRetryPlicy线性增加时间的重试; RandomRe原创 2017-09-26 19:41:46 · 1630 阅读 · 1 评论 -
线程安全一
说起线程安全,我们第一时间想到的就是加锁,通过锁来保证同一时间只有一个线程访问。最常使用的就是synchronized和lock关键字,以下是我对于使用这两个锁的一些总结。synchronized1.锁的对象我们先来看下面这一段代码public class Test { private String str; public Test(String str){ ...原创 2018-11-03 14:35:57 · 208 阅读 · 0 评论 -
线程安全二
在保证线程安全的时候,除了synchronized和lock,也需要用到其他的一些关键字,可以针对不同的场景使用。1.final使用final修饰变量,表示变量只能被赋值一次,赋值之后值不再改变,因此使用final修饰基本数据类型的时候,自然就是线程安全的。private final int value;另外final修饰类,表明这个类不能被继承;final修饰方法,表明这个方法不能...原创 2018-12-02 17:08:29 · 224 阅读 · 0 评论 -
adapter优雅的实现方式
最近博主在前人留下的代码当中发现到了adapter和viewhodler的实现方式,觉得很优秀,比自己实现的优雅很多,觉得自己以前的实现真的非常的丑陋。1.去掉ViewHolderlistview是个很常用的控件,为了复用view,我们经常会定义一个ViewHolder,例如下面的代码 public class ViewHolder { public TextView...原创 2019-08-17 13:06:15 · 259 阅读 · 0 评论 -
json在继承关系当中的反序列化
问题描述当收到子类的json字符串的时候,如果用父类来进行反序列化,那就会出现数据丢失的情况。具体如下: Family包含有Child,Child有两个子类,一个是Son,另一个是Daughter。 当收到的Json字符串为 {“child”:{“childName”:”张三”,”girlFirendName”:”小红”}}时,此时用Family去反序列化,”girlFirendName”:”原创 2017-04-16 16:41:20 · 5085 阅读 · 2 评论 -
依赖注入
依赖注入指的就是类A依赖于类B,通过外部注入的方式来实现,而不是通过自身去实现。 这样做的好处就是可以使得代码之间更加的解耦。 举个例子,船(ship)包含有船桨(oar),以下为高耦合的写法, public class Oar { //船桨 public Oar(){ } }原创 2017-02-17 14:11:17 · 290 阅读 · 0 评论 -
文件读写
自己写的文件读写类,写文件是直接在文件后面添加内容,且一行一行的添加。public class FileRW { private File file; private FileReader fileReader; private BufferedReader br; private FileWriter fileWriter; pr原创 2016-05-02 19:10:36 · 238 阅读 · 0 评论 -
面向切面编程一
面向切面的编程,我的理解是能够在所要执行的代码前和执行完成后,添加相关的内容。举例说明,int divide(int a,int b)除法函数,算出a/b并返回,现在想要在执行divide函数前添加验证的功能,以及执行完成之后输出结果,可以利用面向切面编程的思想实现,具体如下:Caculator接口public interface Calculator { public int divide(原创 2016-05-05 10:37:19 · 338 阅读 · 0 评论 -
java调用Python
在java里面调用Python可以采用process类的方法来调用,具体方法如下: 将调用Python的方法封装成为一个类OpenPython,run()方法为调用Python代码执行,并获得返回值,getResult()为获得返回值。public class OpenPython { private String path;//路径 private List<String> arg原创 2016-05-15 11:54:11 · 358 阅读 · 0 评论 -
面向切面编程二
上一篇是对一个具体的类切面编程实现,现在将其抽象出来,利用java的动态代理特性实现切面编程。类图如下 定义了Before和After泛型接口,DynamicProxy类实现切面编程功能,继承自InvocationHandler接口。Before接口public interface Before<T> { public boolean before(T...args);}BeforeDivi原创 2016-05-05 11:24:44 · 284 阅读 · 0 评论 -
Socket网络编程
使用Socket可以非常方便的进行通信,主要分成两个部分:第一个部分ServerSocket,服务端等待客户端的连接;第二个部分Socket, 客户端连接服务端。 ServerSocket的使用方法如下 int port=23456;ServerSocket server=new ServerSocket(port);while(true){//等待客户端的连接 Socket s原创 2016-09-01 16:21:08 · 287 阅读 · 0 评论 -
Timer和TimerTask的使用
Timer可以定时执行TimerTask任务,使用起来也十分的方便。 以下的代码是输出当前时间的TimerTask //输出当前时间的任务private static TimerTask task=new TimerTask(){ @Override public void run() { System.out.println(getCurrentTime()); }原创 2016-09-13 19:05:49 · 274 阅读 · 0 评论 -
Gson的使用
使用Gson可以非常方便的实现json字符串和实体类进行互相的转换,实现起来也非常的简单。 先要在项目当中导入gson包,然后就可以使用了。 比较常用的使用方法如下所示 1.实体类和json字符串互相转换 //User是一个实体类User user=new User("张三",true,18,3000,20162324);//得到gson对象Gson gson = new Gs原创 2016-09-03 17:10:16 · 182 阅读 · 0 评论 -
java类的初始化顺序
方便查看初始化顺序,使用了下面的打印类 public class Print { public Print(String str){ System.out.println(str); }}本文讨论两种情况下类的初始化顺序,分别是单独类的初始化,和有继承关系的类的初始化1.单独类的初始化以下面的代码为例public class Fathe原创 2016-10-28 18:31:04 · 230 阅读 · 0 评论 -
Timer和TimerTask的使用--2
上一篇博客当中,利用栈对Timer和TimerTask进行了封装,在实际运用的当中觉得很好用,这次增加了运行过程中的状态信息。 具体代码如下所示: public class MyTimer { private MyTimerTask task; private int date; private long period; private Stack原创 2016-10-27 18:29:34 · 279 阅读 · 0 评论 -
java线程池
Java里面提供有四种线程池,分别是定时任务线程池,固定线程数的线程池,不限线程数的线程池,单线程的线程池。 1.定时任务线程池 能够用于执行循环的任务,还可以延迟执行任务,具体代码如下所示 /** * 执行定期任务 * 执行延期任务 */public class ScheduledThreadPool { private static ScheduledThrea原创 2016-11-01 19:22:58 · 345 阅读 · 0 评论 -
反射总结
java里面的反射是一个非常好用的东西。 通常情况下,我们使用关键字new,由一个类生成一个对象;而反射是根据已经存在的对象,来获取类里面的内容。 一个类通常由三部分组成,构造器(构造函数)、属性、方法,通过反射就可以从一个具体的实例获取到类的构造器、属性和方法。 Java的反射机制需要借助四个类来实现,分别是Class(类)、Constructor(构造器)、Field(属性)、Metho原创 2016-12-13 10:47:51 · 218 阅读 · 0 评论 -
java调用c++
Java代码当中调用c++程序,大致的步骤就是先将c++文件编译成为so文件(Windows下需要编译成为dll文件), 然后Java里面就可以调用了,以下详细说明,以linux系统为例。 1.新建Java类JniTest,定义库名称“jni-test”和函数“get()”和“set(String str)”。原创 2017-02-08 14:43:43 · 794 阅读 · 0 评论