java 编程技巧累积
对象深复制
ShutdownHook
LRUMAP
单例模式
Mysql insert/update IGNORE的利用
更多…
对象深复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @SuppressWarnings ("unchecked" )public static <T> T deepCloneObject (T obj) { try { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(obj); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in =new ObjectInputStream(byteIn); return (T)in.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null ; }
添加ShutdownHook,监听程序关闭事件,在关闭之前执行相关操作 1 2 3 4 5 6 7 8 9 10 11 12 Runtime.getRuntime().addShutdownHook(new Thread(){ @Override public void run () { httpServer.destroy(); producer.close(); } }); Runtime.getRuntime().addShutdownHook(new Thread(() ->{ httpServer.destroy(); producer.close(); }));
单例模式 在Java对象的创建时,单例模式使用尤其多,同时也是个面试必问的基础题。很多时候面试官想问的无非是懒汉式的双重检验锁。但是其实还有两种更加直观高效的写法,也是《Effective Java》中所推荐的写法。
1.静态内部类(static nested class)
1 2 3 4 5 6 7 8 9 10 11 public class Singleton { public static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton () {} public static final Singleton getInstance () { return SingletonHolder.INSTANCE; } }
2.枚举法(Enum)
在《Effective Java》最后推荐了这样一个写法,简直有点颠覆,不仅超级简单,而且保证了线程安全。这里引用一下,此方法无偿提供了序列化机制,绝对防止多次实例化,及时面对复杂的序列化或者反射攻击。单元素枚举类型已经成为实现Singleton的最佳方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public enum Singleton { INSTANCE; } public static void main (String[] args) { System.out.println(MySingleton.INSTANCE); } Here INSTANCE
对于一个标准的enum单例模式,最优秀的写法还是实现接口的形式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public interface MySingleton { void doSomething () ; } public enum Singleton implements MySingleton { INSTANCE { @Override public void doSomething () { System.out.println("complete singleton" ); } }; public static MySingleton getInstance () { return Singleton.INSTANCE; } }
LRUMAP LRUMAP是在有限的集合里面,如果存储的时候,数据超出了限制,那么就淘汰最近未使用的数据,实际上是一种资源调度的算法。操作系统的内存管理实际上就是一种LRU调度,在我们的程序中,如果想使用本地缓存来实现LRU的调度,使用apache common-collections框架中的LRUMAP不失为一种很好的选择。LRUMap是非线程安全
Mysql中INSERT IGNORE INTO和REPLACE INTO的使用
insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
replace into表示插入替换数据,需求表中有PrimaryKey,或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;