应该说,这次面试是比较正儿八经的Java面试,是面对面的。
比赛项目表 记录项目情况 项目编号 项目名称 项目类型 项目比赛时间
数据结构名 | 说明 | |
比赛项目表 | 记录项目情况 | 项目编号 项目名称 项目类型 项目比赛时间 |
班级得分表 | 记录班级得分 | 项目编号 项目名次 项目得分 班级总分 班级编号 |
成绩表 | 比赛成绩记录 | 项目编号 项目名称 运动员编号 成绩 名次 |
运动员 | 运动员基本信息 | 姓名 性别 学号 班级编号 |
service是业务层,dao是数据访问层
DAO层:
DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。
Service层:
Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。
Controler层:
Controler负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
1、ArrayList中的remove方法中,在遍历元素时如果符合删除条件,会将该元素从数组中删除,并且将后一个元素移动(这时候如果下一个元素与当前元素相同,也会向前移动一位)至当前位置,导致下一次循环遍历时后相同元素并没有遍历到,所以无法删除。针对这种情况可以倒序删除的方式来避免;
2.使用for-each法删除的话可能出现ConcurrentModificationException
foreach写法是对实际的Iterable、hasNext、next方法的简写,问题处在fastRemove方法中,
private void fastRemove(int index){
modCount++;
intnumMoved=size-index-1;
if(numMoved>0)
System.arraycopy(elementData,index+1,elementData,index,numMoved);
elementData[--size]=null;// Let gc do its work
}
可以看到第一行把modCount变量的值加一,但在ArrayList返回的迭代器(该代码在其父类AbstractList中)
public Iterator iterator() {
return new Itr();
}
这里返回的是AbstractList类内部的迭代器实现private class Itr implements Iterator,看这个类的next方法:
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
第一行checkForComodification方法:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
这里会做迭代器内部修改次数检查,因为上面的remove(Object)方法修改了modCount的值,所以才会报出并发修改异常。要避免这种情况的出现则在使用迭代器迭代时(显示或for-each的隐式)不要使用ArrayList的remove,改为用Iterator的remove即可。
现在看这些问题,感觉又挺基础的,也不难,但是面试的时候甚至觉得对方故意难为我。还是自己基础不扎实,感觉还是欠缺一点整体上的理解。。。。距离大公司还是有一点差距的。
内心还是有点难过的。。。。