java面试题

回眸只為那壹抹淺笑 提交于 2020-03-05 22:51:53

网上关于java的面试题随处可见,可比较宅的我仍然愿意总结到自己的博客中,希望对看到的小伙伴们有所帮助,答案仅供参考,也欢迎小伙伴们留言。。。

一、java基础

1.JDK 和 JRE 有什么区别?

  jdk是java开发工具包,提供了java开发环境和运行环境,它包含jre,还包含了很多java程序调试和分析工具。

  jre为java运行提供了所需环境。

  简而言之:如果需要运行java程序,只需安装jre就行,如果要编写java程序,需要安装jdk。

2.== 和 equals 的区别是什么?

  ==基本类型比较的的是值,引用类型比较的是地址值。

equals方法比较引用数据类型,所有的对象都会继承 Object 类中的方法,没有重写 Object 类中的 equals 方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性。

特例:

       当用equals()方法进行比较时,对类File、String、Date及包装类(WrapperClass)来说,是比较类型及内容而不考虑引用的是否同一对象;因为这些类重写了Object类的equals()方法。

 参考本人博客:https://blog.csdn.net/duan196_118/article/details/104092688

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

  不对。两个对象的hashCode相同,其equals不一定为true。看过上面参考博客的小伙伴会知道:

"如果两个对象相同,那么它们的hashCode应该相等。如果两个对象不相同,它们的hashCode可能相同"。

  1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

  2、如果两个对象不equals,他们的hashcode有可能相等。

  3、如果两个对象hashcode相等,他们不一定equals。

 4、如果两个对象hashcode不相等,他们一定不equals

4.final 在 java 中有什么作用?

   final是修饰符,意为最终的,不可变的。

   被final修饰的类叫最终类,不能被继承。

   被final修饰的方法不能被重写。

   被final修饰的变量为常量,常量必须初始化,初始化之后值就不能被修改。

5.java 中的 Math.round(-1.5) 等于多少?

   等于-1,Math.round(); 向上取整;

   关于Math类的更多用法参考博客:https://blog.csdn.net/duan196_118/article/details/104134461

6.String 属于基础的数据类型吗?

   String类不属于基础数据类型,能阐述基础数据类型有哪些,并介绍String类型的特点如它被final修饰,不能被继承等等更好。

7.java 中操作字符串都有哪些类?它们之间有什么区别?

  操作字符串的类有:String 、StringBuffer、StringBuilder。

 具体区别参考博客:https://blog.csdn.net/duan196_118/article/details/104135390

8.String str="i"与 String str=new String("i")一样吗?

  不一样,String str="i",jvm会将其分配到常量池中。而String str=new String("i")则会被分配到堆内存中。

9.如何将字符串反转?

  使用StringBuilder或StringBuffer的reverse方法。

10.String 类的常用方法都有那些?

     length();  返回字符串的长度

     split();  切割字符串,返回一个切割后的数组

     trim();  去除字符串首尾空格

     substring();  截取字符串

     replace();  字符串的替换

     contains(); 判断是否包含指定子串

     indexOf():返回指定字符的索引

     isEmpty();   判断字符串是否为空

     charAt();  返回指定索引处的字符

     getBytes();  返回字符串的byte类型数组

     equals();  字符串的比较

     toUpperCase();  转为大写

     toLowerCase();  转为小写

     startsWith();  以指定前缀开头

     endsWith();  判断字符串是否以指定后缀结尾

    java.lang.String是常见的一个类,它提供了很多方法,根据个人情况合理答出常用的方法即可。

11.抽象类必须要有抽象方法吗?

     不需要,抽象类可以有抽象方法和非抽象方法。

12.普通类和抽象类有哪些区别?

   普通类不能包含抽象方法,抽象类可以包含抽象方法。

   普通类可以直接被实例化,抽象类不能直接被实例化。

13.抽象类能使用 final 修饰吗?

   不能,被final修饰的类无法被继承,而抽象类就是让其它类继承的,若被final修饰就无法被继承了。

14.接口和抽象类有什么区别?

    1) 接口使用interface声明,用implements关键字来实现接口,抽象类用abstract声明,使用extends来继承。

    2)抽象类可以有构造函数,而接口不能有。

    3)抽象类可以有普通方法和抽象方法,而接口不能有普通方法(jdk1.8新特性:在一个接口里面有了一个实现的方法。只需要使         用 default关键字即可)

    4)接口不能定义静态方法,抽象类可以(jdk1.8之后可以)

    5)接口中的成员变量是静态常量,使用public static final修饰,抽象类可以定义静态常量也可以定义非静态常量

    6)一个类可以实现多个接口,但只能继承一个类。java是单继承多实现。

15.java 中 IO 流分为几种?

    按功能来分:输入流(input)、输出流(output)

    按类型来分:字节流和字符流

    可根据个人的情况对IO流做出介绍

16.BIO、NIO、AIO 有什么区别?

     BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

     NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

     AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

17. Files的常用方法都有哪些?

      Files.createDirectory():创建文件夹

      Files.exists():检测文件路径是否存在

      Files.createFile():创建文件

      Files.delete():删除一个文件或目录

      Files.copy():复制文件

      Files.move():移动文件

      Files.size():查看文件个数

      Files.read():读取文件

      Files.write():写入文件

18.你知道的开源协议有哪些?

       GPL (GNU General Public License) :GNU通用公共许可协议

  LGPL (GNU Lesser General Public License) :GNU宽通用公共许可协议

  BSD(Berkeley Software Distribution) :伯克利软件分发许可协议

  MIT(Massachusetts Institute of Technology):MIT之名源自麻省理工学院

  Apache (Apache License) :Apache许可协议

  MPL (Mozilla Public License) :Mozilla公共许可协议

19. 数据库中的范式有哪些?

  第一范式----数据库中的表(所有字段值)都是不可分割的原子数据项。

  第二范式----数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关。

  第三范式----数据库表中每一列数据都和主键直接相关,不能间接相关。范式是为了减小数据冗余。

20.什么是反射?

        java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性方法;对于任意一个对象都能调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能成为java的反射机制。

反射机制的讲解:https://blog.csdn.net/duan196_118/article/details/104105628

21.什么是 java 序列化?什么情况下需要序列化?

    序列化:将 Java 对象转换成字节流的过程。就是为了保存在内存中的各种对象的状态,并且通过反序列化可以把保存的对象再读出来。

   a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

   b)当你想用套接字在网络上传送对象的时候;

   c)当你想通过RMI传输对象的时候;

22.动态代理是什么?有哪些应用?

       当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:

     Spring的AOP

     事务

     权限

     日志

23.怎么实现动态代理?

    动态代理实现:

          首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

24.为什么要使用克隆?

   想要对一个对象进行处理,又想保留原有的数据进行接下来的操作,clone是最简单最高效的方法。

25.深拷贝和浅拷贝区别是什么?

     浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())

    深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)

26.常见的异常类有哪些?

      ArithmeticException:数学异常。例如,一个整数“除以零”时,抛出此类的一个实例。 

     ClassCastException:强转异常,当试图将对象强制转换为不是实例的子类时,抛出该异常。

     NullPointerException:当应用程序试图访问空对象时,则抛出该异常。

     SQLException:提供关于数据库访问错误或其他错误信息的异常。

     IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 

     NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

     NoSuchMethodException:无法找到某一特定方法时,抛出该异常。

     FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。

     IOException:当发生某种I/O异常时,抛出此异常。

     IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。

     SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。

     UnsupportedOperationException:当不支持请求的操作时,抛出该异常。

     RuntimeException:是那些可能在Java虚拟机正常运行期间抛出的异常的超类。

27.throw 和 throws 的区别?

    throw是手动抛出一个具体的异常。

    throws是在方法声明处抛出一个异常,声明异常但不处理异常,谁调用我就让其处理异常。

    throw,如果执行了,那么一定是抛出了某种异常了,而throws表示可能出现,但不一定。

28.final、finally、finalize 有什么区别?

     final是修饰符,意为最终的,不可变的。 被final修饰的类叫最终类,不能被继承。被final修饰的方法不能被重写。被final修饰的变量为常量,常量必须初始化,初始化之后值就不能被修改。

     finally一般作用在try-catch中,在处理异常时将一定要执行的代码放到finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。

     finalize是Object类的一个方法,改方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize(),回收垃圾。 

29.try-catch-finally 中哪个部分可以省略?

      好多人认为try-catch语句是放在一起不能省略的。其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。

切记:catch和finally语句不能同时省略!!!

30.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

    会执行

     1、不管有没有异常,finally中的代码都会执行

     2、当try、catch中有return时,finally中的代码依然会继续执行

     3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的

     4、如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

     5、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

31.get 和 post 请求有哪些区别?

    参考博客:https://blog.csdn.net/duan196_118/article/details/104155755

32.http 响应码 301 和 302 代表的是什么?有什么区别?

    它们都是Http状态码,代表着某个URL发生了改变。

    301代表永久重定向

    302代表暂时重定向

33.forward 和 redirect 的区别?

   forward:转发,是服务器内部行为,地址栏不会发生改变。request域可以共享。

   redirect:重定向,相当于两次http请求,服务器在响应第一次请求的时候,让浏览器再向另外一个URL发出请求。request域失效。

34.简述 tcp 和 udp的区别?

     1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。

    2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

    3. Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

    4. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

    5. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。

    6. TCP对系统资源要求较多,UDP对系统资源要求较少。

35. OSI 的七层模型都有哪些?

1. 应用层:网络服务与最终用户的一个接口。

2. 表示层:数据的表示、安全、压缩。

3. 会话层:建立、管理、终止会话。

4. 传输层:定义传输数据的协议端口号,以及流控和差错校验。

5. 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。

6. 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。

7. 物理层:建立、维护、断开物理连接。

36. tcp 为什么要三次握手,两次不行吗?为什么?

     为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。

  如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

37. 如何实现跨域?

      document.domain+iframe的设置(设置document.domain解决无法读取非同源网页的 Cookie问题)

      jsonp(不能成为真正的Ajax,本质上仍是动态创建script)

     跨域资源共享(CORS)

    nginx解决跨域...

可参考博客:https://blog.csdn.net/duan196_118/article/details/103840356

38.说一下 JSONP 实现原理?

     jsonp 即 json+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返货json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

39.说一下你熟悉的设计模式?

    单例模式,工厂模式,当然是挑选自己熟悉的设计模式进行阐述了,并不是越多越好哟,根据自己的情况作答。

40.简单工厂和抽象工厂有什么区别?

      简单工厂:是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例可以生产结构中的任意产品,不能增加新的产品

      抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族。

希望对看到的小伙伴们有帮助哟,如有不同意见,欢迎留言指正。望不吝赐教。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!