Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
参见:
http://blog.csdn.net/yongjian1092/article/details/7364451
Java反射机制详解
反射机制的一个副产品是可以访问私有变量和私有方法。(笔试题的常客)
http://blog.csdn.net/nisaijie/article/details/5692901
java反射访问私有变量和私有方法
使用Java开发GUI是一个很冷门的技能树,即使是多年的Java程序员,也未必接触过这个领域。我上次接触该技能,还是2005年的AWT时代。
Java的GUI框架,大致有:
1.AWT。最古老的框架。为了跨平台,它只提供各个平台上支持的组件的最大公约数集合。AWT的实现是以本机对等体的方式来实现的。
2.SWT。Eclipse项目的早期产物,现在Eclipse也不用它了。它提供的是各种平台上支持的组件的最小公倍数集合。公共组件采用本机对等体,而非公共组件自绘。
3.SWING。和SWT差不多同时期的东西,Sun的产物。它提供的是各种平台上支持的组件的最小公倍数集合。全部组件都是自绘的,因此跨平台一致性很好,但效率不高。
4.JavaFX。目前最新的GUI框架,其设计思路和实现,均与WPF是同一档次,已经成为官方推荐的标准框架,并集成到JRE中。
其他的框架还有JFace等。
官网:
https://openjfx.io/
文档:
https://openjfx.io/openjfx-docs/
教程:
http://www.javafxchina.net/
参考:
https://www.ibm.com/developerworks/cn/opensource/os-swingswt/index.html
SWT、Swing或AWT:哪个更适合您?
sudo apt install software-properties-common
sudo add-apt-repository ppa:webupd8team/java
这一步,可能会出现安装密钥失败的情况。不过不要紧,后面安装jdk的时候,手动选择Yes就可以了。
sudo apt update
sudo apt install oracle-java7-installer
这样安装之后,还需要设置环境变量JAVA_HOME。(在/etc/profile中)
export JAVA_HOME=/usr/lib/jvm/default-java/
cd /usr/lib/jvm
sudo ln -s java-7-oracle default-java
Spring等框架中,有很多配置项是以注释(annotation)的形式出现在代码中,这也成为Java代码中很有特色的一点。
早期的Java代码中,虽然已经开始使用注释,然而这时的注释并不参与自身程序的运行,而主要是为第三方程序提供帮助,比如最著名的Java Doc。
从Java 1.5之后,JDK开始提供相关的注释接口。参见:
http://www.open-open.com/lib/view/open1353144218545.html
全面解析Java注解
还有一个叫做ADP4J用于简化处理注释。参见:
http://www.open-open.com/lib/view/open1369278937654.html
基于Java注释注入配置属性:ADP4J
参考:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
深入理解Java:注解(Annotation)自定义注解入门
和一般的C/C++程序只有一个main函数不同,Java允许每个类都有自己的main函数。只要在程序执行时,指定使用某个类的main函数即可,这个类被称作“主类”。
这种设计方式对调试程序、模块测试很有帮助。我们可以设定某个小模块中的类为主类,来单独测试该模块,而不必将整个系统运行起来。
class A
{
...
static
{
System.out.println("static block executed.");
}
...
}
这样的结构被称为static block,它会在类被加载的时候执行且仅会被执行一次,相当于是特殊的构造函数。
参见:
http://www.cnblogs.com/icejoywoo/archive/2011/05/09/2041449.html
从Java的Hello,World!说到Static Block
POJO(Plain Ordinary Java Object):简单的Java对象。
这个名词被创造出来,用以和JavaBean做一个区分。后者通常是被容器所创建,还要实现Serializable接口用于实现Bean的持久性。
Alt+Enter:自动import
双编辑窗口:在代码的标签上右键->Split Horizontally
有序否 | 允许元素重复否 | ||
---|---|---|---|
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉树排序) | ||
Map | AbstractMap | 否 | 使用key-value来映射和存储数据,Key必须惟一,value可以重复 |
HashMap | |||
TreeSet | 是(用二叉树排序) |
HashMap采用是数组+链表/红黑树的组合来作为底层结构,也就是开放地址法+链地址法的方式来实现HashMap。
Hashtable是线程安全的,已被废弃。HashMap不是线程安全的,但它的效率比Hashtable好很多。
当需要多线程操作的时候,可以使用线程安全的ConcurrentHashMap。同为线程安全的,它的效率比Hashtable好:因为它使用了分段锁,并不对整个数据进行锁定。
参考:
https://blog.csdn.net/wangxing233/article/details/79452946
HashMap与HashTable的区别
https://blog.csdn.net/NYfor2017/article/details/105454097
HashMap的加载因子为什么是0.75?
https://mp.weixin.qq.com/s/Ahwg2PYXzhHik9yP_WoYzQ
图文并茂,HashMap经典详解!
https://mp.weixin.qq.com/s/GoeJt7hiL1QjpD7vIo4vew
遍历HashMap的5种最佳方式
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志System。
假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
Logback是由log4j创始人设计的另一个开源日志组件。官方网站:
http://logback.qos.ch
上面三者可以组合使用(slf4j+log4j和slf4j+logback),它们的配置文件主要是logback.xml和log4j.properties。
https://mp.weixin.qq.com/s/JNN95s42I-46rIo2Umtd4A
Java日志体系权威总结
https://mp.weixin.qq.com/s/JC51S_bI02npm4CE5NEEow
如何优雅地记录操作日志?
https://zhuanlan.zhihu.com/p/50564627
著名的Log4j是怎么来的?
代码:
https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/java/HanLP/KnowlegeModel.java
要点:
1.implements Serializable接口。不但对象本身要实现,它包含的子对象也要实现该接口。
2.save/load函数。
3.不想序列化的成员使用transient关键字修饰。
Guava: Google Core Libraries for Java。这个库提供了很多JDK没有包含的基础功能,非常不错。
官网:
https://github.com/google/guava/wiki
如果没有Netty?
远古:
java.net + java.io
近代:
java.nio
其他:
Mina,Grizzly
参考:
https://mp.weixin.qq.com/s/K9Oyn0cbwqVCh1j3N5bd_w
I/O与Netty原理精讲
https://mp.weixin.qq.com/s/w4RmWCZkyNlhjRH1oDN6AQ
45张图深度解析Netty架构与原理
https://zhuanlan.zhihu.com/p/23488863
Java NIO浅析
https://mp.weixin.qq.com/s/mcI6QUW0naOmL3PMiKzLdw
如何用Netty写一个高性能的分布式服务框架?
https://mp.weixin.qq.com/s/JdbPf_H4pn5PnPH2LIKQlw
携程高性能全异步网关实践
https://mp.weixin.qq.com/s/TDXYFbHgbC6WzP10DBC2jw
聊聊Netty那些事儿之从内核角度看IO模型
https://blog.csdn.net/javazejian/article/details/72828483
深入理解Java并发之synchronized实现原理
https://www.cnblogs.com/ytxiao/p/12182679.html
synchronized的CPU原语级别是如何实现的?
https://mp.weixin.qq.com/s/3Pdq2Q2p3P3XI0-n3J7Oig
由浅入深逐步了解Synchronized
https://blog.csdn.net/z69183787/article/details/104407842
Java volatile关键字内存原语
https://mp.weixin.qq.com/s/ut4hRJSDOls6UTUdlpu9_g
由浅入深逐步讲解Java并发的半壁江山AQS
FixedThreadPool:固定数量线程池。
CachedPool:这个是只有提交了任务时才会启动一个线程。一开始是没有线程的,来一个任务就开启一个线程,当然前提是线程池里没有空闲的并且存活的线程。
SingleThreadPool:线程池中同一时刻只有一个线程在执行。适合于对同步要求比较高的情况。
ScheduledPool:定时执行的线程池。
WorkStealingPool:每个线程都有自己维护的队列,当一个线程处理完自己的队列后,会去‘偷’别人的任务队列进行处理。
ForkJoinPool:这个线程池的设计思想与MapReduce极其相似,将一个大的任务分解成一个个小的任务当多个线程来执行。然后将计算的结果汇总得到最终结果。这也是用到了递归的思想。其中它的任务分为两种一种没有返回值是RecursiveAction,一种有返回值RecursiveTask。
https://blog.csdn.net/z_xindong/article/details/103144219
Java常用六种线程池
https://mp.weixin.qq.com/s/_r1EU66tpHUrOyuGd9yNdA
学会Java中的线程池,这一篇也许就够了!
HotSpot虚拟机里内置了两个JIT编译器:Client Compiler和Server Compiler,简称为c1编译器和c2编译器。c1编译器将字节码编译为本地代码,进行简单、可靠的优化,如有必要将加入性能监控的逻辑。c2编译会启用一些编译耗时较长的优化,甚至进行一些激进优化。
https://mp.weixin.qq.com/s/t1Cx1n6irN1RWG8HQyHU2w
从实际案例聊聊Java应用的GC优化
https://mp.weixin.qq.com/s/feJKRqYJTVEIxl6jvjevAg
咱们从头到尾说一次Java的垃圾回收
您的打赏,是对我的鼓励