Antkillerfarm Hacking V7.5

language » Java(一)

2017-05-24 :: 5816 Words

Java

Java反射机制

Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。

参见:

http://blog.csdn.net/yongjian1092/article/details/7364451

Java反射机制详解

反射机制的一个副产品是可以访问私有变量和私有方法。(笔试题的常客)

http://blog.csdn.net/nisaijie/article/details/5692901

java反射访问私有变量和私有方法

JavaFX

使用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:哪个更适合您?

Ubuntu安装Oracle JDK

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

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)自定义注解入门

main函数

和一般的C/C++程序只有一个main函数不同,Java允许每个类都有自己的main函数。只要在程序执行时,指定使用某个类的main函数即可,这个类被称作“主类”。

这种设计方式对调试程序、模块测试很有帮助。我们可以设定某个小模块中的类为主类,来单独测试该模块,而不必将整个系统运行起来。

static block

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

POJO(Plain Ordinary Java Object):简单的Java对象。

这个名词被创造出来,用以和JavaBean做一个区分。后者通常是被容器所创建,还要实现Serializable接口用于实现Bean的持久性。

IntelliJ IDEA

Alt+Enter:自动import

双编辑窗口:在代码的标签上右键->Split Horizontally

Java各集合类的比较

有序否 允许元素重复否
Collection
List
Set AbstractSet
HashSet
TreeSet 是(用二叉树排序)
Map AbstractMap 使用key-value来映射和存储数据,Key必须惟一,value可以重复
HashMap
TreeSet 是(用二叉树排序)

HashMap

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 & SLF4J & Logback

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是怎么来的?

Save/Load序列化对象

代码:

https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/java/HanLP/KnowlegeModel.java

要点:

1.implements Serializable接口。不但对象本身要实现,它包含的子对象也要实现该接口。

2.save/load函数。

3.不想序列化的成员使用transient关键字修饰。

Guava

Guava: Google Core Libraries for Java。这个库提供了很多JDK没有包含的基础功能,非常不错。

官网:

https://github.com/google/guava/wiki

Netty

如果没有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模型

synchronized

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中的线程池,这一篇也许就够了!

JVM

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的垃圾回收

Fork me on GitHub