最近在看开源的一个组件zookeeper的源代码,在自己做实验,调用zookeeper接口实现分布式锁的时候,看到了一个类,是private static的,由此引发了我的思考,为啥这个类要这么设计?联想到之前看到的一些开源组件或者JDK的源码,也看到了类似的private static的设计,所以就上网搜索了一番。

特点

1 防止外部类直接调用或者实例化。

2 减少对象的数量。

3 延迟加载

PS: private的含义比较明确,目的也很明确,就是不想让别的类用。关键在于static的含义。

查看全部


今天想记录一下编程的一些基本知识和理论,这样在遇到一些复杂问题的时候,可以运用XXXXX原理,把复杂问题,拆解成这些基本原理。

### 1、缓存

缓存的概念,无处不在。

本质思想就是把数据放在离你最近的地方,当然不能把所有数据都放在身边,肯定是经常使用的东西。这里有一个空间换时间的概念。当然,还有一个时间换空间的时候,例如网络传输的时候,可以把内容进行压缩,往往可以提高传输的效率。

查看全部


日常中的开发工作,大部分都是增删改查,所以和SQL打交道的时候特别多,我在日常工作中,使用的最多的是mybatis和mysql,用的是spring boot框架,所以在改完代码之后,全量测试下SQL是否正确,就非常重要了。有时候单元测试没来得及写全,所以有一个简单的工具,可以做一下冒烟测试,也是非常有必要的,可以避免低级错误。 所以就萌生了一个想法,通过反射,获取系统中的所有的SQL,挨个执行一遍,简单测试下SQL是否报错。

PS: 如果想要做精细化的测试,还需要自己单独写单元测试。

1、说干就干

思路明确了,先去网上搜索下,有没有别人已经做过了。简单搜了下,确实有人做过,必须要传入dao文件的物理路径,然后解析文件,这明显不是我想要的效果。

查看全部


上一篇讲了讲动态代理,这一篇要说一说注解。随着Spring的流行,笔者在开发的过程中,无时不刻在使用注解,那么了解注解,就成了必须要学会的知识,会用,了解原理即可。不过学到哪种程度呢,就需要见仁见智了。说一点题外话,Java的东西太多了,精通所有的东西,看过所有的源码,几乎是不可能的,所以自己就看自己的需求了,学习到那种程度就自己掌握吧。

注解简单用法

直接上代码来说,比较简单,Spring虽然已经不提倡使用这种方法,但是由于方便,还在经常使用。

查看全部


打算写一个Java新手入门必须要会的系列,这个系列是入门之后,必须要学会理解的东西,对于以后的Java开发会特别有帮助,第一个选定的题材就是动态代理,理解了动态代理对于理解Spring AOP和mybatis,有特别大的帮助。

动态代理可以做什么?

可以对代码进行增强,例如给方法增加事务、日志、统计信息等(Spring AOP),mybatis框架也是用到了动态代理。

查看全部


这一篇,我想分享下自己对于内存的一些基本知识的理解,当然,这篇文章也仅仅适用于新入门的Java开发人员,对于一些有经验的开发人员,可以不看,如果刷到了,请直接关闭页面就可以了。笔者写了很多年的Java代码,和写了很多年C语言的人相比,对于内存的理解,肯定要浅显很多。如果你是C语言开发者,本文对于你来说,简直就是脱了裤子放屁一样,觉的说的这不都是废话吗?哈哈一笑即可。

查看全部


最近学习了内卷这个词汇,大意是各行各业对于从业人员的要求越来越高了,导致大家陷入了军备竞赛中,除了要学日常工作中能用到的,不能用到的也要会。本人是JAVA后端开发,体会也比较深,最早在12年的时候的面试题,大多都是一些相对来说比较简单的题目,例如hashmap原理、字符串、自动拆箱装箱、SQL优化等,临近2021年,再看看现在的面试题,竟然可以深入到即时编译器原理,像JVM结构和垃圾回收,都已经是常规的面试题目了,这种趋势可能会愈演愈烈,不知道再过几年,对于JAVA从业人员的要求要掌握哪些技术了。

各行各业都在内卷,内卷不是错误,错误的是没有做出有用的产品。

我的观点

我的观点是内卷说明了行业竞争激烈,大家需要提高自己的技术能力,才能体现出自己对比其它人的优势,总体上来说是不可阻挡的,但是不好的一点是技术能力提升之后,有没有带来实际的工作能力的提升。这是一个比较直接的想法,没有什么高度和思想,仅仅从内卷带来的实际效果来考虑,毕竟招人的时候,才需要去面试,需要去问一些日常开发中很少能够用到的知识,面试造火箭,工作拧螺丝,造不了火箭就拧不好螺丝,这也是毋庸置疑的,那么怎么才能学以致用呢?毕竟辛辛苦苦的学了很多的知识,总是想要用到实际的工作当中去。本人人微言轻,在自己博客发表一下看法,还是可以的,有一天有影响力了,再说其它。

查看全部


这篇文章是第二篇,如果没有看过第一篇的,建议先去看看JAVA程序员必学的Google Guava库(第一篇),不过直接看第2篇也没关系,不影响。Google Guava的内容着实有点多,先把目录列在这里,慢慢写,就总结一下日常用的多的东西,一些用的少的或者特别细节的内容,就不写了。

目录
3、缓存
4、字符串处理

3、缓存

如果要实现一个内存类型的缓存,大部分人可能会尝试使用Map,这样写也可以,大部分情况都适用,担心多线程问题,可以使用ConcurrentHashMap,但是还有一些问题例如内存无限膨胀、过期等问题,没有解决,这个时候,可以考虑使用Guava的缓存。

通常来说,Guava Cache适用于:

  • 你愿意消耗一些内存空间来提升速度。
  • KEY会被查询一次以上。
  • 缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果这不符合你的需求,请尝试Memcached这类工具)

    查看全部


Java程序员比C/C++程序员幸福的一点是,不需要手工管理内存的申请和释放,尽管垃圾回收像一个围城,大家都想到对面去。在实际的编程中,Java程序员要相对幸福一点,可以自由发挥,随意建立对象,本文也不想讨论JVM具体的垃圾,回收机制和算法,而是从实际编程的角度出发,讲一讲怎么配合JVM的垃圾回收,在编程中应该注意哪些事项,总的一个宗旨就是不要管垃圾回收的事情,程序员能做的事情不多。

1、妄想控制JVM进行垃圾回收???

手工把大对象设置为null,并不能优化GC,原因在于GC的时机,jvm并不是时时刻刻都在进行垃圾回收,大部分垃圾收集器力求减少GC,能不要Full GC,就不要Full GC,所以相信JVM的作者是足够聪明的,垃圾收集器可以在适当的时候GC。

极端情况: 如果你有1个特别长的方法,申请了一个超大的对象,可以考虑在用完之后,把对象设置为null,一种更优的办法是,让方法保持短小精悍。

System.gc() 更像是毒苹果,JVM不能保证会在调用了这个方法之后,进行垃圾回收。

查看全部


要说Java程序员必须要学习的东西的话,Spring当仁不让,必须是第一个框架,也有另外一个东西,也是新手程序员必须要学习的东西,那就是Google的Guava库,这个库的作者,和Effective Java的作者是同一人,都来自于Google,学好了这个库,你的Java的能力,相信会更上一个台阶。Java的优势是什么?那就是各种成熟的轮子,Guava就是其中之一,如果想代码很少BUG,就开始使用它吧。

目录
1、基本工具
2、集合

1、基本工具

1.1 避免NULL

NULL的含义是不确定的,应该避免,尤其是在Map和Set中,返回NULL,并不清楚是不存在,还是有值,但是是NULL,最常用的一个技巧就是:

1
2
3
4
5
6
7
8
9
10
// 好的代码
List arr = new ArrayList();
// 不好的代码
List arr = null;
Map<Integer,String> map = new HashMap<>();
//处理默认值
map.getOrDefault(123,"默认值");
//没有123这个KEY的时候,才执行put方法,如果map中已经有值了,就不执行put方法
//并且返回旧值
map.putIfAbsent(123,"123");

这样可以避免空指针。Guava的建议是: 使用快速失败操作拒绝null值对开发者更有帮助。

查看全部