静态代码块、构造代码块,成员变量,构造方法
- 静态代码块只执行一次,所以比较合适的还是放在单例的类里面,做一些初始化的事情,且优先于任何类里面的东西,除非有
修饰的别的变量或者方法,在他之前。static
- 构造代码块优先级也很高,但是低于静态代码块和成员变量,无论是否是
的成员变量,因此可以做一些成员变量的防空判断在构造代码块里面。static
- 构造方法,优先级低于前两个,但优于普通方法,所以你想要调用一个类里面的public方法的话,必须先
,用new出来的对象才可以new
出来该方法。.
思考:那么一个类里面的public static的方法,是什么时候加载的呢?
答案:一个类里面所有static修饰的东西(代码块,变量,方法),是按照你写的顺序去执行的。
获取随机数的注意项
今天用findbugs扫了一下项目,果然有惊喜,发现很多当初想当然的错误。其中有个粗心大意的错就是获取一个0-999的随机数的方法。
return (int)Math.getRandom() * 1000
自己也是太久没写了,有点忘记优先级了,以为先算的乘法,被findbug扫出来了,才知道,这个方法始终会获得
,自己修改了之后加了个括号。但是看到findbugs上面的建议,是用
Random.nextInt()
这个方法。才知道其实
java.util
包下面其实早就帮我们想好了,只不过自己还是用
Math
里面的自己乘,有点笨了。

Collection接口
自己想写一个判断一个List是否为空的方法,但是想到虽然List用的最多,但是还是多抽一层吧,因此想到用
Collection
,然后用的泛型
E
,但是真好玩,当你用泛型类的话,你的方法前面就要多加一个东西来表明你是个泛型。通常一个方法就
public/private
+
static/不加
+
返回值的类型
+
方法名
+
参数(形参/实参)
。但是泛型的方法,就多了
<E> / <T>
public static <E> boolean collectionEmpty(Collection<E> collections) {
if (collections == null || collections.size() == 0) {
return true;
}
return false;
}
instanceof用法
一般来说,当你写一个通用方法,里面的参数是
Object
、
E
、
T
,会用到这个
instanceof
来判断参数的类型。但是该方法有个很好玩的点是,如果你传进来的是
List
和
Set
,那么你去直接
instanceof
这两个类的话,是可以的,但是你如果去
instanceof
他们的父类
Collection
的话,也是
true
。因此这个用法还是最好精确到你想要直接操作的类。
FaEntity fa = new SonEntity();
if (fa instanceof FaEntity) {
System.out.println("---- fa ---");
}
if (fa instanceof SonEntity) {
System.out.println("---- son ---");
}
SonEntity son = new SonEntity();
if (son instanceof FaEntity) {
System.out.println("---- fa111 ---");
}
if (son instanceof SonEntity) {
System.out.println("---- son111 ---");
}
运行结果:
---- fa ---
---- son ---
---- fa111 ---
---- son111 ---
Map的循环
如果单纯拿值的话,可以用
keySet
,但是循环遍历整个map的话,还是推荐用entrySet来遍历。
Map<String, TestEntity> nowDevs = new HashMap<>();
Set<Entry<String, TestEntity>> entrySet = nowDevs.entrySet();
for (Entry<String, TestEntity> iterater : entrySet) {
System.out.println(iterater.getKey());
System.out.println("---------------");
System.out.println(iterater.getValue());
}
Set如何保证去重?
其实就是根据你add进去的
E
的
hashcode
和该类里面的
equals
方法,因此想要改变一个
E
放进
Set
里面的规则的话,只需要
@Override
hashCode
和
equals
就可以了。
简单的例子来说:在我们的实体类里面,跟DB里面的数据应该是对应的。所以
primary key 'ID'
应该是唯一的,所以可以单纯的去用
ID
去判断是否是同一个entity。