生活总是一坑伴随着一坑 坑坑不休。。。
1.找不同
gameRoom.getId() + (gameRoom.getMatchid() != null ? gameRoom.getMatchid() : 0) + gameRoom.getOrgi()
与
gameRoom.getId() + gameRoom.getMatchid() != null ? gameRoom.getMatchid() : 0 + gameRoom.getOrgi()
前者的结果是几个字段连接起来的值 后者就是matchId的值
2.注意单线程与多线程类被加载里面static成员变量与非static成员变量的不同,比如虽然ScheduledExecutorService.scheduleWithFixedDelay()设置了延时为1s,但多次运行,就会发现很多个线程同时再跑。
-----扩展:
1).在碰到new关键字,使用反射机制(class的new Instance、constructor的new Instance),使用clone等,会触发对象的创建。
2). 在分配内存之前,JVM首先会解析是否能在运行时常量池中定位到这个类的符号引用,定位之后会判断这个类是否已经被加载、解析、初始化。如果没有,则先进行类的加载。
3). 在确定对象需要创建之后,给对象开始分配内存,在分配内存的过程中,需要注意使用的是哪一种垃圾收集算法,因为垃圾收集算法的不同会导致内存块是否规整,也就影响到分配内存的方式是使用指针碰撞还是使用空闲列表。
4).在进行内存分配的时候,如果使用的是指针碰撞方法,还需要注意并发情况下,内存的分配是否是线程安全的。一般使用加同步块的方式和本地线程分配缓冲这两种方式解决线程安全的问题。
5). 内存分配完毕之后就是JVM对其内存块进行默认初始化,这也是对象的实例变量不需要显示初始化就可以直接使用的原因。
6). 从JVM的角度来看,一个对象就此创建完毕,但是从程序的角度来看,一个对象的创建才刚刚开始,它还没有运行<init>(实例初始化方法),所有的字段都还为默认值。只有运行了<init>之后,一个真正可用的对象才算产生出来。
静态块:
优先级最高,永远被最先加载;静态块是类的属性,只要是涉及到的类,都会被立刻加载(Test,Parent,Child);而且只在类加载时加载一次,与类同生命周期。
非静态块:
当调用构造函数时,会先调用自己类里面的非静态块;
不初始化就不会调用,每次调用构造函数,就会调用非静态块,可以调用多次
父类静态区 -> 子类静态区 -> 父类非静态区 -> 父类构造方法 -> 子类非静态区 -> 子类构造方法
3.String 转 json "{\"name\":\"1\",\"age\":\"1\"}"
4.