java编程技巧累积(持续更新)

java 编程技巧累积

  1. 对象深复制
  2. ShutdownHook
  3. LRUMAP
  4. 单例模式
  5. Mysql insert/update IGNORE的利用
  6. 更多…

对象深复制

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();
}
});
//lambda
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;
// 这里隐藏了一个空的私有构造方法
//private Singleton () {
// System.out.println("Here");
//}
}
//If you then added another class with a main() method like
public static void main(String[] args) {
System.out.println(MySingleton.INSTANCE);
}
//You would see
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表示,如果中已经存在相同的记录,则忽略当前新数据;
坚持原创技术分享,您的支持将鼓励我继续创作!
分享