10月23日踩坑记录:
1、list在循环中不能使用remove进行删除;
2、list的foreach循环实际上是创建了一个迭代器Iterator对象进行遍历;
3、之所以不用迭代器Iterator进行遍历一方面是因为一个Iterator对象对于同一个list只能遍历一次,遍历时游标cursor自增,等于list.size()后该对象无法再次遍历,只能创建一个新的对象,与foreach原理是一样的。但相对而言foreach使用更加简单;
4、之所以foreach循环中不能删除对象是因为当移除对象后foreach内部会有个成员属性发生变化(具体不记得了),由于该变化会抛出异常;但Iterator会将变化后的成员属性变回原来的,不会抛出异常;
5、ArrayList本质还是一个数组,只不过是动态的,它并不是线程安全的;
6、Vector是线程安全的,因为内部对每一个元素都加了synchronize,但也由于这样的原因,Vector创建的List效率极低,因此一般都使用ArrayList;
7、TreeSet、HashSet都会进行去重,TreeSet会进行排序,HashSet则是乱序,但该乱序在一般情况下只会生效一次,因为HashSet的乱序实际上是对对象内部的成员变量在堆中的地址进行Hash计算后得到的Hash值进行排序,而成员属性在堆中的地址是由该属性在方法区常量池中的地址决定的,而常量池中常量的地址又是固定的,因此同一个对象在一个HashSet中的位置一般情况下其实是固定的;
8、如果想要HashSet进行不停的乱序,解决方法是在加入HashSet的元素对象中加入一个随机数成员属性,在对应的构造方法中通过随机数对该成员属性进行初始化,这样每次通过Hash算法算出的该对象的Hash值就是不一样的,排序的结果就是不一样的;
9、Mybatis中通过<choose><when><otherwise>进行if、else操作;
10、duplicate key update进行不删除对比更新,但需建立唯一主键;