Java相关
文章平均质量分 88
Jacky-止涯
这个作者很懒,什么都没留下…
展开
-
String字符常量池和intern()
常量池(Constant Pool)指的是在编译期被确定,并被保存在已编译的class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 JVM在运行的时候,会装进存在于.class文件中的常量池。 常量池在运行中,是可以扩展的,如String.intern()方法:先检查常量池里有没有相同Unicode的常量,没有则添加,然后返回此String的引用。原创 2013-05-31 00:45:16 · 1525 阅读 · 0 评论 -
比较两个List是否相等(相同元素)
我们看看如何比较两个数组相等。数组是一个连续的内存空间,所以一般来说,两个数组相等,就是意味着他们有相同的长度,相同的元素,以及相同的顺序。我们看看JDK的Arrays.equals()实现就一目了然了。 public static boolean equals(int[] a, int[] a2) { if (a==a2) return true;原创 2015-01-18 16:21:31 · 51476 阅读 · 2 评论 -
String的不可变性
String是所有语言中最常用的一个类。我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类。String类不可变性的好处1.只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是转载 2015-01-18 23:46:51 · 829 阅读 · 0 评论 -
初探Java序列化(Serialization)
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化Deserialization是一种将这些字节重建成一个对象的过程。【字节流的来回转换】Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。将对象状态转换成字节流之后,可以用java原创 2015-02-26 22:24:03 · 3246 阅读 · 0 评论 -
JDK-CountDownLatch-实例、源码和模拟实现
CountDownLatch作为一个同步的计数器,可以统一线程组的开始和结束,让我们来探探其内部实现。并且一起讨论,其实现是否可以通过原子类来替代呢?原创 2013-09-14 12:34:40 · 1448 阅读 · 0 评论 -
Reactor反应器模式
最近学习NIO,看《Netty权威指南》的时候,讲JDK1.5的NIO提到了Reactor模式。所以参考《Netty权威指南》,结合JDK的NIO中Selector来简述一下Java中Reactor模式的实现。原创 2015-02-28 20:42:46 · 1064 阅读 · 0 评论 -
JDK-Future 模式和实现
最近的项目用到了多线程,发现java.util.concurrent.Future蛮好用的。像平时,写多线程一般使用Thread/Runnable,直接扔给线程池执行就好了。但是遇到了一些需要获取线程执行结果的情况,就需要使用Callable。对于使用Callable的task,ExecutorService执行后会返回一个Future对象来传递执行结果。那这个Future是怎么存放返回值原创 2013-09-15 21:45:54 · 3410 阅读 · 1 评论 -
初探Java序列化(2)-writeObject/readObject
上一篇《初探Java序列化(Serialization)》给我们大体介绍了什么是序列化和反序列化,以及解析了一下序列化出来的文件。接着我们看看JDK具体如何序列化一个Object。 在序列化过程中,虚拟机会试图调用对象类里的writeObject() 和readObject(),进行用户自定义的序列化和反序列化,如果没有则调用ObjectOutputStream.defaultW原创 2015-02-26 22:36:14 · 7855 阅读 · 0 评论 -
草稿note
public class DownloadExcelService implements DownloadService {private static final Logger LOG = Logger.getLogger(DownloadExcelService.class.getName());protected static final char[] SUB_SPACE =原创 2013-08-22 00:31:33 · 859 阅读 · 0 评论 -
Class的生命周期
Class的生命周期就是指一个class文件(字节码)从加载到卸载的全过程。当一个类被装载、连接、初始化后,它的生命周期就开始了,当代表该类的Class对象不再被引用、即已经不可触及的时候,Class对象的生命周期结束。那么该类的方法区内的数据也会被卸载,从而结束该类的生命周期。一个类的生命周期取决于它Class对象的生命周期,经历加载、连接、初始化、使用、和卸载五个阶段。原创 2014-11-16 20:44:43 · 2075 阅读 · 0 评论 -
单例 变 多例--多ClassLoader实例加载
最近做项目,要把一个服务线程Worker做成单例模式。但是,在多ClassLoader的情况下,很难控制实例的数量。 类加载层次 我们系统为了方便各个服务热启动,给每个服务分配一个ClassLoader实例,来实现动态加载。结合JDK的ClassLoader加载链,可以分成下面5层:BootstrapLoader -> ExtClassLoader -> App原创 2015-10-11 17:17:51 · 5162 阅读 · 6 评论 -
Unique ID的特性需求分析
UniqueID在一个真实的系统里可能也可以承担更多的作用。概括起来主要有以下几点:l 唯一性l 时间相关l 粗略有序l 可反解l 可制造转载 2016-02-01 11:17:24 · 1449 阅读 · 0 评论 -
Unique ID策略
下面对比几个典型的Unique ID策略。程序号采用分配的形式,每个进程/线程启动的时候申请一个唯一的WorkerID,关闭的时候再回收。20bit能支持100w个WorkerID,应该也够用了。WorkerID可以通过Redis/ZK/MySQL/单独服务来管理。转载 2016-02-01 11:35:45 · 2448 阅读 · 0 评论 -
生成唯一序列号 Unique ID
程序取号的锁竞争和网络延迟是不可避免的,所以最理想的Unique ID策略还是本地生成:把发号器内嵌到每个程序中,同时保证生成标准的同步。原创 2016-02-01 11:07:36 · 11856 阅读 · 1 评论 -
类的初始化&实例化顺序
讲到类的初始化和实例化,不得不提提初始化和实例化的顺序,我想这也是一直困扰了很大一部分人。 从大流程来说,类肯定是先初始化,再实例化的:静态域 --> 实例域 --> 构造函数。另外要符合任何子类的动作都会触发父类:父类 --> 子类。所以得出原则:【先静态后实例;先父类后子类】 而且同一个域的顺序可以分成两步: 创建-->赋值原创 2014-11-16 20:59:51 · 3844 阅读 · 1 评论 -
反射破坏单例的私有构造函数保护
Java的反射破坏单例的私有构造函数保护,最典型的就是Spring的Bean注入,我们可以通过改造私有构造函数来防止。原创 2014-03-09 12:25:15 · 3160 阅读 · 6 评论 -
JDK自动拆箱下,三目运算符的潜规则
三目运算中, Java自动拆箱的潜规则,一不留意就会抛NullPointerException原创 2014-06-25 01:03:37 · 5452 阅读 · 1 评论 -
JDK1.7-LinkedList循环链表优化
最近在看jdk1.7的时候,发现了一个LinkedList的改良,baidu了一把,发现还没有人讨论这个问题。所以我自己思考了一下,在这里和大家分享,讨论一把!欢迎大家拍砖,讨论起来,把这个问题搞明白 : ) 首先,简单介绍一下LinkedList:LinkedList是List接口的双向链表实现。由于是链表结构,所以长度没有限制;而且添加/删除元素的原创 2012-11-26 21:48:55 · 4632 阅读 · 5 评论 -
JVM关闭钩子(1) —— 概念和应用
Hook-钩子钩子(Hook) ,是一个处理消息的程序段,用于Windows消息处理机制,通过系统调用,把它挂入系统,当特定事件触发的时候执行。 如键盘钩子截获键盘消息,外壳钩子截取、启动和关闭应用程序的消息等。钩子也可以理解为WINDOWS留给我们的后门,通过钩子可以参与到WINDOWS事件的处理。很多木马程序就是通过添加钩子来监视用户的行为。 相当于我们先建立一个事件列表,然原创 2013-05-16 02:53:53 · 1783 阅读 · 0 评论 -
JVM关闭钩子(2)—— 源码浅析
上一篇《JVM关闭钩子(1)—— 概念和应用》简单解释了什么是钩子,并且举例说明了Java中关闭钩子的使用,现在我们来深入了解,Java中怎么实现这个关闭钩子的。 主要通过java.lang.Shutdown和java.lang.ApplicationShutdownHooks 这两个工具类来实现。Shutdown负责触发钩子,而ApplicationShutdownHook原创 2013-05-16 03:46:25 · 3349 阅读 · 0 评论 -
eclipse_64位 反编译插件:jadclipse3.3
今天,刚刚换了个固态硬盘,顺便装了一个64的win7,感觉速度的确提高了一大截,但是接踵而来也有很多麻烦,原来32位的软件大部分用不了。 eclipse换成64位的eclipse4.2,没想到原来的反编译插件decompiler也用不了了,报错如下:java.lang.UnsatisfiedLinkError:……\jd-eclipse.dll: Can't load IA原创 2013-06-02 19:26:28 · 4490 阅读 · 3 评论 -
JDK1.7-String源码详解
String表示字符串,是char的有序集合,在java中所有的字符串值,都是String的实例。 String类提供了很多方法,如获取字符串中的字符,比较字符串,查询字符等。 Java给String的 + 操作提供了很好的支持,相加后会返回一个字符常量结果。 String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象。所以原创 2013-06-01 02:23:47 · 2580 阅读 · 0 评论 -
JDK1.7-StringBuilder源码详解
StringBuilder是一个可变字符序列 (字符串)。和String相比,两者都是字符串,都是字符的有序排列;不同的是,String是不可变的,而StringBuilder是可变的。 StringBuilder和StringBuffer几乎一样,只是前者没有同步处理,更加高效。因此,这两者的操作逻辑几乎是一样的,可以通过一个抽象的父类AbstractStringBuilder来原创 2013-06-02 20:36:49 · 1928 阅读 · 0 评论 -
JDK1.7-Arrays源码详解
Arrays此类包含数组操作的各种方法(比如排序和搜索)。此类还包含一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为null,则此类中的方法都会抛出 NullPointerException Arrays的主要方法:sort(),binarySearch(),equals(),copyOf(),toString()等。 sort我们先看看排序方法原创 2013-06-04 08:24:03 · 1779 阅读 · 1 评论 -
JDK-Map源码浅析——IdentityHashMap
java.util.IdentityHashMap 类也是一种哈希表实现的Map接口,该类不是 通用 Map 实现。此类实现 Map 接口时,它有意违反 Map的常规协定,比较键/值时使用引用相等性代替对象相等性,不使用hashcode,而只使用Object.equals()。 这里相等性比较的是地址:key1==key2,所以只有两个对象的地址相等才认为相等,是最严格的相等条件原创 2013-05-16 20:22:08 · 1521 阅读 · 0 评论 -
Import原理,避免误区
import在java中是非常普遍的关键字,只要是会java基础的人肯定会用,但如果不了解他的其原理,很容易会进入理解的误区。原创 2013-11-03 22:15:01 · 3582 阅读 · 0 评论 -
JVM类加载机制-ClassLoader
类的加载何为类加载器,简单的说就是JVM通过类加载器ClassLoader,把.class文件中的信息,拼装成Class对象放入内存中。JVM的类加载器,就是字节码和JVM的桥梁。如下图所示,我们写好的.java文件经过编译器,编译成.class的二进制文件(字节码),然后通过类加载器把.class文件读到内存中,组成我们使用的Class对象。类加载到JVM内存原创 2013-11-05 23:43:54 · 2682 阅读 · 1 评论 -
初探JVM-ClassLoader源码
之前简单介绍了一下JVM中的ClassLoader,现在我们再来看看ClassLoader的源码。ClassLoader 首先,我们看看ClassLoader的构造方法,如果不传入参的话,默认父加载为SystemClassLoader默认加载器。protected ClassLoader() { this(checkCreateClassLoader原创 2013-12-02 01:21:05 · 2330 阅读 · 1 评论 -
DAO模式
DAO(Data Access Object)模式实际上是两个模式的组合,即DataAccessor 模式和 Active Domain Object 模式。其中DataAccessor模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式实现了业务数据的对象化封装,一般我们将这两个模式组合使用。Data Accessor模式实现了数据访问和业务逻辑的分离:就转载 2014-03-17 00:42:12 · 1329 阅读 · 0 评论 -
浅谈JDK的File.equal()
java.io.File.equal()比较两个File对象是否指向同一个文件,但实际上不同系统的文件系统中,需要小心使用,以免被坑。原创 2014-06-28 00:36:02 · 2864 阅读 · 0 评论 -
ThreadLocal失效
在JDK中,解决线程冲突问题,有两种解决方案:l 给临界区加锁;l 本地化临界区。第一种解决方案的典型代表是Synchonized。第二种的典型代表是ThreadLocal。而CopyOnWrite是这两种方案的融合。原创 2016-03-08 15:11:08 · 3724 阅读 · 0 评论