CSDN话题挑战赛第2期
参赛话题:面试宝典
面试流程
面试后端开发者,共一面,大概十几分钟,线下面试,面试内容就是平时的基础题,还有一些项目经验和功能,最后还有几道算法题。
面试题
面试题一:
List是什么?
问题剖析:
list是一个有序的集合(也是被称为序列),list中允许重复元素的存在。是分为三种,Vector,ArrayList,LinkList。
问题解答:
1.1 ArrayList
内部是通过动态数组实现,它允许对元素进行快速随机访问
扩容机制:当不够内存时,就会创建一个length为当前的1.5倍的数组,然后进行复制,移动,成为一个新的数组。
优点:利于查询和遍历
缺点:不利于删除插入,因为进行增删操作需要对已知数组元素进行移动,操作繁杂
/** * 扩容机制:当不够内存时,就会扩大为当前数组长度的1.5倍 * ArrayList是有序的,ArrayList使用线性顺序存储结构,和数组一致, * 每个对象有一个index,index本身是有序的,所以你添加的时候, * index有序增长,遍历的时候,按照index遍历,也是有序的。 */ public class ArrayListTest { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("1"); //坐标为0 list.add("5"); list.add("3"); System.out.println(list);//[1,5,3] //插入坐标为2的元素2 list.add(2,"2"); System.out.println("插入坐标数组链表为:"+list);//1 5 2 3 int size = list.size(); System.out.println("数组链表长度为:"+size);//4 String s = list.get(0); System.out.println("坐标为0的元素是"+s);//1 boolean contains = list.contains("5"); System.out.println("元素5是否在数组链表中?"+contains);//true boolean empty = list.isEmpty(); System.out.println("该数组链表是否为空?"+empty);//false //遍历数组元素及坐标 //①for循环 for (int i =0;i<list.size();i++){ //坐标为0的元素是1 坐标为1的元素是5 坐标为2的元素是2 坐标为3的元素是3 System.out.println("坐标为"+i+"的元素是"+list.get(i)); } //②foreach循环:顺序遍历所有元素 for (String s1: list){ //没有坐标显示的,但是是顺序遍历出来数组 //坐标为0的元素是1 //坐标为1的元素是5 //坐标为2的元素是2 //坐标为3的元素是3 System.out.println("遍历数组为:"+ s1); } //③使用迭代器 list.remove("1");//删除元素1 //5 2 3 list.remove(2);//删除坐标为2的元素 // 1 2 list.indexOf("5"); System.out.println("删除后数组为:" + list); // 1 2 } }
1.2 Vector
是通过数组实现的,不过它支持线程的同步访问,即同一时间内,只能做一件事情。
优点:避免多线程同时进行带来的不一致性
缺点:但实现同步需要花费时间很多,而且只能做完一个事件才能进行下一个,访问速度慢
1.3 LinkList
双向链表,链表的每个元素都是具有两个节点的,每当移动或者删除时,就会同时变更
优点:适合增删
缺点:查询遍历慢,因为需要一个一个的往下查找遍历,所以时间复杂度为O(n)。
public class LinkedListTest { public static void main(String[] args) { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("2");//坐标为0 linkedList.add("6"); linkedList.add("4"); linkedList.add("8"); System.out.println("增加元素后链表为" + linkedList);//2 6 4 8 linkedList.add(2,"3"); System.out.println("插入坐标为2的元素3时,链表为" + linkedList); // 2 6 3 4 8 String index3 = linkedList.get(3); System.out.println("坐标为3的元素为:" + index3); //4 boolean contains = linkedList.contains("4"); System.out.println("元素4是否在链表中?" + contains);//true boolean linkedListEmpty = linkedList.isEmpty(); System.out.println("链表是否为空?" +linkedListEmpty); //false //遍历第一种方法 for(int i=0 ; i<linkedList.size();i++){ //坐标为0的元素为2 //坐标为1的元素为6 //坐标为2的元素为3 //坐标为3的元素为4 //坐标为4的元素为8 System.out.println("坐标为"+i+"的元素为"+linkedList.get(i)); } //遍历第二种方法,str是每次取一个元素出来 for(String str: linkedList){ System.out.println(str);//2 6 3 4 8 } System.out.println("第一个元素" + linkedList.getFirst());//2 System.out.println("最后一个元素" + linkedList.getLast());//8 linkedList.remove(1);//删除坐标为1的元素 linkedList.set(0,"0"); //把坐标为0的元素改为0 System.out.println(linkedList); //0 3 4 8 } }
面试题二:
java异常分类
问题剖析:
考察Error和Exception区别,Exception又分为两种
问题解答:
1.1 Error
指java运行时系统内出现错误和资源耗尽错误。是程序无法处理的错误
资源耗尽错误指的是 超过idea设置编译器内存默认范围时会报这个错。
1.2 Exception
是程序本身可以处理得异常
①RuntimeException
运行时抛出异常,比如最简单的NullPointerException,IndexOutOfBoundsException
ClassCastException,但一定是程序员的错误,代表程序员的代码存在bug
解决办法:修改bug
②CheckedException(检查异常)
编译时出现异常,系统
解决办法:这个要用try-catch捕获异常或者throws抛出异常
个人经验总结
尽量答全题目,不要忽略细节
资料总结/刷题指南
面试需要考察的大多数是基础题,还有几道算法题,基础题可以在网上找。