
java
文章平均质量分 87
robert_chao
欢迎关注我的博客 https://www.lelecoding.cn
展开
-
从代理模式到mockito原理
代理模式回顾代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 抽象角色Subject:通过接口或抽象类声明真实角色实现的业务方法。 代理角色Proxy:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色RealSubject:实现抽象角色,定义真实角色所要实现的业务逻辑,...原创 2019-05-09 14:31:05 · 1676 阅读 · 0 评论 -
算法系列(五)排序算法下篇--如何超越排序算法下界
概述在算法系列(四)排序算法中篇--归并排序和快速排序一文中,我们介绍了归并排序和快速排序,最坏的情况下,最快的排序算法的时间复杂度是O(nlogn),是否有更好的算法呢?到目前为止,没有特殊的规则,O(nlogn)已经是最好的排序算法了,也就是说通用排序算法的时间复杂度下界就是O(nlogn)。如果限定一些规则,是可以打破这个下界的。下面说一下尽在O(n)时间内就能实现对数组排序的算法。原创 2016-06-01 23:57:56 · 5418 阅读 · 0 评论 -
gson用户指南(下)
上篇文章gson用户指南翻译到了10、序列化和反序列化有任意类型对象的collection,我们继续11、内置的序列化器和反序列化器Gson内置的常用的默认序列化器和反序列化器的类可能不合适有时候默认表示不是你想要的。通常情况下在处理库类(DateTime等)会遇到这种情况。Gson允许注册你的自定义的序列化器和反序列化器。主要需要定义两个部分:Json序列化器:自定义对象的序列化Json反序列化器:为一个类型自定义反序列化翻译 2016-06-07 13:32:02 · 1855 阅读 · 0 评论 -
Android依赖注入Dagger的使用和源码解析(上篇)
依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。 Dagger1是Android上最流行的依赖注入框架。它是由Square公司受到Guice启发创建的。Dagger2是Dagger1的分支,由谷歌公司接手开发,目前的版本是2.2。Dagger2是受到AutoValue项目的启发原创 2016-06-01 21:27:29 · 5323 阅读 · 0 评论 -
算法系列(四)排序算法中篇--归并排序和快速排序
在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。概述冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序算法呢?当然有了,堆排序,归并排序,快速排序,它们的时间复杂度都是O(nlogn)。堆排序使用了树结构,到目我们前还没有介绍树相关的算法,这里先分析归并排序跟快速排序。归并排序基本原理原创 2016-05-30 23:04:57 · 8876 阅读 · 0 评论 -
StrictMode介绍
作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对话框等等问题。既然有性能问题,就需要进行性能优化。正所谓工欲善其事,必先利其器。一个好的工具,可以帮助我们发现并定位问题,进而有的放矢进行解决。本文主要介绍StrictMode 在Android 应用开发中的应用和一些问题。什么是StrictModeStrictMo原创 2016-05-18 20:56:12 · 5522 阅读 · 0 评论 -
gson用户指南(上)
一、官方地址https://github.com/google/gson/blob/master/UserGuide.md#TOC-InstanceCreator-for-a-Parameterized-Typeapi地址http://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2二、概述gson是一个用来将JAVA对象翻译 2016-06-06 18:59:03 · 2360 阅读 · 0 评论 -
lambda表达式介绍以及Android Studio引入lambda
一、简介“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。 lambda表达式:原创 2017-01-11 10:52:15 · 5427 阅读 · 0 评论 -
JAVA并发编程(四)任务的取消与关闭
使用简单标志位保存取消状态为了保证标志位可靠,标志必须为volatile类型。使用标志位来取消任务是不及时的,如果中间调用了阻塞方法,有可能永远都无法结束。每个线程都有一个boolean类型的中断状态,interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的原创 2016-07-16 00:00:10 · 7145 阅读 · 0 评论 -
JAVA并发编程(三)设计线程安全的类
设计线程安全类的过程中需要注意三个基本要素:1、找出构成对象的所有变量2、找出约束状态变量的不变性条件3、建立对象状态的并发访问管理策略Java5.0提供了多种并发容器来改进同步容器的性能。同步容器将所有对容器状态访问都串行化,以实现它们的线程安全,这种方法的代价是严重降低了并发性。当多个线程竞争容器锁时,吞吐量将严重降低。通过并发容器代替同步容器,可以极大的提高伸缩性,降低风险。原创 2016-07-10 19:16:20 · 8801 阅读 · 0 评论 -
JAVA并发编程(二)内置锁和对象共享
Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。内置锁的最小颗粒度是对象,修饰方法上的锁也是作用于对象。有时候叫它方法锁,但是实际上是锁住的对象。内置锁又被称为监视锁,线程在进入同步代码块之前会自动获得锁,推出时才释放锁,获得内置锁的唯一路径就是进入这个锁保护的同步代码块或者同步方法。最多只有一个线程可持有这种锁,所以它是线程安全的。当某个线程请求一个其他线程持有的锁时,发出请求的线程就会阻塞。但是如果某个线程视图获得一个已经由自己持有的锁,这是可以得。也原创 2016-07-06 22:18:26 · 4342 阅读 · 0 评论 -
JAVA并发编程(一)JAVA线程池的使用
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务原创 2016-06-24 10:20:56 · 2222 阅读 · 0 评论 -
JUnit单元测试
JUnit 为基本类型和对象以及数组(基本类型或对象)提供了重载的断言方法。参数的顺序是期望值和实际值。可选的第一个值是错误情况的消息。有一个略微不同的断言是 assertThat 它需要的参数是一个可选的失败消息,实际返回值和一个 Matcher 对象。值得注意的是,预期的和实际的是相反的相比其他断言方法。Assume直译为假设,是JUnit提供的一套用于判断测试用例的入参是否有业务含义的工具,如果入参不符合预期时会抛出AssumptionViolatedException,默认的BlockJUnit4原创 2016-06-19 15:30:50 · 3044 阅读 · 2 评论 -
Java编译时注解自动生成代码
在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。可以为特定的注解,注册自己的注解处理器。一个注解的注解处理器,以Java代码(或者编译过的字节码)作为输入,生成文件(通常是.java文件)作为输出。可以生成Java代码,这些生成的Java代码是在生成的.java文件中,所以不能修改已经存在的Java类,例如向已有的类中原创 2016-06-16 21:31:11 · 13440 阅读 · 12 评论 -
JAVA之代码混淆proguard
官方网站用法http://proguard.sourceforge.net/index.html#/manual/examples.htmlproguard主要三部分功能缩减代码、优化代码、混淆代码。三部分功能都可以在配置文件里配置不启用此功能。#Shrink Options#不缩减代码-dontshrink#Optimization Options#优化代原创 2016-06-15 23:03:14 · 4517 阅读 · 0 评论 -
TCP/UDP简单介绍及JavaSocket的使用
概述在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。在客户机/服务器(C/S)结构中,通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提 出申请。服务原创 2016-05-31 08:44:16 · 2063 阅读 · 0 评论 -
JAVA网络编程学习笔记
我在电脑上测试张老师的代码,发现TELNET命令不能用,百度后才明白Telnet作为系统管理员最常用的远程管理工具之一,在以前的Windows版本中只需运行services.msc打开服务管理,启动服务即可使用了。可是在Windows 7中,却无法找到Telnet服务了,看来Telnet因为安全问题已经过时,成为了被windows7放弃的组件。放弃一个组件是需要慢慢来的,在Window原创 2011-06-19 11:51:00 · 1007 阅读 · 0 评论 -
java输入输出学习笔记
File 类定义了与平台无关的方法来操作文件。java的目录被当成一种特殊的文件,list方法返回目录中的所有目录和文件名。DOS下的路径分隔符为/,Unix下的路径分隔符为/,java都可识别。 createNewFile必须用try catch,抛出异常。getParent与创建的File对象有关,注意转义字符的使用,lastModified()的返回值是long型的,可以创建Da原创 2011-06-17 18:00:00 · 1065 阅读 · 0 评论 -
java网络编程学习笔记
127.0.0.1是回路地址。java网络编程类位于java.net中,DatagramSocket类用于UDP通信,ServerSocket类用于TCP通信的服务器端,Socket类用于TCP通信的服务器和客户端。 ds.send(new DatagramPacket("strinfo".getBytes(),"strinfo".length(),InetAddress.getByNa原创 2011-06-18 22:16:00 · 1445 阅读 · 0 评论 -
android SQL 语句
基础 创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database databaseName go Create DATABASE database-name 删除数据库 drop database dbname 备份sql转载 2014-01-14 14:03:43 · 5030 阅读 · 0 评论 -
jsp路径获取
第一种情况 :直接访问JSP文件URL是 http://localhost/Context path/jsp/index.jsp 要在index.jsp引用go.gif文件:1、使用决对路径/images/go.gif'/>浏览器寻找方式: 域名+/Context path/images/go.gif ,可找到。 2、原创 2013-10-03 13:17:51 · 5052 阅读 · 0 评论 -
汉字转换成拼音
在项目开发中可能需要把汉字转换成拼音的功能,这个时候需要一个小框架PinYin4J.jar 这个工具可以把一个汉字转换成拼音,很小很方便,并且还可以解析多音字。下面是具体使用方法。 第一:首先引入pinyin4j-2.5.0.jar 第二:写工具类 Java代码 package test; import net.sourceforge.pinyin4j.原创 2014-01-11 13:51:38 · 2345 阅读 · 0 评论 -
ThreadLocal介绍
一、概述ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是 threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量 (ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一原创 2016-05-30 07:17:39 · 1968 阅读 · 0 评论 -
Java数据类型总结
Java数据类型总结 java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 1、整数:包括int,short,byte,long 2、浮点型:float,double 3、字符:char 4、布尔:boolean 基本型别大小最小值最大值原创 2016-05-29 00:03:03 · 5668 阅读 · 3 评论 -
ByteBuffer说明
概述ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。使用ByteBuffer最核心的方法是put(byte)和get()。分别是往ByteBuffer里写一个字节,和读一个字节。值得注原创 2016-05-28 23:10:14 · 4062 阅读 · 2 评论 -
CompletionService 简介
当向Executor提交批处理任务时,并且希望在它们完成后获得结果,如果用FutureTask,你可以循环获取task,并用 future.get()去获取结果,但是如果这个task没有完成,你就得阻塞在这里,这个实效性不高,其实在很多场合,其实你拿第一个任务结果时,此 时结果并没有生成并阻塞,其实在阻塞在第一个任务时,第二个task的任务已经早就完成了,显然这种情况用future task不合适原创 2016-05-28 23:06:05 · 4079 阅读 · 1 评论 -
JNI签名与数据匹配
JNI为了扮演在c/c++和java之间的匹配工作,它首先需要做的就是既要认识java中的数据类型,也要认识c/c++中的数据类型。这 时,jni就相当于一个适配者了。好比,A与C两个人本来不认识,可是现在B认识A,B也认识C,那么通过C的指引和介绍,A和C就认识了!1、原始数据类型的匹配:其中jni中的本地类型都是以j开头,可以在c/c++中直接和c/C++类型互通互换! 2原创 2016-05-28 17:13:44 · 3829 阅读 · 0 评论 -
java输入输出学习笔记2
应用软件根据文件中所有字节情况,来判断编码规则,UTF-8码取第二个字节的低六个比特位,和第一个字节的低五个字节,高五位补〇,组成Unicode编码。第一个字节的低五位大于10才可以是UTF-8编码,FF FE是Unicode编码标志。EF BB BF 是UTF-8编码标志。 System.getProperties().list(System.out)中输出的file.encoding原创 2011-06-18 10:37:00 · 931 阅读 · 0 评论