2020我也当了面试官-java面试题之一

2020我也当了面试官-java面试题之一

写在前面
  最近一段时间开始帮团队招聘一些1-3年的java开发人员,参与几场下来,发现有些面试官问的问题虽然基础,我却记忆有些模糊。大概是平常CRUD太多,忽略了基础知识的复习和积累,在这里对一些记忆不深的问题进行总结记录,然后温故而知新。问题中很多答案也是从网上搜集,能贴出链接的我会在答案下方贴出原文链接,用于延伸学习。
下面就是今天我面试摘录的面试题喽~

1.一个方法抛了三个异常,怎么排异常的顺序?
  问题可以转变为,如下代码,是否可通过编译?

 import java.io.IOException;  
public class ExceptionTryCatchTest {  
    public void doSomething() throws IOException{  
        System.out.println("do somthing");  
    }  
    public static void main(String[] args){  
        ExceptionTryCatchTest etct = new ExceptionTryCatchTest();  
        try {  
            etct.doSomething();  
        } catch (Exception e) {       
        } catch (IOException e) {  
               }  
    }  
} 

  答:不能编译通过。因为编译的时候会报错:已捕捉到异常 java.io.IOException。 catch(IOException e)这句有错误。
   对于try…catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch (Exception e) {}里面,先和Exception匹配,由于IOException extends Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch (Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。
2.有一个三层循环,如何在第三层循环中跳出的第一层循环?
  break n和continue n。其中n表示标签名。只是在Java中只能在for、while、do…while三种循环语句前面定义,标签与循环体之间不能有任何其他的语句。
3.字节流和字符流的区别?
  字节流 InputStream OutputStream ,字符流 Reader Writer ,这都是都是抽象类。
  下面的具体实现
  字节流 FileInputStream FileOutputStream
  字符流 FileReader FileWriter
  在开发之中,对于字节数据处理比较多,例如,图片,电影,文字,而字符流最大的好处是它可以进行中文的有效处理。如果在日常开发中有中文处理,用字符流,如果没有,建议使用字节流。
下面的贴写的很好,可以好好看看。
https://www.zhihu.com/question/39262026
4.ArrayList的特点?与LinkedList的区别?
  ArrayList,与LinkedList都是属于实现了List接口的类。首先从名字前缀开始看 ,Array表示数组,Link表示链表。
  ArrayList底层是基于动态数组的。而LinkedList底层是基于双向链表的。
  ArrayList必须是连续内存的,而LinkedList不要求连续内存。
  ArrayList查询快,增加和删除慢;LinkedList增加和删除快,查询慢。
  ArrayList 底层为动态数组,所以查询时是直接通过访问下标,查询效率高。而增加而删除时,为了保证内存的连续,增加和删除某一位置后,后方元素都得向前移动一位,
最坏情况就是删除第一个元素,则后面第2个到第n个元素都得往前移动一位。所以增加删除慢。
  LinkedList底层为双向链表,不必保证内存上的连续,所以增删快,而查询时必须要经历从头到尾的遍历,所以查询慢。
为什么说ArrayList是基于动态数组呢?一般的数组,容量确定了就不可以再更改,也无法超过。但是ArrayList可以,
  例如当数组元素数已满时调用了add方法向尾部添加一个元素,则此时会进行扩容,ArrayList会自动创建一个更大的数组,并将所有元素拷贝到新数组中,而原数组会被抛弃,会被GC回收。扩容后新数组的容量为原来的1.5倍。
5.new一个数组,在内存中如何存储?
  实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。
在这里插入图片描述
6.TCP协议和UCP的协议?
  TCP协议:是一个传输层协议,提供可靠的字节流服务,可以将大块数据分割成以报文段(segment) 为单位的数据包进行传输,并且可以确认数据最终成功送达对方。TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。
  (1)、三次握手:握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement) 。
   第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
   第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
   第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。
  UDP协议:无连接协议,也称透明协议,也位于传输层。
  TCP和UCP协议的区别?
1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。
7 数组和链表的区别?

  • 链表是链式的存储结构;数组是顺序的存储结构。
  • 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
  • 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
  • 数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
    https://blog.csdn.net/qq_35044419/article/details/88580775
    8.Jquery和Js的对象如何转换?
      两种转换方式将一个jQuery对象转换成js对象:[index]和.get(index);
  • (1)jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的js对象。
如:var $v =$("#v") ; //jQuery对象 
var v=$v[0]; //js对象 
 alert(v.checked) //检测这个checkbox是否被选中 
  • (2)jQuery本身提供,通过.get(index)方法,得到相应的js对象
     如:var $v=$("#v"); //jQuery对象 
   var v=$v.get(0); //js对象 
   alert(v.checked) //检测这个checkbox是否被选中
  • js对象转成jQuery对象:
对于已经是一个js对象,只需要用$()DOM对象包装起来,就可以获得一个jQuery对象了。$(js对象)
如:var v=document.getElementById("v"); //js对象 
var $v=$(v); //jQuery对象 

猜你喜欢

转载自blog.csdn.net/weixin_39446297/article/details/106131036