Java基础
文章平均质量分 52
水田如雅
不生产代码,只是代码的搬运工
展开
-
CopyOnWriteArrayList实现解析
一,内部核心变量定义 /** The lock protecting all mutators */ final transient ReentrantLock lock = new ReentrantLock(); /** The array, accessed only via getArray/setArray. */ private transient volatile Object[] array;数据存放在arry内部;二,读取操作 /**原创 2022-02-17 21:25:31 · 363 阅读 · 0 评论 -
Java SPI
what SPI?SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。如何使用定义如下类:public interface SPITestInterface { String consoleSth(String source);}public class DefaultSPITestInterfaceImplOne implements原创 2022-01-20 13:32:36 · 1248 阅读 · 0 评论 -
LinkedHashMap实现解析
1,基本核心结构LinkedHashMap继承HashMap,除了有那些HashMap内部的结构外,还定义了 一个双向链表,/** * HashMap.Node subclass for normal LinkedHashMap entries. */static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K ke原创 2022-01-01 16:30:26 · 767 阅读 · 0 评论 -
HashMap核心代码解析
1,基本结构图解HashMap首先是一个 数组,数组的每个位置,挂的是链表或者红黑树 (jdk 1.8及其以上);在jdk 1.8之前,HashMap的实现仅仅是在数组的每个位置上 挂链表;只用链表的弊端:可能以为位置上hash冲突过多,造成去定位时候,查找效率比较低,ps,链表的查找时间复杂度为O(n),红黑树查找的复杂度为O(logn);2,如何去定位在数组中的位置首先先来看HashMap是如何把数据打散的:首先先来看HashMap是如何把数据打散的:static final int ha原创 2022-01-01 15:40:52 · 946 阅读 · 0 评论 -
Java大文件分行解析
String path = "/Users/liuhuichao/Downloads/sourceProcessTest.txt"; int totalLine = getLineNum(path); int item = 100000; int group = totalLine / item; ExecutorService executor = Executo...原创 2019-10-16 14:43:31 · 530 阅读 · 0 评论 -
Guice——依赖注入demo
换了新公司,刚上班,发现他们项目都不用spring进行DI,用的是简洁的guice。 pom配置: <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> ...原创 2018-03-28 22:37:56 · 731 阅读 · 2 评论 -
Guava——EventBus
基于pub&sub模型,并且支持多订阅。消息类:public class OrderEvent { private String message; public OrderEvent(String message) { this.message = message; } public String getMessage() {...原创 2018-05-14 22:23:15 · 489 阅读 · 0 评论 -
我的github整理-置顶-持续更新
开发daily 汇总https://github.com/SoledadVac/DailyDevProblems基于JWT的token认证https://github.com/SoledadVac/Spring-Boot-token-authGit IOhttps://github.com/SoledadVac/SoledadVac.github.ioCommon ...原创 2018-05-16 21:22:33 · 1539 阅读 · 9 评论 -
Java——线程组的两种常见用法
/** * \* Created: liuhuichao * \* Date: 2018/6/4 * \* Time: 下午4:01 * \* Description: thread group 常用 * \ */public class ThreadGroupTest { /** * 复制线程组 * @throws Exception */...原创 2018-06-27 22:32:40 · 576 阅读 · 0 评论 -
Spring源码解析--核心容器类简介
AliasRegistry:映射别名的超级接口;BeanDefinitionRegistry :通常用于保存bean 定义描述(BeanDefinition类型)信息, 例如,RootBeanDefinition 和 ChildBeanDefinition 类 的实例;通常由通过集成AbstractBeanDefinition,由bean工厂去实现接口中的方法;这是sprin...原创 2018-10-17 22:31:30 · 368 阅读 · 0 评论 -
为资源类编写 use {@code try}-with-resources constructions
@Test public void cloneTest() { /**use {@code try}-with-resources constructions**/ try(ObjAutoCloneable lock =new ObjAutoCloneable()){ //放置 }catch (Exception...原创 2018-10-31 15:58:30 · 328 阅读 · 0 评论 -
Java并发编程的艺术——volatile和synchronized实现原理
volatilevolatile变量修饰的共享变量进行写操作时候,会都出lock前缀指令。lock前缀指令在多核处理器下会引发一下两件事情:将当前处理器缓存行的数据协会到系统内存。这个写回内存的操作会是在其他CPU里缓存了改内存地址的数据无效。总结下volatile的两条实现原则:Lock前缀指令会引起处理器缓存会写到内存。一个处理器的缓存回写到内存会导致其他处理器的缓存无效。...原创 2018-11-10 21:14:27 · 304 阅读 · 0 评论 -
Java线程池笔记——合理的配置线程池
要想合理的配置线程池,就必须首先分任务特性,可以从以下几个角度来分析。任务的性质:CPU密集型任务,IO密集型任务和混合型任务。任务的优先级:高中低。任务的执行时间:长,中,短。任务的依赖性:是否依赖其他系统资源,如数据库连接。性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务应该配置尽可能小的线程,如配置N(CPU)+1个线程的线程池。由于IO密集型任务线程并不是一原创 2018-01-24 22:02:51 · 872 阅读 · 1 评论 -
Guava——一些集合操作
/** * \* Created: liuhuichao * \* Date: 2018/4/3 * \* Time: 下午5:42 * \* Description:guava 集合测试 * \ */public class CollectionTest { /** * 不可变集合 */ @Test public void immut...原创 2018-04-03 23:04:52 · 1675 阅读 · 0 评论 -
Guava——简单工具类
/** * \* Created: liuhuichao * \* Date: 2018/3/30 * \* Time: 下午6:12 * \* Description:简单guava使用 * \ */public class simpleGuavaTest { /** * Optional 类使用 * 可能为null的T类型引用 ...原创 2018-04-03 23:03:49 · 622 阅读 · 0 评论 -
Guava——EventBus
发送的消息体:/** * \* Created: liuhuichao * \* Date: 2018/4/3 * \* Time: 下午4:59 * \* Description: 发布-订阅模式中传递的事件,是一个普通的POJO类 * \ */public class OrderEvent { private String message; publi...原创 2018-04-03 17:39:11 · 291 阅读 · 0 评论 -
C#名称空间 VS Java包
写了几天的C#程序,程序总会先声明一个名字空间: namespace test 跟C++里名称空间一样,只是声明方法不同: using namespace std; 名字空间是用来按照逻辑,对类进行划分,增强了程序的可读性,而且减少了命名的冲突。看到这个作用,我忽然想到了Java中的包,这两种东西感觉作用一致,都是为了避免名称冲突才进行一种区域性的划分的原创 2014-02-16 21:01:03 · 2468 阅读 · 22 评论 -
面向对象的重新思考
在刚开始学习一门面向对象语言的时候,我们是这样写代码的: 我们会先写一个小狗类,然后new它,最后调用它的方法实现功能。 例如: Dog d=new Dog();//造个小狗 d.shout();//小狗看到stranger会叫 看得懂这段代码,说明原创 2014-09-05 22:24:34 · 1663 阅读 · 28 评论 -
java基础学习——对面向对象的重识
最近几天在看java的视频,感觉很多东西java语法上很像c#,但是还是有很多内容惊到我: 1,java虚拟机 用过VMWar或者VirtualBox的童鞋都对“虚拟机”这个词有个大致的了解,虚拟机提供了个虚拟的平台,让我们可以模拟一些脱离硬件的环境。java里的虚拟机起到了一个类似以前学过的ODBC驱动程序的作用,它屏蔽了底层的差异,让操作原创 2014-09-04 22:01:59 · 1799 阅读 · 24 评论 -
Java的国际化支持(I18N问题)
一,读取PC的locale信息Locale信息是由语言跟国家代码组成的,在Java中,提供了Locale类对应语言信息。/* * //获取local信息 Locale defaultLocale = Locale.getDefault(); * System.out.println("country:" + defaultLocale.getCountry()); * System.o原创 2015-12-16 20:23:01 · 2926 阅读 · 4 评论 -
bug检查工具——FindBugs
Findbugs是一个静态分析工具,它检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Findbugs自带检测器,其中有60余种Bad practice,80余种Correctness,1种Internationalization,12种Malicious code vulnerability,27种Multithreadedcorrectness,23种Performanc原创 2015-12-07 10:16:37 · 3693 阅读 · 6 评论 -
Java死锁检测
ThreadMXBean常用方法: /** ThreadMXBean常用方法test */ ThreadMXBean threadMXBean= ManagementFactory.getThreadMXBean(); int count=threadMXBean.getThreadCount();//获取当前线程数目 System.out.prin原创 2017-06-28 23:01:55 · 573 阅读 · 1 评论 -
并发程序设计——三个顺序线程练习
question: 有三个线程 t1,t2,t3,如何保证这三个线程顺序执行? public class ShunXuThreadTest { @Test public void threadTest() throws InterruptedException { Thread t1=new Thread(new soutThread(1));原创 2017-08-16 23:18:34 · 754 阅读 · 1 评论 -
使用LinkedList实现安全队列
使用 wait notify 实现一个队列,队列有2个方法,add 和 get 。add方法往队列中添加元素,get方法往队列中获得元素。队列必须是线程安全的。如果get执行时,队列为空,线程必须阻塞等待,直到有队列有数据。如果add时,队列已经满,则add线程要等待,直到队列有空闲空间。 /** * 使用LinkedList实现安全队列 * */public class原创 2017-08-20 14:40:58 · 1314 阅读 · 1 评论 -
略坑的Thread.stop()
一,stop方法调用之后,线程的run不一定会立即结束首先来看下stop方法的代码: @Deprecated public final synchronized void stop(Throwable obj) { if (obj == null) throw new NullPointerException(); Security原创 2017-08-14 22:34:56 · 744 阅读 · 0 评论 -
Guice——Multi Bind
对于一个接口有多个实现类的方式,该如何绑定,下面提供了两种基本方法。使用注解首先来看接口和它的两个实现类:/** * \* Created: liuhuichao * \* Date: 2018/3/28 * \* Time: 下午11:07 * \* Description:数据库接口 * \ */public interface DbInterface { ...原创 2018-03-30 00:21:35 · 933 阅读 · 0 评论 -
fastjson的序列化过滤器
/** * \* Created: liuhuichao * \* Date: 2018/3/30 * \* Time: 下午4:24 * \* Description:测试SerializeFilter * \ */public class SerializeTest { /** * 是否过滤字段 * PropertyFilter根据Propert...原创 2018-03-30 19:00:36 · 1775 阅读 · 0 评论 -
zxing生成二维码
工具类:/** * \* Created: liuhuichao * \* Date: 2018/4/10 * \* Time: 下午3:51 * \* Description: 生成二维码,也支持其他条码生成 * \ */public class QRCode { private static final Logger LOGGER = LoggerFactory...原创 2018-04-10 20:57:35 · 275 阅读 · 0 评论 -
面向对象的概述
什么是面向对象? 从学习VB开始,就一直在说面向对象,面向对象。。!@¥@#%¥@!。。说了多少遍,在软工之前,也一直没有接触到一个明确的定义。 在软件工程中,Coad和Yourdon给出了一个定义:面向对象=对象+类+继承+通信如果一个软件系统是使用这样4个概念设计和实现的,则我们认为这个软件系统是面向对象的。如图,对象a为类a的一原创 2013-12-18 21:53:32 · 1936 阅读 · 29 评论