天天看点

java基础之静态代码块、构造代码块

静态代码块、构造代码块,成员变量,构造方法

  1. 静态代码块只执行一次,所以比较合适的还是放在单例的类里面,做一些初始化的事情,且优先于任何类里面的东西,除非有

    static

    修饰的别的变量或者方法,在他之前。
  2. 构造代码块优先级也很高,但是低于静态代码块和成员变量,无论是否是

    static

    的成员变量,因此可以做一些成员变量的防空判断在构造代码块里面。
  3. 构造方法,优先级低于前两个,但优于普通方法,所以你想要调用一个类里面的public方法的话,必须先

    new

    ,用new出来的对象才可以

    .

    出来该方法。
思考:那么一个类里面的public static的方法,是什么时候加载的呢?

答案:一个类里面所有static修饰的东西(代码块,变量,方法),是按照你写的顺序去执行的。

获取随机数的注意项

今天用findbugs扫了一下项目,果然有惊喜,发现很多当初想当然的错误。其中有个粗心大意的错就是获取一个0-999的随机数的方法。

return (int)Math.getRandom() * 1000

自己也是太久没写了,有点忘记优先级了,以为先算的乘法,被findbug扫出来了,才知道,这个方法始终会获得

,自己修改了之后加了个括号。但是看到findbugs上面的建议,是用

Random.nextInt()

这个方法。才知道其实

java.util

包下面其实早就帮我们想好了,只不过自己还是用

Math

里面的自己乘,有点笨了。

java基础之静态代码块、构造代码块

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。

个人复习java基础的小笔记,因此并没有太多的逻辑顺序在里面